Java Map——key value是否可为null以及元素比较方式

8.key value是否可为null


TreeMap的key不为null的原因:Comparable和Comparator都需要key不为null。

在任何Map集合中,都要尽量避免KV设置为null值。

9.元素比较

  • 比较大小
    Comparable接口 —— compareTo方法
    Comparator接口 —— compare方法
    用在排序中,例如Arrays.sort()
  • 比较对象是否相等
    hashCode若相同,还需调用equals来进行区分。
    若equals相等,则hashCode返回相等,任何时候覆盖equals,则必覆盖hashCode()。
    逆反命题:若hashCode不等,则equals必不相等
 if (p.hash == hash &&
      ((k = p.key) == key || (key != null && key.equals(k))))
  • HashMap使用hashCode/equals
    TreeMap使用Comparable/Comparator接口
  • 来看看String的hashCode/equals
    hashCode是使用val值进行计算的,所以只要equals,则hashCode一定相等。
    public int hashCode() {
        int h = hash;
        if (h == 0 && value.length > 0) {
            char val[] = value;

            for (int i = 0; i < value.length; i++) {
                h = 31 * h + val[i];
            }
            hash = h;
        }
        return h;
    }
    public boolean equals(Object anObject) {
        if (this == anObject) {
            return true;
        }
        if (anObject instanceof String) {
            String anotherString = (String)anObject;
            int n = value.length;
            if (n == anotherString.value.length) {
                char v1[] = value;
                char v2[] = anotherString.value;
                int i = 0;
                while (n-- != 0) {
                    if (v1[i] != v2[i])
                        return false;
                    i++;
                }
                return true;
            }
        }
        return false;
    }

推荐阅读更多精彩内容

  • 一、基本数据类型 注释 单行注释:// 区域注释:/* */ 文档注释:/** */ 数值 对于byte类型而言...
    龙猫小爷阅读 3,465评论 0 16
  • java笔记第一天 == 和 equals ==比较的比较的是两个变量的值是否相等,对于引用型变量表示的是两个变量...
    jmychou阅读 950评论 0 3
  • Java集合类可用于存储数量不等的对象,并可以实现常用的数据结构如栈,队列等,Java集合还可以用于保存具有映射关...
    小徐andorid阅读 1,377评论 0 13
  • Java集合框架 Java平台提供了一个全新的集合框架。“集合框架”主要由一组用来操作对象的接口组成。不同接口描述...
    小石38阅读 167评论 0 0
  • 上一篇文章介绍了Set集合的通用知识。Set集合中包含了三个比较重要的实现类:HashSet、TreeSet和En...
    Ruheng阅读 12,910评论 3 55