Map的实现类之间的关系

HashMap的key值唯一 , 在比较传入数据是否重复时,用的是key值得equals()和hasCode()方法 , 只有当两者都不同是 , 才会认定为是不同的元素,如果当hashCode相同时 , 由于HashMAp的储存位置与hashCode直接相关(因此它的等值查询性能是最快的) , 那么hashCode相同的元素理论上来说就会找到相同的地址 , HashMap是这样处理这个问题的 , 将新放入的元素放在hashCode的对应的位置 , 并将之前的元素挂在新元素的next后 , 形成一个链表.另外 , hashSet他的底层实现也依赖于hashMap , 创建HashSet就相当于创建一个HashMap , 只不过在value的位置创建一个空的对象 , hashSet传入的元素作为key传入他的hashMapdekey中.

而HashMap本身又是多个Entry(键值对映射)的集合.

//HashSet的源代码
private static final Object PRESENT = new Object();//静态变量

public HashSet() {
        map = new HashMap<>();
    }

public boolean add(E e) {
        return map.put(e, PRESENT)==null;
    }

TreeMap , 内部使用的是红黑树算法 , 在范围查询方面性能强 . TreeMap具有自动排序功能 , 是利用compare(Object o)自然排序和compareTo(Object o1 , Object o2)定制排序来有顺序的进行排序 . 其中compare(Object o)是Object类内部的方法,而compareTo(Object o1 , Object o2)是Comparetor比较器类的方法,在使用定制排序时,需要创建一个比较器对象作为参数传入TreeMap来供其排序使用 . TreeSet的底层也调用了TreeMap . 

TreeSet<Person> set = new TreeSet<>(new NameComparator());

class NameComparator implements Comparator<Person> {
    @Override
    public int compare(Person o1, Person o2) {
        if (o1.name.length() > o2.name.length()) {
            return 1;
        } else if (o1.name.length() < o2.name.length()) {
            return -1;
        } else {
            return 0;
        }
    }
}

HashTable被HashMap所替代,相当于Vactor对应ArrayList.

 

猜你喜欢

转载自blog.csdn.net/reveire7/article/details/82711774