2

我正在使用Hashtable我的 java 程序。我只是对看到 的异常行为感到惊讶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
4

3 回答 3

8

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

于 2012-04-14T21:26:56.407 回答
4

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

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

http://ideone.com/YwEjV

于 2012-04-14T21:26:31.223 回答
2

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

于 2012-04-14T21:30:31.180 回答