我是Java的新手,并且已经阅读了我认为的相互矛盾的陈述。请考虑以下代码。
String str1 = "dave";
String str2 = "dave";
str1和str2虽然是唯一变量,但引用完全相同的值。那么,在内存中创建了多少个唯一对象? 1或2,可以解释一下为什么?
答案 0 :(得分:14)
在您的示例中,它们引用同一个对象,因为字符串为interned。
通常, new 的使用会创建新对象,因此使用:
String str1 = new String("dave");
String str2 = new String("dave");
会在堆中创建两个不同的对象。
答案 1 :(得分:9)
您有一个独特的Object
& 2个引用指向同一个对象。这是String
汇集(或实习)的结果。鉴于两个String
文字具有相同的内容,确保可以创建2 单独的 Objects
的唯一方法是明确调用String
之一构造
答案 2 :(得分:9)
这并不复杂。除非你在谈论字符串; - )
首先,让我们忽略字符串并假设这个简单类型:
public class ValueHolder {
private final int value;
public ValueHolder(int value) {
this.value = value;
}
public int getValue() {
return value;
}
}
如果您有两行:
ValueHolder vh1 = new ValueHolder(1);
ValueHolder vh2 = new ValueHolder(1);
然后你将在堆上创建正好2个对象。即使它们的行为完全相同并且存储了完全相同的值(并且无法修改),您将拥有两个对象。
因此vh1 == vh2
将返回false
!
对于String
个对象也是如此:具有相同值的两个String
对象可以存在。
但是,String
有一个特定的事情:如果在代码中使用String
字面值(*),Java将会尝试重新使用之前的任何一个(通过一个名为interning的过程)。
因此,在您的示例代码中str1
和str2
将指向同一个对象。
答案 3 :(得分:0)
我无法具体解释java何时重复使用“幕后”的引用,但它与创建值的方式和时间有关
答案 4 :(得分:0)
您正在编写此
的简写版本String str1 = new String("dave");
String str2 = new String("dave");
因此str1和str2是不同的对象,可以单独修改
“dave”,原始字符串,仅在内存中存在一次,带有另一个引用。