Java基础核心全集(数据类型、拆箱装箱、克隆、对象结构、字符串、包装类、序列化)

约 5493 字

Java基础核心全集(数据类型、拆箱装箱、克隆、对象结构、字符串、包装类、序列化)

本文汇总Java面试最核心、最容易被问坑的基础考点:8大基本数据类型范围、拆箱装箱原理、深浅克隆、Java对象内存结构、String/包装类底层区别、序列化原理与避坑点,全覆盖零基础到进阶面试,可直接背诵。

一、Java八大基本数据类型(范围+占用字节+核心考点)

1. 基本属性汇总

数据类型字节位数取值范围默认值
byte18-128 ~ 1270
short216-32768 ~ 327670
int432-2^31 ~ 2^31-1(-2147483648 ~ 2147483647)0
long864-2^63 ~ 2^63-10L
float432±3.4E380.0f
double864±1.7E3080.0d
char2160 ~ 65535(无符号)\u0000
boolean1/4(JVM规范)-true / falsefalse

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. 深克隆两种实现方式

  1. 递归重写clone:逐层手动克隆引用属性
  2. 序列化深克隆:对象实现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、\u0000null
泛型支持不支持支持(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忽略字段,固定版本号保证兼容,反序列化不调构造方法