先上图,大概的继承结构。
知识点1:List、Set、Map是这个集合体系中最主要的三个接口。
其中List和Set继承自Collection接口。
Set不允许元素重复。HashSet和TreeSet是两个主要的实现类。
List有序且允许元素重复。ArrayList、LinkedList和Vector是三个主要的实现类。
Map也属于集合系统,但和Collection接口不同。Map是key对value的映射集合,其中key列就是一个集合。key不能重复,但是value可以重复。HashMap、TreeMap和Hashtable是三个主要的实现类。
SortedSet和SortedMap接口对元素按指定规则排序,SortedMap是对key列进行排序。
知识点2:ArrayList和Vector有的区别;HashMap和HashTable的区别
Vector和HashTable是线程同步的(synchronized)。性能上,ArrayList和HashMap分别比Vector和Hashtable要好。
知识点3:如何排序
可以用java.util.Collections.sort(List list)和其重载方法java.util.Collections.sort(List list,Comparator c),第一种list内的如果是object,需要实现Comparable,复写其compareTo方法,第二种可以声明一个匿名内部Comparator ,复写其compareTo方法。
用
Comparable的时候,return this.id - ((PersonBean)o).id;是按id升序
Comparator的时候,return o1.id-o2.id;是按id升序
知识点4:hashSet去重
我们会发现hashset存储int或者string是可以去重的,存储我们自己定义的对象,发现不能去重,这是为什么呢?
这要从hashset的去重原理开始讲起,hashset去重,实际上是因为底层维护了一个hashmap,而hashmap中的put方法,我们看到key不能重复,当用对象当key的时候,有这么一个判断。
先判断对象的hashcode是否一样,如果不一样,肯定就是不同的两个对象,如果是一样,再用equals比较,看true还是false.
那就很清楚了,我们new出来的两个对象,如果没有复写hashcode方法,所有对象都是继承object,object的hashcode方法返回的是一个规则加一个随机数,因此两个对象的默认hashcode值肯定不相同。
然后我们去看看int 和 String, 发现其都复写hashcode方法,都跟他们的值有关,值相同hashcode就相同。那怎么复写hashcode呢,因为hashcode方法是要得到一个int值,我通常是把每一个属性的hash相乘,但即使如此,仍有可能两个属性不完全相同的对象,他的hashcode是一样的,所以即使hashcode相同,仍要复写equals,比较每一个属性。同时,这也降低了比较的次数,先比较hash,再equals。所以hashcode如何复写,只有更好,没有最好。呐,hashcode值一样,还得equals方法为true,所以我们也得复写equals方法,比对对象的每一个属性值,如果相同就认为是同一个对象。int和string也是这么干的,如果值相同就是同一个对象。
彩蛋:如何直接使用一个集合,又去重又排序?
可以使用treeSet,并且让存储的对象实现Comparable接口即可。又去重又排序