如果创建了新实例,字符串是否会失去可变性

时间:2015-03-10 13:37:03

标签: java string jvm

我知道字符串本质上是不可改变的。但我有一个问题。

String a = new String("abc");

如果我们创建一个上面的字符串而不是文字,那么它不是不可变的,因为它是作为一个新对象创建的吗?请澄清。感谢。

3 个答案:

答案 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...

这并不妨碍您创建具有相似或不同值的新字符串。