为什么String在Java中是不可变的或final

原文:https://javarevisited.blogspot.com/2010/10/why-string-is-immutable-or-final-in-java.html

字符串在Java中是不可变的,因为String对象缓存在String池中。由于缓存的字符串文字在多个客户端之间共享,因此始终存在风险,其中一个客户端的操作会影响所有其他客户端。例如,如果一个客户端将字符串“Test”的值更改为“TEST”,则所有其他客户端也将看到该值,如第一个示例中所述。由于String对象的缓存从性能原因很重要,因此通过使String类不可变来避免这种风险。同时,String是最终的,所以没有人可以牺牲String类的不变量,例如 通过扩展和覆盖行为来实现不变性,缓存,哈希码计算等。String类不可变的另一个原因可能是由于HashMap而导致的。

由于字符串作为HashMap键很受欢迎,因此它们必须是不可变的,以便它们可以检索存储在HashMap中的值对象。由于HashMap依据散列原理工作,因此需要具有相同的值才能正常运行。如果在插入后String的内容被修改,易变的String将在插入和检索时生成两个不同的哈希码,可能会丢失映射中的值对象。

如果你是印度板球迷,你可以理解下一句话。 该字符串是Java的VVS Laxman(印度著名的板球手),即非常特殊的类。 我还没有看到一个没有使用String编写的Java程序。 这就是为什么对String的充分理解对于Java开发人员来说非常重要。

String作为数据类型,传输对象和调解器非常重要和普及,这也使其在Java面试中流行。为什么String在Java中是不可变的是Java中最常被问到的String Interview问题之一,它首先讨论了什么是String,Java中的String与C和C ++中的String有何不同,然后转向什么是不可变对象在Java中,不可变对象有什么好处,为什么要使用它们以及应该使用哪些场景。有时也会问这个问题:“为什么String在Java中是最终的”。

Why String is Final in Java

正如我所说,这个问题可能有很多可能的答案,String类的唯一设计者可以自信地回答这个问题。我在Joshua Bloch的Effective Java书中期待一些线索,但他也没有提到它。1)想象一下字符串池设施使字符串可变,其实这根本不可能,因为在字符串池的情况下,一个字符串对象/文字,例如“Test”已被许多参考变量引用,因此如果其中任何一个改变了值,则其他参数将自动受到影响,即可以说:
String A = “Test”
String B = “Test”
现在String B调用了“Test”.toUpperCase(),它将同一个对象改为“TEST”,所以A也将是“TEST”,这是不可能的。这是一个很好的图表,显示了字符串文字如何在堆内存和字符串文字池中创建。
为什么String在Java中是不可变的或final

2)字符串已被广泛用作许多Java类的参数,例如对于打开网络连接,您可以将主机名和端口号作为字符串传递,您可以将数据库URL作为字符串传递以打开数据库连接,您可以通过将文件名作为参数传递给File I / O类来打开Java中的任何文件。

如果String是可变的,这将导致严重的安全威胁,我的意思是有人可以访问他有权授权的任何文件,然后可以故意或意外地更改文件名并获得对该文件的访问权限。由于不变性,您无需担心这种威胁。这个情况也说明了,为什么String在Java中是final,通过使java.lang.String final,Java设计者确保没有人覆盖String类的任何行为。

3)由于String是不可变的,因此它可以安全地在多线程之间共享,这对于多线程编程非常重要,并且为了避免Java中的任何同步问题,Immutability也使得Java实例在Java中是线程安全的,这意味着您不需要在外部同步String操作。关于String的另一个重要注意事项是由SubString引起的内存泄漏,这不是与线程相关的问题,而是需要注意的事项。
4)Why为什么String在Java中是不可变的另一个原因是允许String缓存其哈希码,Java中的不可变String缓存其哈希码,并且每次调用String的hashcode方法时都不计算,这使得它作为hashmap键非常快用于Java中的hashmap。 Jaroslav Sedlacek在下面的评论中也提出了这一点。简而言之,因为String是不可变的,所以没有人可以在创建后更改其内容,这保证了String的hashCode在多次调用时是相同的。

5)Dan Bergh Johnsson在评论中提出的为什么String是不可变的另一个好理由是:String是不可变的绝对最重要的原因是它被类加载机制使用,因此在安全方面极具意义。如果String是可变的,加载“java.io.Writer”的请求可能已被更改为加载“mil.vogoon.DiskErasingWriter”

进阶读物:
Data Structures and Algorithms: Deep Dive Using Java
Java Fundamentals: The Java Language
Complete Java Masterclass
How substring works in Java
How to replace String in java using regular expression
Why Character array is better than String for storing password in Java
How to convert String into Integer in Java
How to split String with 2 examples in Java
How to compare String in Java