如果我创建了一个字符串并且没有初始化该值。我们是使用相同的字符串对象还是将字符串引用重新分配给新字符串,这可能看起来像更改值。
class Foo()
{
String x;
String y = null;
x = "Hello";
y = "Hey";
}
我现在的理解是x不会创建额外的String对象。但是y会创建另一个String但是会将它从null String重新分配给新创建的字符串"嘿"。这是对的吗?
答案 0 :(得分:1)
String foo
本身只是一个参考。由于它是一个String-reference,因此它能够引用一个名为' String Pool'的字符串,这是String Intering的一个实现。但是不会创建一个新的字符串
也没有String bar = null;
字符串bar就像foo一样,是一个String 引用,但是创建引用不会创建新的Object。 foo
和bar
之间的区别在于bar是null
的assignet,但null肯定不是String,因此JVM没有理由创建新的String。
你最后的假设更接近实际发生的事情。
String foo = "Hello World";
会创建一个新的String(假设" Hello World"在String Pool中找不到)。
你可以将这个陈述分成三个较小的陈述:
String foo
创建一个能够引用字符串对象的新引用"Hello World"
,作为new String("Hello World")
的简短形式在对象堆上分配空格(在本例中为字符串池)并实际创建新对象。=
最终将我们的对象分配给我们的参考。总结一切:
String x;
String y = null;
将创建一个新的String。但这两个陈述都将
x = "Hello";
y = "Hey";
答案 1 :(得分:0)
字符串在Java中是不可变的。两者:x ="你好"和y ="嘿"无论x和y是如何声明的,都将创建一个新的String对象。
答案 2 :(得分:0)
您需要了解变量和对象之间的区别。
String x
是一个可以引用String对象的变量。声明变量不会创建对象。
"Hello"
是一个String对象。