【问题标题】:Java Hash Table IssueJava 哈希表问题
【发布时间】:2012-03-10 22:10:10
【问题描述】:

我有三个这样的哈希表,

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) } where pointer1 ----) 100 (存储在 value hashtable 上)这样的结构有人能帮我吗?我正在使用 Java 内置的 Hashtable 构造。谢谢。

【问题讨论】:

  • 您能否更全面地解释您的问题,或者更确切地说您想要达到的目标。
  • @AlanFoster,我想要像 ht1 = { (1, pointer1), (2, pointer2) } where pointer1 ----) 100 (存储在值哈希表上)这样的结构。

标签: java hashtable


【解决方案1】:

几个厘米。当您需要同步访问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) 的引用,因为 @987654333 @ 是一个不可变的类,有​​可能所有三个 referencesnew Integer(100) 都指向内存中完全相同的对象。

所以,回答您的问题:是的,在 Java 中可以将指针存储在 ht1 和 ht2 中,而不是 100 和 200,它们指向(并且可以访问)值哈希表的 100 和 200。事实上,这已经发生了,并且没有其他方法可以做到这一点——因为 Java 中的映射不能存储原始类型(如 int),只能存储引用。同样,鉴于Integer 的所有实例都是不可变的,您不能更改它们的值,因为这样做会更改共享和使用它们的其他地方的值。

【讨论】:

  • 谢谢。实际上,我想通过使用“引用”访问另一个 HashTable 中的存储值,而无需更改“引用”。像 ht1 = { (1, pointer1), (2, pointer2) } where pointer1 ----) 100 (存储在值哈希表中)。但是,如何获得这些“参考”?
  • 恐怕这个问题还不清楚。 Java 哈希表中的所有值(和所有键)都是 references,如果您有两个哈希表,假设 ht1 = {(1,reference1)} 和 ht2 = {(1,reference2)},您可以从值中引用您想要的任何内容,特别是两者都可以指向相同的数字,如下所示:reference1 = reference2 = 100;并且两个引用都可以用作值哈希表中的键。
【解决方案2】:

是的。如果您使用 Integer 代替,因为它们通过引用传递到哈希表中;

【讨论】:

  • 您能否通过简单的示例 java 代码或伪代码来说明这一点。
【解决方案3】:

是的。您需要将其存储为 Integer 而不是原始的 int。请注意,Integer 是不可变的,因此您无法更改它。更改它会导致一个新对象,ht1ht2 中的指针仍然指向旧对象。

【讨论】:

    【解决方案4】:

    使用 getter 和 setter 存储一个对象,该对象将您想要指向的指针的值包装到 JavaBean 中。然后您可以在外部修改内容。对包装器的引用可以被存储和访问,并且也会改变 HashMap 的内容。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-10-07
      • 1970-01-01
      • 1970-01-01
      • 2012-03-28
      • 2020-12-21
      相关资源
      最近更新 更多