字符串实例化为两个String对象,但行为和值相同

时间:2017-08-27 11:19:56

标签: java string object reference immutability

字符串是不可变的(事实)

假设我有以下两个字符串对象:

String str1 = new String("dave");
String str2 = new String("dave");

编译时,会发生字符串对象的实习。根据维基百科的说法,它说“字符串实习是一种只存储每个不同字符串值的一个副本的方法,它必须是不可变的。所有Java编译时常量字符串都会使用这种方法自动实现。”

如果是这种情况,那么我的两个引用str1和str2会发生什么?一旦汇编,他们会指出哪个对象?

我希望它有效的问题,否则纠正我,我有点困惑。

2 个答案:

答案 0 :(得分:0)

str1和str2都在堆上创建,因为您是在运行时创建它们的。甚至两个对象都是在不同的引用中创建的。

String str1 = new String("dave");
String str2 = new String("dave");
  

即使str1 == str2也会返回false。它们的值相同,但它们是堆上的两个不同对象。

但是,如果您在编译时创建对象,例如

String str1="dave";
String str2="dave";
  

然后str1 == str2将返回true,因为这两个对象都是   在字符串池中编译时创建的同一引用的一部分。

当我们使用双引号创建一个String时,它首先在String池中查找具有相同值的String,如果发现它只返回引用,否则它会在池中创建一个新String,然后返回引用。

答案 1 :(得分:-1)

通过使用new运算符,您指定要创建新对象。 虽然我们知道java中的String是不可变的,所以使用new运算符会花费你更多的时间和资源 更好的选择是不使用new运算符来使用字符串池。

示例:

String str1="dave";
String str2="dave";

上面的代码将创建一个str1str2都指的字符串对象。
str1==str2将返回true

  

有关更多信息,请参阅java中的字符串池。