我知道字符串本质上是不可改变的。但我有一个问题。
String a = new String("abc");
如果我们创建一个上面的字符串而不是文字,那么它不是不可变的,因为它是作为一个新对象创建的吗?请澄清。感谢。
答案 0 :(得分:6)
没有。它没有。 java String 总是不可变的,无论它是如何创建的。
实际上使用new
来创建字符串是冗余,99%的情况应该避免(除非你做一些微工作台标记)
不可变表示实例创建后无法修改。当你查看String的所有方法时,它们都没有实际修改传递给它的原始String。它们要么返回相同的String,要么创建一个新的字符串。
答案 1 :(得分:2)
您的String
是不可变的,因为String总是不可变的(查看The Java Language Specification)
String a = "abc";
和String a = new String("abc");
之间的差异不是可变性,而是使用字符串池。当你这样做
String a = "abc";
您正在使用Java字符串池(请参阅String intern)
当你做的时候
String a = new String("abc");
您没有使用字符串池。
String池存储不同的String实例,这就是为什么当您使用池创建两个不同的对象时,引用是相同的。
无论如何,在这两种情况下,您都无法更改String实例的状态(String
是不可变的)。
几乎可以避免使用new
创建字符串。
答案 2 :(得分:2)
这是一个可变对象:
class Person {
private name;
Person(String name) { this.name = name; }
void setName(String name) { this.name = name; }
}
因为您可以在创建后更改其州:
Person john = new Person("John");
john.setName("Fred"); //oops, John's name is not John any more...
另一方面,一旦你创建了一个String,就没有任何方法可以让你改变那个字符串的值。
String john = "John";
john.setValue("Fred"); //No, that's not possible...
这并不妨碍您创建具有相似或不同值的新字符串。