Java 编程中的不可变字符串

JavaJavaBeginner
立即练习

💡 本教程由 AI 辅助翻译自英文原版。如需查看原文,您可以 切换至英文原版

介绍

本实验将引导你了解在 Java 编程中使用不可变字符串(immutable Strings)的好处。你将学习为什么 Java 中的字符串是不可变的,以及它们如何提高应用程序的整体性能。通过本实验,你将掌握使用不可变字符串的重要性,并了解如何在程序中创建和使用它们。

创建 Java 文件

首先,在 ~/project 目录下创建一个名为 ImmutableString.java 的 Java 文件。该文件将包含本实验的代码。使用以下命令创建文件。

touch ImmutableString.java

创建字符串变量

在这一步中,创建一个字符串变量来存储你的名字。使用以下代码创建字符串。

String name = "MyName";

注意:在 Java 编程中,String 类是不可变的(immutable)。

创建字符串池

字符串池(String Pool)是堆内存中的一个内存区域,用于存储所有字符串并优化字符串使用的内存。在这一步中,通过将相同的值分配给多个变量来在字符串池中创建一些字符串。使用以下代码。

String str1 = "String";
String str2 = "String";

创建独立的字符串

在某些情况下,我们可能希望为字符串分配独立的空间。在这一步中,使用 new 关键字创建一个独立的字符串。使用以下代码。

String str3 = new String("String");

注意:创建独立的字符串比使用字符串池占用更多的内存。

确保字符串的安全性

字符串通常用于存储敏感信息,例如用户名、密码和 URL。通过使字符串不可变来确保其安全性。在这一步中,使用不可变的字符串来存储密码。使用以下代码。

final String password = "SecurePassword";

注意final 关键字使字符串不可变。在赋值后,任何人都无法更改字符串的值。

确保字符串的线程安全性

在 Java 中,不可变对象是线程安全的。多个线程可以同时访问字符串。在这一步中,创建一个方法,从多个线程访问不可变的字符串。

class ThreadSafe implements Runnable {
  public void run() {
    System.out.println("Thread Safe Immutable String: " + password);
  }
}

注意:上述代码创建了一个新的线程安全对象,并将 password 字符串设置为其值。该对象的 run 方法仅打印字符串的值。

哈希码缓存

字符串的不可变性使其非常适合用于集合中,尤其是使用哈希来存储对象的集合。在这一步中,使用不可变的字符串作为 HashMap 的键。使用以下代码。

HashMap<String, Integer> map = new HashMap<String, Integer>();

map.put(str1, 1);
map.put(str2, 2);

注意:由于 String 类是不可变的,字符串的哈希码保持不变。使用可变对象作为 HashMap 的键可能会导致不一致性,因为值在插入后可能会发生变化。

编译并运行 Java 文件

在这一步中,导航到 ~/project 目录,并使用以下命令编译 ImmutableString.java 文件。

javac ImmutableString.java

注意javac 命令会编译 Java 文件并生成一个 .class 文件。

使用以下命令运行 Java 程序。

java ImmutableString

程序的输出应为:

Thread Safe Immutable String: SecurePassword

修改变量引用

不可变的字符串无法被修改。在这一步中,尝试通过更新对象的引用来修改不可变字符串的值。使用以下代码更新字符串引用。

name = "NewName";

这段代码会抛出错误,因为 Java 中的字符串是不可变的。

总结

不可变字符串在 Java 编程中提供了许多优势。它们是线程安全的、安全的,并且优化了内存使用。通过在 Java 程序中使用不可变字符串,你可以减少错误的可能性,并创建更高效和安全的应用程序。

您可能感兴趣的其他 Java 教程