java学习系列5--容器
1. 集合架构
Collection 接口存储一组不唯一,无序的对象
List 接口存储一组不唯一,有序(索引顺序)的对象
Set 接口存储一组唯一,无序的对象
Map接口存储一组键值对象,提供key到value的映射,key无序唯一,value无序不唯一
2. List
特点:有序,不唯一
ArrayList: 线性表中的顺序表
在内存中分配连续的空间,实现了长度可变的数组;
优点:遍历元素和随机访问元素的效率高
缺点:添加和删除需移动元素效率低,按照内容查询效率低
LinkedList:线性表中双向链表
采用双向链表存储方式;
优点:插入删除元素效率较高(前提是必须低效率查询,如果插入或删除发生在头尾可以减少查询次数);
缺点:遍历和随机访问元素的效率低
List遍历方法:for、for-each、Iterator迭代器
3. Set
特点:无序 唯一
HashSet
采用Hashtable哈希表存储结构
优点:添加、查询、删除速度快
缺点:无序
LinkedHashSet
采用哈希表存储结构,同时使用链表维护次序
有序
TreeSet
采用二叉树的存储结构
优点:有序、查询速度比List快(按照内容查询)
缺点:查询速度没有HashSet快
指明排序依据:实现Comparable接口,创建实现Compator接口的类
遍历方法:for-each、Iterator迭代器、无法使用for进行遍历(因为无序)
4. Map
特点:key-value映射,key无序 唯一,value无序 不唯一
LinkedHashMap:有序的HashMap 速度快
TreeMap:有序,速度没有hash快
5. Iterator
是迭代器设计模式的具体实现,专门实现集合遍历
Iterator方法
boolean hasNext():判断是否存在另一个可访问的元素
Object next(): 返回要访问的下一个元素
void remove(): 删除上次访问返回的对象
for-each循环:增强for循环,遍历数组或Collection的时候非常方便;
无需获得集合的或者数组的长度,无需使用索引访问元素,无需循环条件;
遍历集合时底层调用Iterator完成操作。
for-each缺陷:
遍历数组时不能方便访问下标值;
遍历集合时,不能方便的删除集合中的内容。
ListIterator和Iterator的关系:
都可以遍历List;
Iterator可以用于更多的集合,ListIterator只能用于List及其子类型;
Iterator只能顺序向后遍历,ListIterator还可以逆向遍历;
Iterator遍历过程只有remove(),ListIterator遍历过程有remove()、add()、set();
ListIterator可以定位当前的索引位置,nextIndex()和previousIndex()可以实现,Iterator没有此功能。
6. Collections
专门用来操作集合的工具类
构造方法私有,禁止创建对象;
提供一系列静态方法实现对集合的各种操作;
7. 旧的集合类
Vector
实现原理和ArrayList相同,功能相同,都是长度可变的数组,两者主要区别
Vector是早期JDK接口,ArrayList是替代Vector的新接口;
Vector线程安全,效率低下;ArrayList速度快,线程不安全;
长度需要增长时,Vector默认增长一倍,ArrayList默认增长50%;
Hashtable类
实现原理和HashMap相同,功能相同,底层都是哈希表结构,查询速度快,很多情况下可互用
区别:Hashtable继承Dictionary类,HashMap实现map接口;
Hashtable线程安全,HashMap线程不安全;
Hashtable不允许有null,HashMap允许null值
8. 集合线程安全
早期的Vector、Hashtable线程安全,是因为使用synchronized修饰方法
为了提高性能,使用ArrayList、HashMap替换,线程不安全,但是性能号,如果需要线程安全
使用Collections.synchronizedList(list);Collectiongs.synchronizedMap(map)解决;
底层使用synchronized代码块锁;
在大量并发情况下提高集合的效率和安全:
提供了新的线程同步集合类,使用Lock锁;
ConcurrentHashMap、CopyOnWriteArrayList、CopyOnWriteArraySet;


浙公网安备 33010602011771号