# 为什么是不可变对象

immutable是一种约定, 设计师将String设计为immutable是为了给程序带来更多的便利

# String是如何设计的

# 成员变量皆为final修饰

不给修改成员变量的机会

# 所有方法的设计都规避暴露成员变量的可能

这是设计实现上做到

# 类定义为final

因为约定为immutable, 因此为了避免他人打破约定, 直接将类定义为final. 否则, 假设你继承String实现一个StringChild, 重写其中某一个方法, 在之后调用此方法传入StringChild时, 则会打破这种约定.

# immutable的设计规则

  1. 不要提供任何会修改对象状态的方法
  2. 保证类不会被扩展
  3. 使所有的域都是final
  4. 使所有的域都成为私有的
  5. 确保对于任何可变组件的互斥访问

# String类设计为不可变的好处

# 线程安全

在原子性上, String是安全的, 但在使用上, 还得注意可见性, 因此绝对说线程安全也是不对的, 还需要保证其可见性

# 效率

设计成final,jvm才不用对相关方法在虚函数表中查询,而是直接定位到String类的相关方法上,提高执行效率

# 字符串常量池是什么

字符串常量池是方法区(Method Area)中一个特殊的存储区域, String被创建时, 如果值存在于String pool中, 则直接取出, 而不用创建新对象. 在应用程序大量使用String的情况下, 可以节省内存空间, 提高效率.

# immutable的优点和缺点

# 优点

  1. 不可变类对象比较简单。不可变对象可以只有一种状态,即被创建时的状态
  2. 不可变对象本质上是线程安全的,它们不要求同步。当多个线程并发访问这样的对象时,它们不会遭到破坏。实际上,没有任何线程会注意到其他线程对于不可变对象的影响。所以,不可变对象可以被自由地分配。“不可变对象可以被自由地分配”导致的结果是:永远不需要进行保护性拷贝
  3. 不仅可以共享不可变对象,甚至也可以共享它们的内部信息
  4. 不可变对象为其他对象提供了大量的构件。如果知道一个复杂对象内部的组件不会改变,要维护它的不变性约束是比较容易的。

# 缺点

对于每个不同的值都需要一个单独的对象。创建这种对象的代价很高。

# Java还有哪些immutable类

# 所有的包装类

# BigInteger,BigDecimal

# 关于Immutable的注意事项

# 可以通过反射机制改变成员变量的值

# 参考地址

  1. Why String is immutable in Java? (opens new window)
  2. 知乎回答 (opens new window)
  3. String类不可变以及不可变类总结 (opens new window)
修改于: 8/11/2022, 3:17:56 PM