只是爲了我的理解。下面的示例代碼是否實際上改變了我的汽車對象在IntHashtable中的顏色,還是第一行創建了另一個汽車對象實例,其中包含第二行之後的color = red?Java中的對象參考或值
感謝,
亨裏克
Car myCar = (Car)myIntHashTable.get(index);
myCar.setColor = red;
編輯:
難道還有比這更好的辦法?
((Car)myIntHashTable.get(index)).setColor = red;
只是爲了我的理解。下面的示例代碼是否實際上改變了我的汽車對象在IntHashtable中的顏色,還是第一行創建了另一個汽車對象實例,其中包含第二行之後的color = red?Java中的對象參考或值
感謝,
亨裏克
Car myCar = (Car)myIntHashTable.get(index);
myCar.setColor = red;
編輯:
難道還有比這更好的辦法?
((Car)myIntHashTable.get(index)).setColor = red;
它將屬性setColor
更改爲red
指向的內容。所以哈希表中的對象被改變了。
小演示:
import java.util.*;
public class Main {
public static void main(String[] args) {
List<Foo> foos = new ArrayList<Foo>();
foos.add(new Foo());
foos.add(new Foo());
foos.add(new Foo());
System.out.println("foos="+foos);
foos.get(1).n = 1;
System.out.println("foos="+foos);
}
static class Foo {
int n = 0;
@Override
public String toString() {
return String.valueOf(n);
}
}
}
會產生:
foos=[0, 0, 0]
foos=[0, 1, 0]
正如你看到的,也沒有必要使用鑄造時generics。
它實際上改變了散列表中的值。請注意,如果你在做什麼改變了一個關鍵對象的hashCode或等於返回值,你可能會處於一個受到傷害的世界。另一方面,只更改散列表的值通常可以。
要回答你的第二個問題,如果你能定義哈希表是什麼:
Hashtable<Integer, Car> myHashTable = new Hashtable<Integer, Car>();
myHashTable.add(1, theCar);
myHashTable.get(1).setColor(red);
它改變存儲在表中的Car
實例的「顏色」屬性的值;新值是而不是創建。
您不會顯示myIntHashTable
的類型。請注意,java.util.Map通常比傳統的java.util.Hashtable更受歡迎。後者鎖定。
另外,你是否通過連續的整數值來索引這些汽車?如果是這樣,您可能需要某種形式的List
。
你可能想是這樣的:
final Map<Integer, Car> cars = new HashMap<Integer, Car>();
final Car someCar = new Car();
cars.put(1, someCar);
final Car carInTable = cars.get(1). // refers to same object as someCar
carInTable.setColor(red);
一個List
實現類似於:
final List<Car> cars = new ArrayList<Car>();
final Car someCar = new Car();
cars.add(someCar);
final Car carInTable = cars.get(1). // refers to same object as someCar
carInTable.setColor(red);
三世泛型,只是做鑄造自己:
final Map cars = new HashMap();
final Car someCar = new Car();
cars.put(1, someCar);
final Car carInTable = (Car) cars.get(1). // refers to same object as someCar
carInTable.setColor(red);
final List cars = new ArrayList();
final Car someCar = new Car();
cars.add(someCar);
final Car carInTable = (Car) cars.get(1). // refers to same object as someCar
carInTable.setColor(red);
您可以隨時比較對象引用和==
System.println.out("someCar and carInTable are " + ((someCar == carInTable) ? "" : "not ") + "the same object");
我的股票推薦了這個問題閱讀以下兩篇文章:
約兩個對象是否是同一個對象疑問有沒有比這更好的方法?
你會發現哪些更具可讀性?我認爲第一個是。
非原始類型的變量是引用,所以在你的例子myCar
是參考在哈希表中Car
對象。當您通過參考myCar
更改成員變量setColor
的值時,您正在更改散列表中的Car
對象的內容。
如果myIntHashTable
是正常java.util.Hashtable
或java.util.HashMap
,沒有你的Car
對象的副本。
一些其他注意事項:
HashMap
而不是Hashtable
。 Hashtable
是一個遺留集合類,它已經(幾乎所有用途)被替換爲HashMap
。Car
顯然有一個名爲setColor
的公共成員變量。不要讓成員變量公開,也不要給他們奇怪的名字,比如setColor
。關於最後一點:將一個私有成員變量color
在Car
類,並實現一個setColor
方法:
public class Car {
private Color color;
public void setColor(Color color) {
this.color = color;
}
// ...
}
// Somewhere else:
myCar.setColor(Color.RED);
但是即將到來的vom C++和C#,在java中,沒有辦法實際手動更改引用,是不是? – 2009-10-14 12:22:00
你是什麼意思?您可以將參考點指向不同的對象;只需將其他分配給'myCar',例如'myCar = new Car();'。 – Jesper 2009-10-14 12:26:14
謝謝!這是J2ME,所以沒有泛型支持:( – 2009-10-14 12:14:02
啊J2ME,我看到了(不適合Android?:))。當然,歡迎您! – 2009-10-14 12:17:41
目前正在開發一個黑莓項目;) – 2009-10-14 12:20:52