Go 语言学习(二)复合数据类型
摘要:本文是 Go 语言学习系列的第二篇,覆盖**第 2 章(复合数据类型)**的全部四种类型——数组(Array)、切片(Slice)、映射(Map)、结构体(Struct)。每种类型都从「是什么、怎么声明与初始化、底层语义(值类型还是引用类型)、怎么遍历、怎么当函数参数、有哪些常见陷阱」展开,配有可运行代码、对比表格、结构图示与速记钩子。读完你应能正确、地道地选用这四种类型,并看清它们彼此的关系。文末附核心速记、易错 Checklist 与自测题。 目录 2.1 数组(Array) 2.1.1 三条铁律 2.1.2 四种初始化 2.1.3 长度是类型的一部分 2.1.4 零值 2.1.5 下标与越界 2.1.6 值类型:整体复制 2.1.7 数组比较 2.1.8 指针数组 vs 数组指针 2.1.9 多维数组 2.1.10 遍历 2.1.11 作为函数参数 2.2 切片(Slice) 2.2.1 底层结构 2.2.2 三种创建方式 2.2.3 长度与容量 2.2.4 append 与扩容 2.2.5 共享底层数组的陷阱 2.2.6 遍历 2.2.7...
JVM学习笔记
内存结构 1.程序计数器作用:记录下一条指令的执行地址 特点: 线程私有 不会内存泄漏 2.Java虚拟机栈(存局部变量,方法参数)1.定义: 每个线程运行时需要的内存,称为虚拟机栈 每个栈由多个栈帧(Frame)组成,对应着每次方法调用时所占用的内存(参数、局部变量、返回地址) 每个线程只能有一个活动栈帧,对应着当前正在执行的那个方法。 2.问题辨析:1.垃圾回收是否涉及栈内存? 不会,也不需要。 2.栈内存分配越大越好吗? -Xss1024k 不一定,栈内存越大,线程数就越小。 3.方法内的局部变量是否线程安全? 需要判断变量是不是共享变量,私有变量是线程安全的。共享变量需要考虑线程安全问题。 局部变量是否逃离了方法的作用范围,通过返回值返回了引用地址,可能会被其他线程访问,也需要注意线程安全问题。 3.栈内存溢出 栈帧过多(如递归过深) 栈帧过大() 4.线程运行诊断1.线程占用cpu过高 定位 用top命令定位哪个进程对cpu的占用过高 ps H -eo pid,tid,%cpu | grep...
Java 并发编程(一)线程基础:创建、生命周期与常用方法
摘要:本文是 Java 并发编程系列的第一篇,覆盖**模块 1(基础层)**的全部内容——三种线程创建方式及其底层原理、线程六种生命周期状态与完整转换图、Thread 核心方法(sleep/wait/yield/join/interrupt/守护线程)的深度解析。每个知识点均配有可运行代码、原理拆解与面试速记,文末附总结。 目录 一、三种方式创建线程 1.1 继承 Thread 类 1.2 实现 Runnable 接口 1.3 实现 Callable 接口(带返回值) 1.4 三种方式的底层关系与选择指南 二、线程生命周期与状态(核心) 2.1 六种状态一览 2.2 状态转换全景图 2.3 每种状态的触发条件与代码演示 2.4 面试高频:BLOCKED vs WAITING vs TIMED_WAITING 三、核心方法深度解析 3.1 currentThread() 与线程基本信息 3.2 run() 与 start() 的本质区别 3.3 sleep() —— 抱着锁睡 3.4 wait() ——...
Java 并发编程(九)ThreadLocal 体系:隔离原理、跨线程传递与内存泄漏
摘要:ThreadLocal 是 Java 多线程面试的高频考点。本文从「线程隔离」的设计理念出发,深入剖析 ThreadLocalMap 数据结构、源码级 set/get/remove、线性探测解决哈希冲突,重点讲清弱引用 key 与强引用 value 的内存模型与设计动机、数据存储位置、一个线程存多个值的姿势、完整生命周期,以及内存泄漏的根因与最佳实践;并延伸至 InheritableThreadLocal 与 TransmittableThreadLocal 的跨线程传递,结尾以总结收束。每个章节均穿插面试口述与记忆钩子。 目录 一、作用与定位 二、线程隔离演示 三、注意事项 四、实现原理:数据结构 五、核心操作源码解析(set / get /...
Linux常用命令
此文章记录Linux常用命令,方便日后查阅使用。 命令格式 文件和目录操作 1.查看当前路径 2.列出目录内容 3.切换目录 4.创建目录 5.删除文件或目录 6.新建文件或更新文件时间戳:touch 7.移动文件:mv[原文件位置] [新文件位置] 8.复制文件 9.查看文件内容 11.打印字符串到屏幕 13.查询历史命令 系统监控相关命令 Shell相关命令1.Shell的基本概念 shell是一种广泛使用的交互式脚本语言,通常用于Unix类系统(如Linux、macOS等)运行用户在交互式环境下执行命令。 它有两种主要的客户端: Bash:现代、增强版的Shell,支持脚本编写。本文记录Bash下的命令 Sh:经典版本的Shell,功能相对基础。 用命令echo -$SHELL查询当前所用的Shell客户端,在大多数Linux发行版中,使用的都是Bash。 创建.sh后缀名的文件(例如叫demo.sh),然后用命令bash...
消息队列学习记录
RabbitMQ如何保证消息的可靠性?从3个层面上考虑,包括生产端,Broker端,消费端。 生产端 使用消息确认机制ack 生产者端在发生消息后可以注册一个回调函数,用于监听消息是否成功送达Broker。 如果消息成功写入队列,RabbMQ会返回一个ack; 如果失败(如队列不存在、交换机不可达),会返回nack。 Broker端 1.持久化 对象 属性 说明 Queue durable=true 队列在服务器重启后仍存在 Exchange durable=true 交换机持久化 Message deliveryMode=2 消息持久化(1=非持久化,2=持久化) 注意:即使设置了持久化,也只能防止 服务器宕机 的消息丢失,不能防止 未被消费就删除...
八股_java集合
...
八股_java基础
概念1.说说java的特点面向对象 平台无关性:一次编译到处运行 内存管理:自动管理内存和回收不再使用的对象 2.java的优势和劣势是什么?优势: 跨平台,一次编译到处运行 生态丰富,有各种框架和类库 内存管理,垃圾自动回收 严格的面向对象,复用性和可维护性优秀 天然支持多线程,方便并发编程 安全性方面:java有安全模型,比如支持沙箱机制,适合网络编程 稳定性方面:企业级应用长期使用,版本更新比较注重向后兼容 劣势 内存占用大,jvm本身也占用内存 性能开销较c++,Rust大 执行效率较慢,比如微服务启动时间比go慢 语法繁琐,开发效率比较低 3.Java为什么是跨平台的?因为java运行在jvm上,jvm会将编译后的class文件根据平台的不同翻译成不同平台对应操作系统的机器码。 因此不同平台需要安装各自版本的jvm才能运行java程序。 4.JVM,JDK,JRE三者的关系jdk包括jre,jre包括jvm。 5.为什么java解释和编译都有?Java 同时采用 解释执行 和 编译执行(JIT 编译)的结合方式,主要是为了在 启动速度 和...
苍穹外卖复盘(待完善)
JWT简介JWT,全称json web tokens, 用于对应用程序上的用户进行身份认证。 JWT的结构JWT由三部分组成,用 . 分隔。像这样 Header.Payload.Signature Header:是一个json对象,标识这个令牌(token)的类型(type)和签名的算法,算法默认是HMAC SHA256(写成HS256),例如: 1234{ "typ":"JWT", "alg":"HS256"} 最后,将上面的 JSON 对象使用 Base64URL 算法(详见后文)转成字符串。 Payload:也是一个json对象,用于存放实际需要传递的数据。JWT提供了7个官方字段供选用。 iss(issuer):签发人 exp(expiration time):过期时间 sub(subject):主题 aud(audience):受众 nbf(Not Before) : 生效时间 iat(Issued At) : 签发时间 jti(JWT ID) :...
设计模式
面向对象设计原则 单一职责原则(SRP)一个类应该仅有一个引起它变化的原因。(职责划分明确,避免类承担过多功能导致高耦合) 开闭原则(OCP)软件实体(类、模块、函数等)应该对扩展开放,对修改关闭。(通过抽象和多态实现功能扩展,而非直接修改原有代码) 里氏替换原则(LSP)所有引用基类的地方必须能透明地使用其子类的对象。(子类必须能够完全替代父类,不破坏原有功能逻辑) 依赖倒转原则(DIP)高层模块不应该依赖低层模块,两者都应该依赖抽象;抽象不应该依赖细节,细节应该依赖抽象。(通过接口 / 抽象类解耦实现类,降低模块间直接依赖) 接口隔离原则(ISP)客户端不应该依赖它不需要的接口;一个类对另一个类的依赖应该建立在最小的接口上。(细化接口设计,避免胖接口导致的强制实现冗余方法) 合成复用原则(CRP)尽量使用对象组合 /...




