面试鸭 Java 后端面试题, 为什么 Java 中的 String 类被设计为 final?
面试鸭 Java 后端面试题, 为什么 Java 中的 String 类被设计为 final?
QA
Step 1
Q:: 为什么 Java 中的 String 类被设计为 final?
A:: Java 中的 String 类被设计为 final 是为了确保字符串的不可变性(immutable)。不可变对象在多线程环境下是线程安全的,因为其状态不能被修改。这简化了代码,避免了许多潜在的同步问题。同时,String 被广泛用作哈希表的键,若其值在使用过程中能被修改,会导致不可预测的行为和安全漏洞。不可变性还允许字符串池(string pool)的使用,提高了内存利用率和性能。
Step 2
Q:: Java 中的不可变对象有哪些?
A:: 除了 String 类,Java 中还有许多不可变类,例如 Integer、Long、Float、Double、BigInteger 和 BigDecimal。这些类的实例在创建后其状态不能被修改。不可变对象在多线程编程中非常有用,因为它们天然是线程安全的。
Step 3
Q:: 如何创建一个不可变类?
A:: 要创建一个不可变类,应遵循以下几个原则:1) 使用 final 声明类;2) 所有字段使用 final 声明;3) 在构造函数中初始化所有字段;4) 不提供修改字段的方法;5)
确保类中的所有可变对象字段也是不可变的,或者在访问这些字段时提供保护性拷贝。
Step 4
Q:: String 类的内部结构是什么样的?
A:: String 类内部使用一个字符数组(char[])来存储字符串数据。在 Java 9 之前,String 使用的是 char 数组,而在 Java 9
及以后版本,String 改用 byte 数组以减少内存占用。String 类还有一个 hash 字段用于缓存字符串的哈希码,以提高哈希操作的性能。
Step 5
Q:: 什么是字符串池?
A:: 字符串池(string pool)是 Java 中的一个特殊内存区域,用于存储字符串字面量和通过 intern()
方法显式创建的字符串。字符串池的存在是为了节省内存,因为相同的字符串字面量在池中只会存储一次。字符串池由 JVM 自动管理,字符串的不可变性使得池中的字符串可以安全地被多个引用共享。