深入理解Java中的不可变对象
确保类为final:防止继承,确保不会有子类修改状态。 所有字段为final:只能在构造方法中初始化,无法后续修改。 无 setter方法:防止外部修改,确保状态不可变。 返回新对象:在需要修改状态时,返回新的对象实例,而不是修改原有对象。
发布日期:2021-04-30 21:10:57
浏览次数:89
分类:精选文章
本文共 1608 字,大约阅读时间需要 5 分钟。
为什么String是不可变对象?
在Java中,String被设计为不可变对象,这一设计带来了诸多好处,尤其是在多线程环境下。以下是详细解释:
线程安全:
- 由于String不可变,每次对其进行修改操作(如trim、substring、toLowerCase等)都返回一个新的String对象,而不会修改原有对象。这样可以避免线程竞态条件,确保在多线程环境下程序的安全性。
内存优化:
- Java使用常量池存储已存在的String对象。当多次使用同一个字符串时,系统会直接引用常量池中的对象,避免了内存浪费。这种机制提升了程序的运行效率。
哈希表性能:
- 不可变性确保了String的哈希值在多次计算时保持不变,这对使用String作为哈希表键(如HashMap或HashSet)尤为重要,提高了哈希操作的效率。
简化同步逻辑:
- 不可变对象无需额外同步措施,因为它不会被修改,各线程操作不同的对象,避免了竞争和死锁问题。
自定义不可变类的步骤:
示例:Writer类
public final class Writer { private final String name; private final int age; private final Book book; public Writer(String name, int age, Book book) { this.name = name; this.age = age; this.book = book; } public String getName() { return name; } public int getAge() { return age; } public Book getBook() { // 返回一个Book的副本 Book clone = new Book(); clone.setName(this.book.getName()); clone.setPrice(this.book.getPrice()); return clone; }} 应用示例:
public class WriterDemo { public static void main(String[] args) { Book book = new Book(); book.setName("Web全栈开发进阶之路"); book.setPrice(79); Writer writer = new Writer("沉默王二", 18, book); System.out.println("定价:" + writer.getBook()); // 由于getBook返回的是Book副本,修改不会影响原有Writer实例 writer.getBook().setPrice(59); System.out.println("促销价:" + writer.getBook()); }} 总结:
不可变类在Java中的应用非常广泛,尤其是在多线程环境下,它们提供了线程安全、内存效率和简化的同步优势。通过理解这些优点和设计原则,我们可以更好地利用不可变类来编写高效、安全的代码。
发表评论
最新留言
路过按个爪印,很不错,赞一个!
[***.219.124.196]2026年05月30日 02时02分55秒
关于作者
喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!
推荐文章
php页面增加自选项,php-在Woocommerce中添加新的自定义默认订购目录选项
2023-03-02
php页面静态化技术;学习笔记
2023-03-02
php项目心得以及总结
2023-03-02
R&Python Data Science 系列:数据处理(4)长宽格式数据转换
2023-03-02
PHP项目集成支付宝PC端扫码支付API(国内支付)
2023-03-02
php预定义常量&变量
2023-03-02
R 集成算法③ 随机森林
2023-03-02
php验证码背景色设置无效
2023-03-02
php验证邮箱是否有效
2023-03-02
PHP高性能分布式应用服务器框架-SwooleDistributed
2023-03-02
PHP高效、轻量级表格数据处理库 OpenSpout
2023-03-02
R 数据缺失的处理
2023-03-02
php,nginx重启
2023-03-02
php:$_ENV 和 getenv区别
2023-03-02
PHP:PDOStatement::bindValue参数类型php5和php7问题
2023-03-02
Q媒体播放器.如何播放具有多个音频的视频?
2023-03-02
pickle
2023-03-02
Pickle thread.lock(Pymongo)
2023-03-02
pickle模块
2023-03-02