2012-03-10 128 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的内容。