Java基础篇——深拷贝、浅拷贝与 BIO/NIO/AIO ——一次性搞懂对象复制与 Java I/O 模型
本文将从两个常见却常被混淆的主题入手:深拷贝 vs 浅拷贝、BIO/NIO/AIO 的区别,并结合实际类比,让你完全吃透这些概念。
📑 目录
-
深拷贝 vs 浅拷贝
1.1 什么是浅拷贝
1.2 什么是深拷贝
1.3 示例与内存图理解
1.4 如何选择深拷贝或浅拷贝 -
BIO / NIO / AIO 的区别
2.1 三者的核心概念
2.2 更形象的生活类比(点餐模型)
2.3 适用场景对比 -
总结
1. 深拷贝(Deep Copy)与浅拷贝(Shallow Copy)
简单来说,他们最本质的区别就是,是否会对内部的引用对象创建一个新的副本:浅拷贝——不创建,共用。 深拷贝——创建,不共用。
下面我们详细来看一下两者的区别:
1.1 浅拷贝(Shallow Copy)
只复制对象本身的基本类型字段,以及引用类型的“地址”。
也就是说:
-
新对象是新的
-
但引用类型字段(如 Address)指向与旧对象一样的子对象
结果:两个对象共享同一份内部引用对象
→ 修改其中一个,会影响另一个。
1.2 深拷贝(Deep Copy)
不仅复制当前对象,还会递归复制所有引用对象。
-
新对象是新的
-
内部引用对象(Address)也会重新创建一个副本
-
两者完全独立
结果:修改 user2 不会影响 user1
1.3 示例代码:User 与 Address
class User{
private String name;
private String password;
private Address address;
}
class Address{
private String province;
private String city;
private String area;
}
假设我们有:
User user1 = new User();
User user2 = copy(user1); // 深拷贝 or 浅拷贝
浅拷贝效果(共享引用)
user1.address → [Address对象A]
user2.address → [Address对象A]
深拷贝效果(独立引用)
user1.address → [Address对象A]
user2.address → [Address对象B] (新的)
什么时候用深拷贝?什么时候用浅拷贝?
使用 浅拷贝:
-
对象内部引用指向的内容不需要隔离
-
性能要求高(开销比深拷贝低)
使用 深拷贝:
-
对象中引用的字段非常敏感
-
你需要完全独立的两个对象
-
修改一个不希望影响另一个
2. BIO / NIO / AIO 的区别 ——点餐类比理解三种 I/O 模型
这三个是 Java 网络编程中的基础模型,经常听名字很抽象,但其实很好理解。
以下是一个非常经典,也非常容易记住的类比(你昨天听到的那个),我帮你扩展丰富一下细节。
2.1 BIO、NIO、AIO 的真正区别
| I/O 模型 | 特点 | 阻塞情况 | 线程需求 | 性能 |
|---|---|---|---|---|
| BIO | 阻塞 I/O | 线程调用 read/write 必须等待 | 一连接一线程 | 低 |
| NIO | 非阻塞 I/O | 轮询,不阻塞线程 | 少量线程管理大量连接 | 中高 |
| AIO | 异步 I/O | 完全异步,真正不等待 | 系统回调通知 | 最高 |
2.2 点餐模型类比(极易理解版)
BIO = 线性排队点餐(传统快餐店)
-
排队时不能干别的
-
前一个人卡住,后面全卡住
-
一个顾客对应一个服务员(线程)
完全阻塞,效率最低。
NIO = 海底捞等号叫号(非阻塞 I/O)
-
你点完单后去休息区坐着
-
服务员不再一直服务你(线程不会阻塞)
-
但本质上你还是要“等”
-
服务员会轮询是否有新的空位(Selector)
本质还是等待,只是等待方式从“排队”变成“轮询”。
AIO = 留电话吃饭(真正异步 I/O)
-
点完菜直接走
-
你可以干自己的事情
-
饭好了会打电话通知你
-
完全不需要你等待、轮询
不阻塞、不轮询,系统异步通知,效率最高。
2.3 适用场景总结
| 模型 | 适用场景 |
|---|---|
| BIO | 小应用、小并发、简单实现 |
| NIO | 高并发服务器、IM、大量连接但不一定有大量数据 |
| AIO | 超高并发、事件驱动、现代网络系统 |
3. 总结
-
浅拷贝复制引用地址 → 子对象共享
-
深拷贝递归复制所有对象 → 子对象独立
-
BIO / NIO / AIO 最大区别是等待方式和线程使用方式
-
点餐类比可以非常形象理解三者:
| BIO | NIO | AIO |
|---|---|---|
| 排队点餐 | 点完去等号 | 点完走人,饭好了通知 |
更多推荐
所有评论(0)