使用char数组作为Hashtable键

时间:2012-04-14 21:24:09

标签: java hashtable

我在我的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

3 个答案:

答案 0 :(得分:7)

您不能将此类数组用作映射键,因为数组具有Objectequals的默认的,基于引用相等性的hashCode实现。使用String作为密钥会使您的程序按预期工作。

答案 1 :(得分:4)

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

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

http://ideone.com/YwEjV

答案 2 :(得分:2)

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