2012-03-10 140 views
1

我有三個哈希表像,Java的哈希表問題

HashTable ht1 = { (1, 100), (2, 200) } 

HashTable ht2 = { (1, 100), (2, 200) } 

HashTable value = { (100, null), (200, null) } 

是否有可能在Java中的指針存儲在HT1和HT2而不是100和200,它指向(並且可以訪問)到100和200個值散列表。例如,我想要的結構像ht1 = {(1,pointer1),(2,pointer2)}其中pointer1 ----)100(存儲在value hashtable中)任何人都可以幫助我如何才能做到這一點?我正在使用Java內置的Hashtable構造。謝謝。

+2

你能否更完整地解釋你的問題,或者你想要達到什麼目的。 – AlanFoster 2012-03-10 22:14:56

+0

@AlanFoster,我想要的結構像ht1 = {(1,pointer1),(2,pointer2)}其中指針1 ----)100(它存儲在值散列表)。 – Arpssss 2012-03-10 22:19:41

回答

3

一些評論。當您需要同步訪問Map中的元素時,Hashtable非常有用,如果不是這種情況,則首選HashMap。在Java中,我們沒有「指針」,但當然我們有引用到對象(​​請記住,在Java中所有的對象都通過值傳遞,而不是通過引用)。是的,您可以將對象的引用存儲爲Map中的值。我認爲你把C/C++的概念和Java中的概念搞混了,也許你應該解釋一下你想用「指針」做什麼。

只是可以肯定 - 你可以有一個Map像這樣一個在Java中:

Map<Integer, Integer> table = new HashMap<Integer, Integer>(); 

在上面的代碼,的Map引用Integer對象鍵和值,和Integer類是不可變的,也就是說,一旦到位就不能更改其值 - 但當然,您可以更改Map中的某個鍵指向的值。

編輯:

在討論的樣品看起來像這樣在Java中:

Map<Integer, Integer> ht1 = new HashMap<Integer, Integer>(); 
ht1.put(1, 100); 
ht1.put(2, 200); 

Map<Integer, Integer> ht2 = new HashMap<Integer, Integer>(); 
ht2.put(1, 100); 
ht2.put(2, 200); 

Map<Integer, Integer> value = new HashMap<Integer, Integer>(); 
value.put(100, null); 
value.put(200, null); 

在上面的代碼中的三張地圖所有的整數是引用到不可變對象:實際上看起來是數字100的是對對象new Integer(100)的引用,並且因爲Integer是不可變的類,所以有可能所有三個引用new Integer(100)指向內存中完全相同的對象。

所以,回答你的問題:是的,它可能在Java中存儲一個指針在ht1和ht2中,而不是100和200,它指向(並且可以訪問)100和200值哈希表。事實上,這就是已經發生的事情,沒有其他辦法可以做到這一點 - 因爲Java中的地圖不能存儲原始類型(如int),只能引用。再次,鑑於Integer的所有實例都是不可變的,所以您無法更改它們的值,因爲這樣做會改變其他位置共享和使用的值。

+0

謝謝。其實我想通過使用'引用'來訪問另一個HashTable中存儲的值,而不需要更改'引用'。像ht1 = {(1,pointer1),(2,pointer2)}其中pointer1 ----)100(它存儲在值散列表中)。但是,如何獲得這些'參考'? – Arpssss 2012-03-10 22:29:42

+0

恐怕這個問題還不清楚。 Java哈希表中的所有值(和所有鍵)都是_references_,如果您有兩個哈希表,例如ht1 = {(1,reference1)}和ht2 = {(1,reference2)},則可以引用任何您想要的值,尤其是兩者都可以指向相同的數字,如下所示:reference1 = reference2 = 100;並且這兩個引用都可以用作值散列表中的鍵。 – 2012-03-11 02:12:13

+0

@Arpssss我編輯了我的答案,我希望這很清楚。 – 2012-03-11 02:27:37

0

是的。如果你使用Integer來代替它們,因爲它們通過引用傳遞到散列表中;

+0

您可以通過使用簡單的示例java代碼或僞代碼來舉例說明。 – Arpssss 2012-03-10 22:16:32

0

是的。您需要將其存儲爲Integer而不是原始文件int。請注意,Integer是不可變的,所以你不能改變它。改變它會導致一個新的對象,ht1ht2中的指針仍然指向舊的對象。

0

存儲一個對象,該對象將您希望指針的值封裝到帶有getter和setter的JavaBean中。那麼你可以修改外部的內容。對包裝的引用可以被存儲和訪問,並且也會改變HashMap的內容。