为什么这个 HashMap.get 返回 null?

2024-03-03

我正在尝试创建一个Hashmap为我执行查找。但是,当我运行此测试代码时,输​​出为空。我认为这与密钥存储方式的性质有关,但我并不肯定。也许这是一个类似的怪癖,就像var1 == var2不等于,除非它们指向内存中的同一个对象,而您必须使用var1.equals(var2)?

有两个类来测试这一点。

测试卡.java

import java.util.HashMap;

public class TestCard {

     // HashMap for SpecialK Lookup
    private static HashMap<Card, Integer> specialKLookup = new HashMap<Card, Integer>();

    // Constructor
    public TestCard(){
    }

    public static void main(String[] args) {
        Card[] cards = new Card[3];
        cards[0] = new Card((short)12, (short)0);
        cards[1] = new Card((short)0, (short)1);
        cards[2] = new Card((short)5, (short)2);

        /* Build SpecialK Lookup HashMap.
         * Ace of Spades = 0
         * Ace of Hearts = 1
         * Ace of Diamonds = 2
         * Ace of Clubs = 3
         * ...
         * Two of Clubs = 51
         */
        Integer specialKCounter = 0;
        for(int i=12;i>=0;i--){
                for (int j=0;j<4;j++){
                        specialKLookup.put(new Card((short)i, (short)j), specialKCounter++);
                }
        }

        System.out.println(specialKLookup.get(cards[0]));
    }
}

卡.java

public class Card{
    private short rank, suit;

    private static String[] ranks = {"2", "3", "4", "5", "6", "7", "8", "9", "10", "Jack", "Queen", "King", "Ace"};
    private static String[] suits = {"Spades", "Hearts", "Diamonds", "Clubs"};

    //Constructor
    public Card(short rank, short suit){
        this.rank = rank;
        this.suit = suit;
    }

    // Getter and Setters
    public short getSuit(){
        return suit;
    }

    public short getRank(){
        return rank;
    }

    protected void setSuit(short suit){
        this.suit = suit;
    }

    protected void setRank(short rank){
        this.rank = rank;
    }   
}

班上 (Card)缺少正确的实现equals(Object) http://download.oracle.com/javase/6/docs/api/java/lang/Object.html#equals%28java.lang.Object%29 and hashCode() http://download.oracle.com/javase/6/docs/api/java/lang/Object.html#hashCode%28%29

如果没有这两个定义的话就是行不通。 (它编译得很好,因为这些方法都是虚拟的,并且在所有对象中继承,因为它们是对象的一部分:HashMap 无法在编译时强制执行此操作。)请参阅上面的链接以获取所需的契约。

这两种方法都需要实现,因为hashCode确定 HashMap 实现中使用的哈希桶,以及equals是为了确保一个对象是值相等的(多个对象可以具有相同的值)hashCode, 这就是为什么equals也是必需的)。看哈希表 http://en.wikipedia.org/wiki/Hash_table有关更一般的哈希详细信息。

如果这些方法未重载,则使用 Object 中定义的实现。那是,x.equals(y)有近-x == y语义和hashCode每份合约返回一个稳定的数字。这有效地使地图像恒等映射(当 Card 对象是键时):仅完全相同的物体可以检索以前存储的值——正如观察到的那样,每个其他 get 都将返回 null。

快乐编码。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

为什么这个 HashMap.get 返回 null? 的相关文章

随机推荐