Java 使用char数组作为哈希表键
我正在java程序中使用哈希表。看到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.
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)
printsfalse
。
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