这是最受欢迎的面试问题之一。在本博客中,我们将讨论它并帮助您找到答案。String 是任何应用程序中最常用的类之一。为了存储用户名、密码、地址、IP 地址等,我们需要创建 String 对象。因此,有必要了解为什么我们最著名和最常用的类是不可变的。
首先,让我们看看不可变是什么意思:
不可变的含义
“不改变或无法改变”
在面向对象的世界中,不可变对象意味着一旦对象的构造函数完成执行,该实例就无法更改。
在 Java 和 C# 等语言中,String 对象是不可变的。
为什么字符串是不可变的?
在 Java 中,String 是一个 final 且不可变的类,这使得它最特别。它不能被继承,一旦创建,我们就不能改变对象。字符串对象是任何程序中最常用的对象之一。
让我们谈谈 String 的一些特性,以及帮助我们理解 String 不可变的原因:
类加载器
String 用作类加载的参数。让我们想象一下如果 String 是可变的会发生什么。在这种情况下,可以更改对象的值并加载错误的类。
不变性提供了安全性,以便类加载器加载正确的类。例如,我们想加载 com.generic.class.PasswordChecker 类来验证用户密码,但也许可以将引用的值更改为 com.hacked.PasswordChacker.
线程安全
不变性隐含地使 String 线程安全。单个 String 实例可以跨线程共享。我们不必为了线程安全而使用同步。
安全
在类加载中,我们已经看到字符串不变性如何帮助加载正确的类并提供安全性。还有其他示例,字符串不变性有助于获得安全性。
例如,在银行应用程序中,用户名、密码、银行帐户详细信息等作为字符串传递。由于 String 是不可变的,它的值不能改变。否则,任何黑客都可能更改引用的值而导致安全问题。
HashMap 键的完美候选者
字符串主要用作 HashMap 键的对象。由于String是不可变的,它的hashcode在创建时就被缓存了,不需要再次计算。这使它成为 a 中键的绝佳候选者 Map,并且它的处理速度比其他 HashMap 键对象快。
堆空间
字符串不变性有助于节省大量 Java 堆空间,因为不同的字符串变量可以引用池中的同一个字符串对象。当 Java 代码看到两个对象具有相同的值(a=”Generic Class”, and b=”Generic Class”)时,您只需要一个 String 对象。