我知道原因,为什么String是不可变的但我的问题是为什么不变性的概念 仅限于java中的String类,为什么它不适用于其他类。
我发现为什么它是不可变的原因之一是HERE
但为什么不是所有其他类如Integer等等。 java人们如何决定改变他们的价值观可能不会影响..
请解释。
答案 0 :(得分:1)
关键是你可以将String(它是一个Object)与一个基本类型混淆。实际上,字符串通常出现在Java程序中的方式可能会导致混淆。 可用于Java中其他对象不可用的字符串的快捷方式。这些 快捷方式被高度使用,它们为字符串提供了原始数据类型的外观。但, 字符串是对象,它们拥有Java中对象的所有属性和行为
答案 1 :(得分:1)
在设计课程时,为了使课程不变是一种设计选择,通常需要权衡。由于包括安全性在内的许多原因,String和Integer类都是不可变的。
像java.util.Random这样的类是关于管理某个状态的,所以它必须是可变的。
像java.awt.Rectangle这样的类是可变的,它具有在修改内存管理成本而不是创建新内存时节省内存管理成本的优点,但不幸的是,这意味着当共享一个Rectangle实例时(例如,通过两个不同的实例)改变它们中的一个会改变它们,从而引起不愉快的惊喜。现代垃圾收集器非常有效[我听说它们比C malloc()
和free()
更有效率,因此可变性实际上可能不会节省内存管理开销,当然不是如果你经常需要复制对象以防止意外的共同变化。
您可以自由地共享不可变对象,而不必担心它会从您身下变换。
答案 2 :(得分:0)
Integer是不可变的,因此每个操作都会创建一个新实例。
不可变并不意味着引用永远不会分配另一个值。例如,String也是不可变的,但我们可以这样做:
String ex = "good"; // ex == "good"
ex = ex + "morning"; // now ex == "goodmorning"
那么那里发生了什么?由于String是不可变的,显然“ex”没有改变。但它现在被赋予了不同的东西。这是因为“ex”现在是一个完全新实例化的对象。
所以这与Integer的情况相同。