2009-10-14 76 views
0

只是爲了我的理解。下面的示例代碼是否實際上改變了我的汽車對象在IntHashtable中的顏色,還是第一行創建了另一個汽車對象實例,其中包含第二行之後的color = red?Java中的對象參考或值

感謝,
亨裏克

Car myCar = (Car)myIntHashTable.get(index); 
myCar.setColor = red; 

編輯:
難道還有比這更好的辦法?

((Car)myIntHashTable.get(index)).setColor = red; 

回答

4

它將屬性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

+0

謝謝!這是J2ME,所以沒有泛型支持:( – 2009-10-14 12:14:02

+0

啊J2ME,我看到了(不適合Android?:))。當然,歡迎您! – 2009-10-14 12:17:41

+0

目前正在開發一個黑莓項目;) – 2009-10-14 12:20:52

2

它實際上改變了散列表中的值。請注意,如果你在做什麼改變了一個關鍵對象的hashCode或等於返回值,你可能會處於一個受到傷害的世界。另一方面,只更改散列表的值通常可以。

1

要回答你的第二個問題,如果你能定義哈希表是什麼:

Hashtable<Integer, Car> myHashTable = new Hashtable<Integer, Car>(); 

myHashTable.add(1, theCar); 

myHashTable.get(1).setColor(red); 
+4

你的例子是錯誤的,因爲你不能在普通類型中使用像int這樣的基本類型。改用'Integer',即'Hashtable '。 – Jesper 2009-10-14 12:17:21

+0

謝謝,我會更新。 (我被寵壞了。NET) – tster 2009-10-14 14:33:28

1

它改變存儲在表中的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"); 
4

非原始類型的變量是引用,所以在你的例子myCar參考在哈希表中Car對象。當您通過參考myCar更改成員變量setColor的值時,您正在更改散列表中的Car對象的內容。

如果myIntHashTable是正常java.util.Hashtablejava.util.HashMap,沒有你的Car對象的副本。

一些其他注意事項:

  • 使用HashMap而不是HashtableHashtable是一個遺留集合類,它已經(幾乎所有用途)被替換爲HashMap
  • 有點奇怪,你的班級Car顯然有一個名爲setColor的公共成員變量。不要讓成員變量公開,也不要給他們奇怪的名字,比如setColor

關於最後一點:將一個私有成員變量colorCar類,並實現一個setColor方法:

public class Car { 
    private Color color; 

    public void setColor(Color color) { 
     this.color = color; 
    } 

    // ... 
} 

// Somewhere else: 
myCar.setColor(Color.RED); 
+0

但是即將到來的vom C++和C#,在java中,沒有辦法實際手動更改引用,是不是? – 2009-10-14 12:22:00

+2

你是什麼意思?您可以將參考點指向不同的對象;只需將其他分配給'myCar',例如'myCar = new Car();'。 – Jesper 2009-10-14 12:26:14