Java基础核心全集(数据类型、拆箱装箱、克隆、对象结构、字符串、包装类、序列化)
本文汇总Java面试最核心、最容易被问坑的基础考点:8大基本数据类型范围、拆箱装箱原理、深浅克隆、Java对象内存结构、String/包装类底层区别、序列化原理与避坑点,全覆盖零基础到进阶面试,可直接背诵。
一、Java八大基本数据类型(范围+占用字节+核心考点)
1. 基本属性汇总
| 数据类型 | 字节 | 位数 | 取值范围 | 默认值 |
|---|---|---|---|---|
| byte | 1 | 8 | -128 ~ 127 | 0 |
| short | 2 | 16 | -32768 ~ 32767 | 0 |
| int | 4 | 32 | -2^31 ~ 2^31-1(-2147483648 ~ 2147483647) | 0 |
| long | 8 | 64 | -2^63 ~ 2^63-1 | 0L |
| float | 4 | 32 | ±3.4E38 | 0.0f |
| double | 8 | 64 | ±1.7E308 | 0.0d |
| char | 2 | 16 | 0 ~ 65535(无符号) | \u0000 |
| boolean | 1/4(JVM规范) | - | true / false | false |
2. 核心坑点
- char是无符号类型,没有负数范围
- byte最小值-128没有对应的正数,是补码存储特性导致
- 浮点类型float/double 存在精度丢失,禁止用于金额计算,金额必须用BigDecimal
- 基本类型存栈内存,速度快、无GC;引用类型存堆内存
二、拆箱与装箱原理(自动装箱/拆箱)
1. 定义
- 装箱:基本类型 → 包装类型(自动封装为对象)
- 拆箱:包装类型 → 基本类型(取出基础数值)
2. 底层原理(JDK自动语法糖)
编译期自动替换代码,运行无差别:
- 自动装箱:
Integer a = 10→ 编译为Integer a = Integer.valueOf(10) - 自动拆箱:
int b = a→ 编译为int b = a.intValue()
3. 包装类缓存机制(面试超级大坑)
Integer、Short、Byte、Long、Char 存在常量缓存池
- Integer 缓存范围:-128 ~ 127
- 范围内数值:复用缓存对象,
==为true - 超出范围:新建对象,
==为false
4. 经典面试题
Integer a1 = 100;
Integer a2 = 100;
System.out.println(a1 == a2); // true(缓存复用)
Integer b1 = 200;
Integer b2 = 200;
System.out.println(b1 == b2); // false(超出缓存,两个新对象)
5. 避坑点
- 包装类比较数值必须用equals,禁止==
- 自动装箱拆箱频繁转换会产生大量临时对象,引发GC
- 包装类可存null,基本类型不行,空指针异常高发
三、Java克隆机制(浅克隆、深克隆)
1. 克隆前提
对象实现 Cloneable 接口,重写 clone() 方法
2. 浅克隆(默认clone)
基本类型值拷贝,引用类型只拷贝地址
- 创建新对象
- 基本字段:值复制
- 引用字段:只复制引用地址,新旧对象共享同一个引用对象
- 弊端:修改引用属性,新旧对象互相影响
3. 深克隆
完全独立拷贝,所有层级对象全部新建
- 基本类型:值拷贝
- 引用类型:递归克隆/新建对象,不共享内存
- 新旧对象完全独立,互不影响
4. 深克隆两种实现方式
- 递归重写clone:逐层手动克隆引用属性
- 序列化深克隆:对象实现Serializable,序列化再反序列化得到全新对象(开发最常用)
5. 总结口诀
浅克隆拷地址、深克隆拷内容
四、Java对象内存结构(JDK1.8)
一个Java对象在堆中由三部分组成:对象头、实例数据、对齐填充
1. 对象头(核心)
MarkWord(标记字):8字节(64位)
- 哈希码、GC分代年龄、锁状态标志、偏向线程ID
- 实现synchronized偏向锁、轻量级锁、重量级锁核心
- Class指针:4字节(指向元空间Class对象)
2. 实例数据
对象所有成员变量:基本类型+引用类型,按顺序内存排布
3. 对齐填充
JVM规定:对象大小必须是8字节的整数倍,不够则补位填充,提升读取效率
4. 无对象实例(空对象)大小
空对象:16字节(对象头12 + 填充4)
五、String、基本类型、包装类 核心区别
1. 基本类型 vs 包装类
| 维度 | 基本类型 | 包装类 |
|---|---|---|
| 类型 | 基本值类型 | 引用对象类型 |
| 存储位置 | 栈 | 堆 |
| 默认值 | 0、false、\u0000 | null |
| 泛型支持 | 不支持 | 支持(List<Integer>) |
| 空值 | 无null | 可null,易空指针 |
2. String 特殊性
- String是final不可变类,字符数组不可修改
- 存在字符串常量池,复用字符串对象,节省内存
- String赋值修改本质是新建字符串,原对象不变
- JDK1.8 底层 char[] → JDK1.9+ 改为 byte[],节省内存
3. String、StringBuilder、StringBuffer区别
- String:不可变,拼接产生新对象,效率低
- StringBuffer:可变、线程安全(sync)、效率低
- StringBuilder:可变、非线程安全、效率最高(生产首选)
六、Java序列化原理(Serializable)
1. 序列化定义
序列化:Java对象 → 二进制字节流(网络传输、持久化存储)
反序列化:二进制字节流 → 还原Java对象
2. 使用条件
对象必须实现 Serializable 标记接口(无方法,仅做标识)
3. 核心关键字:transient
被transient修饰的字段不会被序列化
- 用于临时字段、敏感数据(密码)、不需要传输的字段
- 静态变量属于类,不属于对象,也不会被序列化
4. serialVersionUID 版本号(重要)
序列化版本一致性校验字段
- 不手动声明:JDK自动生成,类结构修改后版本号变更
- 类结构微调后,反序列化版本号不匹配,直接报错
- 生产必须手动固定serialVersionUID,保证版本兼容
5. 序列化特点与坑点
- 序列化保存的是对象状态,不保存方法
- 父类实现序列化,子类自动序列化;子类序列化父类无实现,父类字段丢失
- 反序列化不会执行构造方法,直接生成对象
- 存在反序列化漏洞,高危场景禁止使用JDK原生序列化
6. 常用替代方案(生产)
替代JDK序列化:JSON、Protobuf、Hessian,更安全、跨语言、体积更小
七、Java四大引用机制(面试高频核心)
Java根据垃圾回收优先级、存活规则,将对象引用分为四种:强引用、软引用、弱引用、虚引用。核心作用是灵活控制对象GC回收时机,优化内存使用、解决内存泄漏、实现缓存降级。
1. 强引用(StrongReference)—— 默认引用
核心定义
日常代码中最普通的对象引用,只要强引用存在,GC永远不会回收对象。
核心特性
- 默认引用方式:
Object obj = new Object() - GC 宁可OOM也不回收强引用对象
- 对象常驻内存,直至引用断开(置为null)
内存泄漏坑点
集合、静态变量、全局缓存持有强引用,会导致对象无法被GC回收,造成内存泄漏。
回收条件
手动置空 obj = null&& 无任何强引用指向对象,下次GC触发回收。
2. 软引用(SoftReference)—— 内存敏感缓存
核心定义
内存充足不回收,内存溢出前必回收,专为内存缓存设计。
核心特性
- JDK提供
SoftReference实现 - 系统内存充足:对象正常存活,不回收
- 系统内存不足、即将OOM:优先回收所有软引用对象
适用场景
二级缓存、图片缓存、本地临时缓存,内存够就用,内存不够自动释放,完美规避缓存导致的OOM。
3. 弱引用(WeakReference)—— 单次GC即回收
核心定义
只要触发GC,无论内存是否充足,一律回收,生命周期最短。
核心特性
- JDK提供
WeakReference实现 - 不阻碍对象GC,只要GC线程运行,弱引用对象直接被清理
- 天生用于解决内存泄漏
经典场景
- WeakHashMap:线程本地缓存、临时映射,key无强引用自动淘汰
- Handler 内存泄漏解决方案(Activity使用弱引用持有)
- 缓存无关紧要的临时数据
4. 虚引用(PhantomReference)—— 回收监控
核心定义
最弱的引用,形同虚设,无法通过引用获取对象,仅用于监听对象回收状态。
核心特性
- JDK提供
PhantomReference,必须配合ReferenceQueue(引用队列)使用 - 没有get方法,无法获取对象实例
- 对象即将被GC回收时,虚引用会被放入队列,用于后置清理
适用场景
堆外内存回收、资源释放、GC监控、后置清理(NIO、Netty堆外内存清理核心原理)。
5. 四大引用GC规则优先级(必背)
回收优先级从高到低:虚引用 > 弱引用 > 软引用 > 强引用
- 虚引用:GC必回收,仅做监控
- 弱引用:一次GC就回收
- 软引用:内存不足才回收
- 强引用:永不回收(除非引用断开)
6. 面试高频对比总结
- 强引用:默认规则,常驻内存,易内存泄漏
- 软引用:内存够留存、不够回收,做缓存
- 弱引用:遇GC就回收,防泄漏、临时缓存
- 虚引用:不获取对象,只监听回收、清理资源
八、全文面试极简背诵总结
- 数据类型:8大基本类型,char无符号,浮点精度丢失不用做金额计算
- 拆箱装箱:语法糖,底层valueOf/xxxValue,Integer缓存-128~127,比较必须用equals
- 克隆:浅克隆拷地址、深克隆拷内容,序列化可实现深克隆
- 对象结构:对象头+实例数据+对齐填充,MarkWord存储锁与GC信息
- 字符串包装类:包装类是对象可null,String不可变,常量池复用,拼接优先用StringBuilder
- 序列化:实现Serializable,transient忽略字段,固定版本号保证兼容,反序列化不调构造方法
- 四大引用:强引用常驻、软引用内存不足回收、弱引用遇GC即回收、虚引用仅监控回收
- 数据类型:8大基本类型,char无符号,浮点精度丢失不用做金额计算
- 拆箱装箱:语法糖,底层valueOf/xxxValue,Integer缓存-128~127,比较必须用equals
- 克隆:浅克隆拷地址、深克隆拷内容,序列化可实现深克隆
- 对象结构:对象头+实例数据+对齐填充,MarkWord存储锁与GC信息
- 字符串包装类:包装类是对象可null,String不可变,常量池复用,拼接优先用StringBuilder
- 序列化:实现Serializable,transient忽略字段,固定版本号保证兼容,反序列化不调构造方法