【问题标题】:Using a char array as Hashtable key使用 char 数组作为 Hashtable 键
【发布时间】:2012-04-26 19:13:12
【问题描述】:

我在我的 java 程序中使用Hashtable。看到Hastable 的异常行为让我感到很惊讶。下面是我的代码(这不是我的最终代码,我只是用运行异常的代码创建了一个新的简单项目)

    Hashtable<char[], char[]> h1 = new Hashtable<char[], char[]>();
    char[] key = Integer.toString(12).toCharArray();
    char[] val = Integer.toString(21).toCharArray();
    h1.put(key, val);
    System.out.println(h1.containsKey(Integer.toString(12).toCharArray()));// Should print true, since 12 is there in Hashtable

【问题讨论】:

标签: java hashtable


【解决方案1】:

如果 a 和 b 是 2 个数组而不是 a.equals(b) 如果 a == b。所以 a == b 的 hashCode 如果 a == b。由于这里不是这种情况,因此不会在哈希表中找到它。使用数组作为哈希表键是一个坏主意。使用任何可变对象作为哈希表键也是一个坏主意。

【讨论】:

  • 您的逻辑并不完全合理,因为(实际上).equals().hashCode() 方法实现是独立的。
  • equals和hashCode的部分约定是相互之间要保持一致。我会假设 Java 遵循它自己的合同。
【解决方案2】:

您不能将这样的数组用作映射键,因为数组具有默认的、基于引用相等的Object 实现equalshashCode。改为使用String 作为键将使您的程序按需要运行。

【讨论】:

  • 但我使用了整数数组。我没有遇到任何问题。
  • @crucified 你做到了,也许你只是没有注意到它。但是由于基本语句(“数组具有引用相等性”)对于 any 数组是正确的,那就是就是这样。
  • @Voo 是对的。 int[] a = {1}; int[] b = {1}; System.out.println(a == b) 打印 false.
【解决方案3】:

数组相等基于引用相等(“这两个引用是否指向同一个对象?”)而不是深度相等(“这两个对象在语义上是否相同?”)。看:

char[] one = Integer.toString(12).toCharArray();
char[] two = Integer.toString(12).toCharArray();
System.out.println(one == two); // false

http://ideone.com/YwEjV

【讨论】:

  • 它们指的不是同一个对象。在我上面的代码中,我使用了Integer.toString()。但在我的实际代码中,我正在使用char[]。那么现在可以做什么呢?
  • 使用Strings,而不是char[]s,作为映射键。此外,您可能应该使用HashMap 而不是旧版Hashtable。 ...此外,编写 "12".toCharArray()new char[]{'1', '2'} 而不是 Integer.toString(12).toCharArray() 会提高代码清晰度。
猜你喜欢
  • 1970-01-01
  • 2020-12-23
  • 1970-01-01
  • 2012-03-02
  • 1970-01-01
  • 1970-01-01
  • 2013-08-04
  • 2012-06-09
  • 1970-01-01
相关资源
最近更新 更多