字符串:为什么它是不可变的

这是最受欢迎的面试问题之一。在本博客中,我们将讨论它并帮助您找到答案。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 对象。

字符串:为什么它是不可变的

发表评论

您的电子邮箱地址不会被公开。 必填项已用*标注