Java教程-Java 中的不可变字符串

String类型是在编写任何应用程序时都无法避免的变量类型之一。字符串引用用于存储各种属性,例如用户名、密码等。在Java中,字符串对象是不可变的。不可变意味着它们的数据或状态一旦被创建就无法更改,任何修改操作都会创建一个新的字符串对象。
让我们通过以下示例来理解字符串的不可变性概念:
测试immutablestring.java
class Testimmutablestring{
public static void main(String args[]){
String s="Sachin";
s.concat(" Tendulkar");//concat() 方法在末尾追加字符串
System.out.println(s);//将打印 Sachin,因为字符串是不可变对象
}
}
输出:
Sachin
现在可以通过下面给出的图表来理解。此处 Sachin 没有更改,但使用 Sachin Tendulkar 创建了一个新对象。这就是为什么 String 被称为不可变的原因。
正如您在上图中看到的那样,创建了两个对象,但*s*引用变量仍然引用“Sachin”而不是“Sachin Tendulkar”。
但是如果我们明确地将它赋值给引用变量,它就会引用“Sachin Tendulkar”对象。
例如:
测试immutablestring1.java
class Testimmutablestring1{
public static void main(String args[]){
String s="Sachin";
s=s.concat(" Tendulkar");
System.out.println(s);
}
}
输出:
Sachin Tendulkar
在这种情况下,s 指向“Sachin Tendulkar”。请注意,仍然没有修改 Sachin 对象。
为什么 String 对象在 Java 中是不可变的?
在 Java 中,String 是一个基础的类,用于存储文本字符串。为了确保安全性和效率,Java 设计人员将 String 对象定义为不可变的。这意味着一旦创建了 String 对象,它的值就不能被修改。
一个 String 对象的不可变性有以下几个方面:
1.类加载器:
Java 中的 ClassLoader 使用 String 类型的参数来加载类。如果 String 对象是可变的,那么由此产生的错误将会非常难以排查。为了避免这种问题,String 对象被设计成不可变的。
2. 线程安全:
由于 String 对象是不可变的,所以多个线程可以安全地访问同一个 String 对象,而无需进行同步。
3. 安全:
由于 String 对象是不可变的,所以它们可以被用来安全地存储密码和其他敏感信息,而不必担心这些信息会被修改。
4.堆空间:
由于 String 对象是不可变的,所以它们可以被有效地存储在堆空间中。在创建新的 String 对象时,JVM 可以检查是否已经存在具有相同值的对象,从而避免重复创建对象。
为什么 String 类在 Java 中是 Final?
在 Java 中,一个类可以被定义为 final 类型,这意味着它不能被继承。String 类被定义为 final 类型,这是因为它的实现已经足够优秀,不需要被修改或扩展。这也有助于确保 String 对象的不可变性。如果 String 类不是 final 类型,那么它的方法可能会被子类覆盖,从而导致不可变性的破坏。