我有课
public class server_run{
class constatnt_Cells{
private int x;
private int y;
public constatnt_Cells(int fx , int fy) {
x = fx;
y = fy;
}
}
private static Map <constatnt_Cells,Integer> test = new HashMap<constatnt_Cells,Integer>();
}
我想创建hashmap
constatnt_Cells
作为键,Integer
作为值,但这里是静态部分在这种情况下不起作用的问题
我用一个例子解释我的问题
constatnt_Cells goldCell = new constatnt_Cells(2,6);
System.out.println(test.get(goldCell));
test.put(goldCell, 50);
此代码始终打印 null ,但如果我将hashmap
的键类型更改为例如整数
System.out.println(test.get(10));
test.put(10, 50);
它只打印 null 一次,之后它总是打印 50 ,所以constatnt_Cells
类和Integer
类之间有什么区别情况。
我的所有代码都在server_run
类中,就像它的名称服务器每秒运行一次这个类
答案 0 :(得分:-1)
由于评论部分无法发布这么多代码,我在这里发布答案。 以下是java 8中HashMap.get(o:Obejct)函数的源代码:
public V get(Object key) {
if (key == null)
return getForNullKey();
Entry<K,V> entry = getEntry(key);
return null == entry ? null : entry.getValue();
}
并且
final Entry<K,V> getEntry(Object key) {
if (size == 0) {
return null;
}
int hash = (key == null) ? 0 : hash(key);
for (Entry<K,V> e = table[indexFor(hash, table.length)];
e != null;
e = e.next) {
Object k;
if (e.hash == hash &&
((k = e.key) == key || (key != null && key.equals(k))))
return e;
}
return null;
}
您可以看到,当您想从HashMap获取对象时,它将首先计算key
的哈希码,并在内部哈希表中找到具有相同哈希码的条目。然后,如果密钥和key of the entry in hash table
是相等,如果它们指向==
运算符的相同引用,或者通过调用{{1你的类重写的方法。
以下是equals
方法
hash
因此,如果您希望实例按预期使用final int hash(Object k) {
int h = hashSeed;
if (0 != h && k instanceof String) {
return sun.misc.Hashing.stringHash32((String) k);
}
h ^= k.hashCode();
// This function ensures that hashCodes that differ only by
// constant multiples at each bit position have a bounded
// number of collisions (approximately 8 at default load factor).
h ^= (h >>> 20) ^ (h >>> 12);
return h ^ (h >>> 7) ^ (h >>> 4);
}
equals
函数。 >