深入理解Java中的不可变对象
发布日期:2021-04-30 21:10:57 浏览次数:89 分类:精选文章

本文共 1608 字,大约阅读时间需要 5 分钟。

为什么String是不可变对象?

在Java中,String被设计为不可变对象,这一设计带来了诸多好处,尤其是在多线程环境下。以下是详细解释:

  • 线程安全

    • 由于String不可变,每次对其进行修改操作(如trim、substring、toLowerCase等)都返回一个新的String对象,而不会修改原有对象。这样可以避免线程竞态条件,确保在多线程环境下程序的安全性。
  • 内存优化

    • Java使用常量池存储已存在的String对象。当多次使用同一个字符串时,系统会直接引用常量池中的对象,避免了内存浪费。这种机制提升了程序的运行效率。
  • 哈希表性能

    • 不可变性确保了String的哈希值在多次计算时保持不变,这对使用String作为哈希表键(如HashMap或HashSet)尤为重要,提高了哈希操作的效率。
  • 简化同步逻辑

    • 不可变对象无需额外同步措施,因为它不会被修改,各线程操作不同的对象,避免了竞争和死锁问题。
  • 自定义不可变类的步骤

  • 确保类为final:防止继承,确保不会有子类修改状态。
  • 所有字段为final:只能在构造方法中初始化,无法后续修改。
  • 无 setter方法:防止外部修改,确保状态不可变。
  • 返回新对象:在需要修改状态时,返回新的对象实例,而不是修改原有对象。
  • 示例: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中的应用非常广泛,尤其是在多线程环境下,它们提供了线程安全、内存效率和简化的同步优势。通过理解这些优点和设计原则,我们可以更好地利用不可变类来编写高效、安全的代码。

    上一篇:害死人的自动递增,不偿命的自动递减
    下一篇:在csdn中如何查看自己关注的人(2021年)

    发表评论

    最新留言

    路过按个爪印,很不错,赞一个!
    [***.219.124.196]2026年05月30日 02时02分55秒