![](/img/trans.png)
[英]If I make an object using a list and the same constructor, does that mean after I make it I can no longer reference it?
[英]If I have 2 reference types, with the same value, does that mean only 1 object in memory
我是Java的新手,并且已经阅读了我认为的相互矛盾的陈述。 请考虑以下代码。
String str1 = "dave";
String str2 = "dave";
str1和str2虽然是唯一变量,但它们引用完全相同的值。 那么,在内存中创建了多少个唯一对象? 1或2,可以解释一下为什么?
在你的榜样,他们引用同一个对象,因为字符串实习 。
通常,使用new会创建新对象,因此使用:
String str1 = new String("dave");
String str2 = new String("dave");
会在堆中创建两个不同的对象。
您有一个指向同一对象的唯一Object
&2引用。 这是String
池(或实习)的结果。 鉴于两个String
文字具有相同的内容,确保可以创建2个单独的 Objects
的唯一方法是显式调用其中一个String
构造函数。
它并不复杂。 除非你在谈论字符串;-)
首先,让我们忽略字符串并假设这个简单的类型:
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
将指向同一个对象 。
这取决于。 如果你写一个小测试程序,那么它们很可能会包含相同的引用,因为java试图通过保存内存和重用引用来帮助你。 如果str2来自用户输入,那么它可能是两个不同的引用。 一个好的测试方法是在比较中使用==。 如果这两个是==,那么它们引用相同的内存位置。 如果他们不是,那么他们是两个不同的参考。 这引发了许多初学程序员,因为当他们第一次开始编写代码时,他们使用==,看到它有效,然后在路上无法弄清楚为什么他们的比较不起作用。
当java确实重用“幕后”引用时,我无法具体解释,但它与创建值的方式和时间有关
你正在写一个这方面的简写版本
String str1 = new String("dave");
String str2 = new String("dave");
因此str1和str2是不同的对象,可以单独修改
“dave”,原始字符串,仅存在于内存中,具有另一个引用。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.