new String()是一个生成String...的表达式,而String无论它如何生成,a都是不可变的。
(问是否new String()可变是不明智的。这是程序代码,而不是值。但是我认为那不是您的真正意思。)
如果我创建一个字符串对象,那么String c = "";是否在池中创建了一个空条目?
是; 即,为空字符串创建一个条目。空没什么特别的String。
(为方便起见,将""在执行代码之前很长时间就创建用于的池条目。实际上,它是在加载代码时创建的……甚至早于此。)
所以,我想知道新的堆对象是否也是不可变的,...
是的。但是,不变性是String对象的基本属性。所有String对象。
您会发现,StringAPI根本没有提供任何更改的方法String。因此(除了使用反射的一些危险和愚蠢的1招),您不能对进行突变String。
如果是这样,目的是什么?
JavaString被设计为不可变类的主要原因是简单性。如果核心字符串类提供了不可变的接口,则可以更轻松地编写正确的程序以及阅读/理解其他人的代码。
第二个重要原因是的不可改变性String对Java安全模型具有根本的影响。但是我认为这不是原始语言设计的驱动程序……在Java 1.0及更低版本中。
按照答案,我认为对同一变量的其他引用是原因之一。如果我理解正确,请告诉我。
不。它比那更根本。简单地说,所有String对象都是不可变的。不需要复杂的特殊情况推理就可以理解这一点。只是>> is <<。
作为记录,如果您希望使用Java中的可变“字符串状”对象,则可以使用StringBuilder或StringBuffer。但是这些是与String不同的类型。
1-这些技巧(IMO)危险且愚蠢的原因是,它们会影响应用程序其他部分可能通过字符串池共享的字符串值。这可能会导致混乱……使下一个维护您代码的人几乎没有机会进行跟踪。