java类型转换分基本类型(自动提升/强制转换)和引用类型(向上转型自动、向下转型需instanceof检查),内存分栈(存局部变量)、堆(存new对象)、方法区(存类信息);包装类有缓存陷阱,对象创建涉及tlab分配与初始化。

Java 中的类型转换和内存分配是理解程序行为的关键。掌握它们,能帮你避开常见坑,写出更健壮、高效的代码。
基本类型与引用类型的转换规则
Java 的类型转换分隐式(自动)和显式(强制)两种,但仅适用于有继承或实现关系的类型之间,或兼容的基本类型之间。
- 基本类型间可自动提升:比如 int 赋值给 long、float 或 double 不需要强转;但反过来必须显式转换,否则编译失败
- 引用类型向上转型(子类 → 父类)是安全的,自动完成;向下转型(父类 → 子类)必须强转,且运行时会检查实际类型,不匹配抛 ClassCastException
- 字符串与其他类型互转不能靠类型转换符:比如 String 转 int 要用 Integer.parseInt(),而 int 转 String 推荐用 String.valueOf() 或字符串拼接
堆、栈、方法区各自管什么
Java 内存模型不是抽象概念,它直接决定变量生命周期、线程可见性和 GC 行为。
Java项目代码review工具。分析Git变更+完整调用链路上下文,推断业务需求,进行多维度评分和分类汇总,生成完整PRD文档。包含细粒度Java代码审查清单(Null安全、异常处理、Streams、并发、equals/hashCode、资源管理、API设计、性能、MyBatis/ORM、事务边界、SQL/DD...
- 栈(Stack):每个线程独有,存放局部变量(含基本类型值和对象引用)、方法调用帧。方法结束,栈帧弹出,变量自动失效
- 堆(Heap):所有线程共享,new 出来的对象、数组都存在这里。GC 主要管理区域,对象是否被回收取决于是否可达
- 方法区(Method Area):存储类信息、常量池、静态变量、JIT 编译后代码。JDK 8 后由元空间(Metaspace)实现,使用本地内存,不再受 -XX:MaxPermSize 限制
包装类缓存与自动装箱的陷阱
Integer、Long 等包装类做了缓存优化,但只对小范围值生效,忽视这点容易引发逻辑错误。
- Integer 在 -128 到 127 之间会复用缓存对象,所以 Integer a = 100, b = 100; a == b 为 true;但 a = 200; b = 200; 时结果为 false
- 比较包装类值推荐用 equals(),避免因缓存机制导致的误判;基本类型比较才用 ==
- 频繁装箱(如循环中 list.add(i))会创建大量临时对象,影响性能,必要时用原始类型集合(如 Eclipse Collections 或 Trove)
对象创建与内存分配的实际路径
一个 new 对象的过程远不止“分配内存”那么简单,涉及线程本地分配缓冲(TLAB)、初始化零值、设置对象头、执行构造方法等多个步骤。
- 大多数对象优先在 Eden 区分配;大对象(如长数组)可能直接进老年代(取决于 JVM 参数)
- 对象创建后,引用存在栈上或其它对象字段中,而对象本体在堆上;若引用丢失且无其他路径可达,就成 GC 候选
- 构造方法执行前,对象内存已分配并清零(即 int 字段默认为 0,引用字段为 null),再调用父类构造器,最后执行当前类构造逻辑
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










