Java 中 String 不可变或 final 的原因?2025年3月27日 | 阅读 4 分钟 在面向对象编程中,不可变字符串或对象一旦创建就不能被修改。但我们只能改变对象的引用。我们限制改变对象本身。String 在 Java 中之所以不可变,是因为安全性、同步和并发、缓存以及类加载。这种不可变性是通过将字符串声明为 final 来实现的,确保一旦创建,它们就不能被修改。使 String final 的原因是为了破坏可变性,并且不让其他人继承它。 String 对象缓存在 String 池中,这使得 String 不可变。缓存的 String 字面量被多个客户端访问。因此,总有一个风险,一个客户端执行的操作会影响所有其他客户端。虽然在 String 池中缓存 String 字面量可以提高性能,但在多客户端环境中,也存在意外后果的风险。 例如,如果一个客户端执行一个操作并将字符串值从 Pressure 更改为 PRESSURE,所有其他客户端也将读取该值。出于性能原因,缓存 String 对象很重要,为了消除这种风险,我们必须使 String 不可变。 ![]() 以下是使 String 不可变的原因:
如果没有不可变性,这种并发修改可能会导致竞态条件和数据损坏。通过使字符串不可变,Java 确保了线程安全,因为每个线程都操作其字符串的副本,从而防止了干扰。
字符串池和内存效率 示例:Java 中会自动对字符串字面量进行 intern 操作,从而实现字符串池。 不可变性使 JVM 能够重用现有的字符串实例,从而减少内存开销并提高内存使用效率。这在处理大量字符串数据时尤其有利。
安全性 示例:考虑将密码等敏感信息存储为字符串。 不可变性确保一旦敏感信息被赋给字符串,其值就无法被无意修改。这有助于减轻与无意修改或敏感数据泄露相关的安全风险。
性能优化 示例:执行字符串连接。 虽然连接可变字符串涉及在每一步创建新的字符串对象,但不可变字符串允许 JVM 通过内部使用 StringBuilder 来优化此操作。这可以提高性能并减少内存消耗。
让我们通过一个例子来理解不可变的概念。 ImmutableString.java 输出 ![]() 描述:我们可以借助下图来理解上面的例子 ![]() 在字符串常量池中,**Hello** 保持不变,并创建了一个新的字符串对象 **HelloWorld**。这表明字符串是不可变的。引用变量指向 **Hello** 而不是 **HelloWorld**。 如果我们想让它指向 **HelloWorld**,我们必须显式地将其分配给该变量。例如 ImmutableString.java 输出 ![]() Java 中,不可变性由 final 关键字强制执行,是语言设计的一个基石。通过防止字符串对象一旦创建就无法修改,Java 确保了线程安全,通过字符串池提高了内存使用效率,增强了安全性,并实现了性能优化。虽然对于习惯了可变字符串的开发人员来说,这可能需要转变思维方式,但采用不可变性最终会带来更健壮、更可靠的 Java 应用程序。 |
在处理夏令时日期时,在 Java 代码中设置正确的时间区域非常重要。在本节中,我们将显示带 GMT 的时区列表。时区是一个区域,它在法律、商业和社交方面遵循统一的标准时间……
阅读 4 分钟
这是 Google、Amazon、TCS、Accenture 等顶级 IT 公司面试中经常遇到的问题。通过解决这个问题,人们想检查应试者的逻辑能力、批判性思维和解决问题的能力。因此,在本节中,我们将找出...
5 分钟阅读
继承是面向对象编程中最强大的特性。它允许我们将一个类的属性继承到另一个类中。继承 继承是一种将新类从现有类派生的机制。现有(旧)类称为基类或...
阅读 6 分钟
Java提供了多种位运算符,可以轻松地操作数字的各个位。但是,在比较位运算的输出时,程序员可能会遇到一个典型的陷阱。在尝试比较Java中位运算的输出时,开发人员可能会遇到...
7 分钟阅读
java.text.RuleBasedCollator 类有一个 compare() 函数。当比较两个对象的强度时,RuleBasedCollator 类用于比较结果。根据比较,该类返回一个正数或负数。语法:public int compare(Object obj1, Object obj2) 参数:...
阅读 3 分钟
? 在 Java 中,static 是一个关键字,可以用于变量、类、块和方法。当我们使用 static 关键字放在它们前面时,意味着指定的成员本身属于该类型。换句话说,static 成员的一个实例是...
阅读 3 分钟
介绍抽象是隐藏实体细节并关注实体基本特征的过程。在面向对象编程中,抽象是一个重要概念,它有助于开发人员在代码中对现实世界的实体进行建模。Java 语言完全融入了抽象,这是一个关键的理念...
阅读 4 分钟
这是 Google、Amazon、TCS、Accenture 等顶尖 IT 公司面试中经常遇到的问题。 为了解决这个问题,需要检查应聘者的逻辑能力、批判性思维和解决问题的能力。 因此,在本节中,我们将解决...
5 分钟阅读
将一种类型的对象和变量转换为另一种类型的过程称为类型转换。当编译器在程序员的干预下自动执行转换时,称为隐式类型转换或自动类型提升。在隐式类型转换中,转换涉及较小的...
阅读 3 分钟
逻辑计算和编程都依赖于 XOR(异或)运算。Java 中的 XOR 运算符提供了一种快速简便的方法来处理二进制数据和执行位运算。本节将全面介绍 Java 中 XOR 运算的细节,...
阅读 4 分钟
我们请求您订阅我们的新闻通讯以获取最新更新。
我们提供所有技术(如 Java 教程、Android、Java 框架)的教程和面试问题
G-13, 2nd Floor, Sec-3, Noida, UP, 201301, India