(一)Java集合(List,Set,Map)
Collection集合关系图
注意:
- LinkedList既可以实现Queue接口,也可以实现List接口。实现Queue接口会窄化对LinkedList方法的访问权限(即只能访问Queue接口定义的方法,不能访问非Queue的方法),以使得只有恰当的方法才可以使用。
- SortedSet是个接口,只有TreeSet这一个实现可用,它里面的元素一定是有序的。
总结
Collection接口:
---List有序,可重复
- ArrayList
优点:底层数据结构是数组,查询快,增删慢。
缺点:线程不安全,效率高。
- Vector
优点:底层数据结构是数组,查询快,增删慢。
缺点:线程安全,效率低。
- LinkedList
优点:底层数据结构是链表,查询慢,增删快。
缺点:线程不安全,效率高。
---Set无序,唯一
- HashSet
底层数据结构是哈希表。(无序,唯一)
如何保证元素唯一性?
依赖两个方法,hashCode()和equal()
- LinkedHashSet
底层数据结构是链表和哈希表。(FIFO插入有序,唯一)
由链表保证元素有序。
由哈希表保证元素唯一。
- TreeSet
底层数据结构是红黑树。(唯一,有序)
如何保证元素有序?
自然排序,比较器排序
如何保证元素唯一性?
根据比较的返回值是否是0来决定。
针对collection集合,我们该使用谁呢?(掌握)
唯一吗?
是:Set
排序吗?
是:TreeSet或LinkedHashSet
否:HashSet
否:List
要安全吗?
是:Vector
否:ArrayList或LinkedList
查询多:ArrayList
增删多:LinkedList
TreeSet,LinkedHashSet和HashSet区别
- TreeSet主要功能用于排序。
- LinkedHashSet的主要功能用于保证FIFO,即有序的集合(先进先出)。
- HashSet只是通用的存储数据的集合。
相同点:
三者都实现Set接口,三者都不是线程安全的,如果要使用线程安全可以Collection.synchronizedSet()。
不同点:
HashSet插入数据最快,其次LinkHashSet,最慢的是TreeSet因为内部实现排序。
HashSet不保证有序,LinkedHashSet保证FIFO即按插入顺序排序,TreeSet按照内部实现排序,也可以自定义排序规则。
HashSet和LinkedHashSet允许存在null数据,但是TreeSet中插入null数据会报空指针异常。
代码比较
TreeSet两种排序方式比较
1.排序的引入(以基本数据类型的排序为例)
2.如果引用数据类型呢,比如自定义对象,又该如何排序呢?
(1)自然排序
自然排序要进行一下操作:
1.Student类中实现Comparable接口。
2.重写Comparable接口中的CompareTo方法。
(2)比较器排序
1.单独创建一个比较类,这里以MyComparator为例,并要让其继承Comparator接口。
2.重写Comparator接口中的Compare方法。
3.在主类中使用下面的构造方法。
Map集合关系图
Map接口有三个比较重要的实现类,分别是HashMap、TreeMap和HashTable。
- TreeMap是有序的,HashMap和HashTable是无序的。
- HashTable是同步的,HashMap的方法不是同步的。这是两者最主要的区别。
这就意味着:
- Hashtable是线程安全的,HashMap不是线程安全的。
- HashMap效率较高,HashTable效率较低。
- Hashtable不允许null值,HashMap允许null值(key和value都允许)。
- 父类不同,Hashtable的父类是Dictionary,HashMap的父类是AbstractMap。
参考文章https://blog.****.net/zhangqunshuai/article/details/80660974