一、集合框架
1、集合框架图
2、集合与数组的区别
- 长度:数组固定不变,集合可变;
- 内容:数组可以是基本类型,也可以是引用类型。集合只能是引用类型;
- 元素:数组只能存储同一种类型。集合可以存储不同类型;
3、常用集合分类
Collection: 接口的接口,对象的集合(单列集合)
|---List接口:元素按进入先后有序保存,可重复;
|---LinkedList接口实现类,链表、插入删除,没有同步,线程不安全;
|---ArrayList接口实现类,数组、随机访问,没有同步,线程不安全;
|---Vector接口实现类,数组,同步,线程安全;
|---Stack是Vector类的实现类;
|---Set接口:只接收一次数据,不能重复,并做内部排序;
|---HashSet使用hash表存储元素
|---LinkedHashSet链表维护元素的插入顺序
|---TreeSet底层实现为二叉树,元素排好序
Map: 接口,键值对的集合(双列集合)
|---Hashtable接口实现类,同步,线程安全;
|---HashMap接口实现类,没有同步,线程不安全;
|---LinkedHashMap双向链表和哈希表实现
|---WeakHashMap 缓存cache存取,有自清理机制
|---TreeMap红黑书对所有的key进行排序
|---IdentifyHashMap key值内容可重复(对象地址是不同的),却别与HashMap的key相同内容会替换
4、Collection集合常用方法
1、boolean add():在集合末尾添加元素;
2、boolean remove(Object o):若本类集合中有值与o的值相等的元素,则删除该元素,并返回true;
3、void clear():清除本类中所有元素,调用完该方法后本类集合将为空;
4、boolean contains(Object o):判断集合中是否包含某元素;
5、boolean isEmpty(): 判断集合是否为空;
6、int size(): 返回集合中元素个数;
7、boolean addAll(Collection c): 将一个类集c中的所有元素添加到另一个类集中;
8、Object[] toArray(): 返回一个包含了本类集中所有元素的数组,数组类型为Object[];
9、Iterator iterator(): 迭代器,集合的专用遍历方式;
二、List VS Set集合
1、List与Set区别
- 有序性:List按插入顺序排序;Set存取顺序不一致;
- 唯一性:List可以重复;Set元素唯一;
- 获取元素:List可以通过索引直接操作元素;Set不能根据索引获取元素;
2、List详解
- ArrayList 底层数据结构为数组,查询快、增删慢、线程不安全、效率高、可以存储重复元素;
- LinkedLIst 底层数据结构为链表,查询慢、增删快、线程不安全、效率高、可以存储重复元素;
- Vector 底层数据结构为数组,查询快、增删慢、线程安全、效率低,可以存储重复元素;
3、Set详解
- HashSet 底层数据结构为哈希表,元素无序且唯一,线程不安全、效率高、可以存储null元素;
- LinkedHashSet 底层数据结构为链表和哈希表共同实现,链表保证元素顺序与存储顺序一致,哈希表保证了元素的唯一性。线程不安全、效率高;
- TreeSet 底层数据结构采用二叉树实现,元素唯一且已经排好序;唯一性也需要重写hashCode和equals方法,二叉树结构保证了元素的有序性;
注:Set具有和Collection完全一样的接口,实际Set就是Collection,只是行为不同。
4、总结
- List特点:元素存在放入顺序,可重复; Set特点:元素无放入顺序,不可重复,元素会覆盖。(注:元素虽无放入顺序,但元素在Set中的位置由该元素的HashCode决定,其位置是固定的,加入Set的Object必须定义equals方法;另外list支持for循环,即通过下标来遍历,也可以用迭代器,而Set只能用迭代,因为Set无序,无法用下标来取值)
- List:和数组类似,可以动态增长,查找元素效率高,插入删除元素效率低,因会引起其他元素位置改变;Set:检索元素效率低下,删除和插入效率高,插入和删除不会引起其他元素位置改变。
- ArrayList和LinkedList的区别和使用场景
ArrayList
优点:ArrayList实现基于动态数组的数据结构,因地址连续,一旦数据存储好了,查询操作效率会比较高;
缺点:因为地址连续,ArrayList要移动数据,所以插入和删除操作效率比较低;
LinkedList
优点:linkedlist基于链表的数据结构,地址是任意的,所以开辟内存空间时不需要连续的地址,对于新增add和删除remove,LinkedList比较有优势。LinkedList适用于头部操作或插入到指定位置的场景;
缺点:因为LinkedList要移动指针,所以查询操作性能会较低;
应用场景
当需要对数据进行遍历访问情况下选用ArrayList;
当需要对数据进行多次增加或删除时选用LinkedList;
4、List与Set适用场景图
三、Map
Map没有继承Collection接口,Map中和集合是成对存在,每一个元素有键与值两部分构成,通过键找到对应的值,需要注意的是Map中的集合的键不能重复,但值可以重复,每一个键只能对应一个值。
1、常用方法
1、void clear()
2、boolean containsKey()
3、boolean containsValue()
4、Set entrySet() 返回Map中所包含的键值对所构成的Set集合,每个集合元素都是Map.entry对象
5、Object get()
6、boolean isEmpty()
7、Set keySet() 返回该Map中所有key所组成的set集合
8、Object put() 添加键值对
9、void putAll()
10、Object remove()
11、int size()
12、Collection values() 返回该Map里所有value组成的Collection
13、内部类Entry
① getKey()
② getValue()
③ setValue()