使用map.get(Object)时TreeMap返回null

时间:2018-01-16 12:04:30

标签: java collections treemap

TreeMap 在使用get方法获取值时将值打印为null,而它与HashMap()一起正常工作。请在下面找到示例代码并为此提供输入。

它适用于Hashmap,因为它使用equals()/hashcode()方法,而TreeMap是SortedMap,它不使用equals方法来比较两个对象。相反,它使用 comparator / comparative 来比较对象,但在使用get方法获取对象时,它将null作为响应。请在此提供一些清晰度。

    import java.util.Comparator;
    import java.util.HashMap;
    import java.util.Map;
    import java.util.Map.Entry;
    import java.util.TreeMap;

    class Employees implements Comparable<Employees>, Comparator<Employees> {

        public Employees(String name, int id) {
            super();
        this.name = name;
        this.id = id;
    }

    private String name;
    private int id;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    @Override
    public boolean equals(Object obj) {
        if (this == obj)
            return true;
        if (obj == null)
            return false;
        if (!(obj instanceof Employees))
            return false;
        Employees other = (Employees) obj;
        if (id != other.id)
            return false;
        return true;
    }

    @Override
    public int hashCode() {
        return 1;
    }

    @Override
    public int compareTo(Employees o) {
        return 1;
    }

    @Override
    public int compare(Employees o1, Employees o2) {
        return 1;
    }
}

public class Employee {

    public static void main(String[] args) {
        // Map<Employees, Integer> m = new HashMap<>(); // equals will be used here.
        Map<Employees, Integer> m = new TreeMap<Employees, Integer>(); // no equals/hashcode used here as we use comparator/comparable to compare objects.
        Employees e1 = new Employees("abc", 11);
        Employees e2 = new Employees("abc", 12);
        System.out.println(m.put(e1, 1));
        System.out.println(m.put(e2, 2));
        **System.out.println(m.get(e2));**
    }
}

1 个答案:

答案 0 :(得分:8)

您的compareTo方法始终返回1,这意味着Employees对象不等于任何其他Employees对象(甚至不是自身){{1 }} 被关注到。

仅当compareTo返回compareTo时,0才会认为两个比较的实例相同。

顺便说一下,你总是回归TreeMap的{​​{1}}实施也很糟糕。虽然它有效(对于hashCode),但它会导致所有条目存储在同一个存储桶中,这会破坏1的性能。