public void method (AmazingObject obj) {
HashMap<Integer, AmazingObject> hashmap = new HashMap<>();
for (int i = 0; i < 5; i++) {
obj = new AmazingObject();
hashmap.put(i, obj);
}
for (int i = 0; i < 5; i++) {
System.out.println(hashmap.get(i).toString());
}
}
我编写了这段代码,看到数组包含每个元素完全不同的对象。如果我理解这一点:
1)该方法接受一个AmazingObject实例的reference copy
。
2)我使用reference type
关键字为new
分配了一个新地址。
3)包含我的新地址的另一个reference copy
被抛入Hashmap。
因此,以前的值都不会被覆盖。这种行为的原因是Java是否经过reference copy
并且没有通过reference
?我希望数组中的每个元素都指向末尾的完全相同的对象(即最后分配的对象)。
答案 0 :(得分:1)
如果我理解正确,您会期望以下代码:
HashMap<Integer, MyObject> hashmap ... // Line 0
MyObject foo = new MyObject(); // Line 1
hashmap.put(1, foo); // Line 2
foo = new MyObject(); // Line 3
hashmap.put(2, foo); // Line 4
将导致两个值相同的散列图。
让我们一步一步看看这个例子:
Line 1
之后
HashMap
和1 MyObject
个实例。)Line 2
之后
HashMap
内存对象现在包含一个将1
映射到指向MyObject
Line 3
之后
MyObject
实例)HashMap
的<{1}}和两个实例MyObject
之后
Line 4
内存对象现在包含2个条目(HashMap
- &gt;指向第一个1
实例| MyObject
的指针 - &gt ;指向第二个2
实例的指针)我希望你理解我的意思但重要的是:变量/参数不对象本身。它只是一个容器,它包含一个指向内存位置的指针。
因此,如果您将该指针指向其他任何人的内存位置(在您的情况下为HashMap),那么其他位置将不知道该变量是否稍后更改!
答案 1 :(得分:0)
您可以在所有选项中使用相同的引用,但不能使用new关键字,而是:
for (int i = 0; i < 5; i++) {
obj = new AmazingObject();
hashmap.put(i, obj);
}
执行:
obj = new AmazingObject();
for (int i = 0; i < 5; i++) {
hashmap.put(i, obj);
}
答案 2 :(得分:-1)
输入参数是无关紧要的,因为你在第一个for循环中不断重新分配它,所以是的,你最终得到了5个存储在地图中的新对象。这就是为什么我总是将输入参数设为最终的一个原因 - 它会阻止它们的重新分配,这会引起混淆,就像这个例子一样