所有集合框架都包含接口、实现类和算法,算法执行一些有用的计算 (如Collections实现了对集合的排序和遍历)
容器 | 集合 | 数组 |
---|---|---|
长度 | 可变 | 固定 |
存储内容 | 对象 | 对象、基本数据类型 |
存储数据类型 | 不固定 | 固定 |
-
Collection接口:存储一组重复、无序的对象
-
List接口:存储一组重复、有序的对象,重写equals方法保证唯一性
①ArrayList:动态数组,查询速度快,JDK7中默认容量是10,扩容到1.5倍
②Vector:类似于ArrayList,扩容到2倍,但线程安全
Stack:例如递归
③LinkedList:底层数据结构是双向链表,增删速度快LinkedList特有方法 boolean offerFirst() //在列表开头插入指定元素,优先级比addFirst()大 E peekFirst() //获取但不删除此列表的第一个元素,此列表为空返回null getFirst() //如果列表为空,会抛出异常 E pollFirst() //获取并删除此列表的第一个元素 数组和List间的转换:Arrays.asList(array)、list.toArray()
-
Set接口:存储一组唯一且无序的对象
①HashSet:基于HashMap ,通过hashCode和equals确保元素唯一性
存储对象时先比较hashCode,若哈希表中有对应的hash码才调用equals方法判断hash码相同的对象是否为同一对象(返回false存储新对象)
②TreeSet:底层数据结构是二叉树(有序的遍历)
Queue接口
-
-
Map接口:存储键值对(键唯一无序)
①HashTable:线程安全且键值不能为空,Properties的父类,保留类不建议使用
注:ConcurrentHashMap位于JUC并发包,线程安全能解决性能低的问题
②HashMap:允许键或值为空,默认初始容量16
底层是数组和单向链表,在JDK8中Hash冲突少时使用链表存储相同hash值的数据,多时使用红黑树
LinkedHashMap:散列表+双向链表
③TreeMap:底层数据结构是二叉树
HashMap特有方法 Object put(Object key,Object value) //放入集合 boolean containsKey(Object key) Set keySet() //获取所有key的集合 Collection values() //获取所有value的集合 Set<Map.Entry<K,V>> entrySet() //获得键值对的集合
-
Iterator接口:迭代器,即集合元素的取出方式
List有两种迭代器,Set只有一种迭代器,Map没有迭代器(转换为Set集合)
增强for的底层原理是迭代器,只有列表迭代器能在遍历时增删改查
迭代器是单列集合的,只有重写Iterable接口的iterator方法才能迭代遍历