Java 使用char数组作为哈希表键

Java 使用char数组作为哈希表键,java,hashtable,Java,Hashtable,我正在java程序中使用哈希表。看到Hastable的异常行为,我很惊讶。下面是我的代码(这不是我的最终代码,我只是用运行异常的代码创建了一个新的简单项目) Hashtable h1=新的Hashtable(); char[]key=Integer.toString(12.toCharray(); char[]val=Integer.toString(21.toCharray(); h1.put(键,val); System.out.println(h1.containsKey(Integer.

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

Hashtable h1=新的Hashtable();
char[]key=Integer.toString(12.toCharray();
char[]val=Integer.toString(21.toCharray();
h1.put(键,val);
System.out.println(h1.containsKey(Integer.toString(12.tocharray());//因为哈希表中有12,所以应该打印为true

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


不能将这样的数组用作映射键,因为数组具有默认的、基于引用等式的
对象
实现
等于
哈希码
。使用
String
作为键将使您的程序按所需工作。

如果a和b是2个数组,则a等于(b),如果a==b。如果a==b,那么a的hashCode==b的hashCode。因为这里不是这样,所以在哈希表中找不到它。使用数组作为哈希表键是个坏主意。另外,使用任何可变对象作为哈希表键也是一个坏主意。

您使用char[]而不是String的具体原因是什么?可能的重复项您甚至不能在Hashmap中使用StringBuffer/Builder作为键。它们指的不是同一个对象。在上面的代码中,我使用了
Integer.toString()
。但在我的实际代码中,我使用的是
char[]
。那么现在可以做什么呢?使用
String
s,而不是
char[]
s作为映射键。另外,您可能应该使用
HashMap
,而不是传统的
Hashtable
。。。另外,编写
“12.tocharray()
新字符[]{'1',2'}
而不是
整数.toString(12.tocharray()
)也会提高代码的清晰度。您的逻辑并不完全正确,因为(实际上)
.equals()
.hashCode())
方法实现是独立的。equals和hashCode合同的一部分是相互一致的。我假设Java遵循自己的约定,但我使用了整数数组。我没有面临任何问题。@你有,也许你只是没有注意到。。但是,由于basic语句(“数组具有引用相等性”)对任何数组都是正确的,所以它就是这样。@Voo是正确的<代码>int[]a={1};int[]b={1};System.out.println(a==b)
prints
false
    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
char[] one = Integer.toString(12).toCharArray();
char[] two = Integer.toString(12).toCharArray();
System.out.println(one == two); // false