Java基础面试题, 什么是 Java 中的不可变类?
Java基础面试题, 什么是 Java 中的不可变类?
QA
Step 1
Q:: 什么是Java中的不可变类?
A:: 不可变类是指一旦创建后,其对象的状态就不能再修改的类。在Java中,典型的不可变类是String
类。要创建不可变类,需要遵循以下几个原则:1. 将类声明为final,这样不能被继承;2. 将所有的字段设为私有(private)和最终(final);3. 不提供任何可以修改对象状态的方法;4.
如果类中包含可变对象,确保这些对象在对象构造时被彻底复制,或者只返回它们的不可变副本。
Step 2
Q:: 如何创建一个不可变类?
A:: 创建不可变类时,需要遵循以下步骤:1. 将类声明为final,防止其子类化;2. 将所有成员变量设为私有和final;3. 在构造函数中设置所有成员变量的值,并确保不再提供修改它们的方法;4. 不要提供setter方法;5.
如果类包含可变对象,确保在对象构造时进行深拷贝,并且返回这些对象的副本而非引用。
Step 3
Q:: 不可变类有哪些优势?
A:: 不可变类的优势包括:1. 线程安全:不可变对象天然是线程安全的,无需同步;2. 缓存与重用:不可变对象可以被缓存和重用,减少内存开销;3. 缓存键:不可变对象非常适合作为缓存键,避免了在缓存过程中键被修改的问题;4.
防止未授权的修改:不可变类可以防止其状态被不慎或恶意修改。
Step 4
Q:: Java中的String
为什么是不可变的?
A:: String
类是不可变的,这意味着一旦创建了String
对象,其内容无法更改。String
类被设计为不可变的原因包括:1. 提高性能,字符串池允许重用相同的字符串字面值;2. 安全性,字符串经常被用于类加载器和反射操作中,不可变性确保了字符串不会被恶意修改;3.
线程安全,不可变对象可以被多个线程安全地共享。
Step 5
Q:: 为什么String
类是final的?
A:: String
类是final的,这意味着它不能被继承。这是为了确保String
类的不可变性和安全性,如果允许继承,子类可能会破坏这些特性。