本文将从两个常见却常被混淆的主题入手:深拷贝 vs 浅拷贝BIO/NIO/AIO 的区别,并结合实际类比,让你完全吃透这些概念。


📑 目录

  1. 深拷贝 vs 浅拷贝
    1.1 什么是浅拷贝
    1.2 什么是深拷贝
    1.3 示例与内存图理解
    1.4 如何选择深拷贝或浅拷贝

  2. BIO / NIO / AIO 的区别
    2.1 三者的核心概念
    2.2 更形象的生活类比(点餐模型)
    2.3 适用场景对比

  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
排队点餐 点完去等号 点完走人,饭好了通知
Logo

Agent 垂直技术社区,欢迎活跃、内容共建。

更多推荐