带有自定义类类型

时间:2015-12-08 05:05:56

标签: java

我有课

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类中,就像它的名称服务器每秒运行一次这个类

1 个答案:

答案 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); } hashcode和equals函数。 >