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.