集合
Collection(一组允许重复的对象)
list(允许重复,维护元素插入顺序)有序可重复
-
list实现类:
- ArrayList
- LinkedList
set(重复元素不能加入)无序不重复
-
set实现类
- HashSet
- TreeSet
-
set不是真正的无序,只是集合中的排列顺序和插入顺序不一样,只有当内容和地址信息都相等时才会出现对象覆盖
Map:复制对象,与Collection没什么关系
list:有序队列,每个元素都有他的索引。第一个元素索引值是0,实现类还有Vector,Stack,一个是线程安全的ArrayList,一个是专门为了栈操作准备的,都不是不可替代的,不用他们都可以实现他们的效果,所以很少用
Set是一个不允许重复的集合
实现过程set和map是直接依赖相关的。
map是一个映射接口,AbstractMap是一个抽象类,HashMap,WeakHashMap,TreeMap都是AbstractMap的子类
Iterator接口是遍历集合的工具
Collection的实现类都要实现
Iterator()函数,返回一个Iterator对象
ListIterator专门为了遍历list存在的
接口方法:
Collection:add添加一个元素
addALL将指定集合中的所有元素添加目标集合中
contains判断集合中是否包含这个元素
toArray返回一个表示该集合的数组
重要实现类的细节
ArrayList
- 动态数组,有一个默认初始容量(10),随着元素数量增加,每次添加会进行容量检查,如果快要溢出,将会进行扩容操作,将数组尺寸扩大为原来的1.5倍,所以在创建ArrayList时尽量预判一下容量尺寸,尽可能减少扩容操作带来的额外开销
- ArrayList擅长随机访问,是非同步的
LinkedList
- 双向链表
- 多出了addFirst,removeLast这种方法。因为双向链表对首尾元素的操作效率更高,也是非同步的,
Vector
- 就是一个线程安全的动态数组
Stack
- 继承自Vector,实现了一个后进先出的栈,提供了一些额外方法来方便操作栈顶元素
HashSet
-
可以存null,但只能存一个
-
底层是一个HashMap
- map中的key存set中的数据。
- value存一个统一的object对象
-
注意:HashSet虽然无序,但内部元素位置是固定的
-
HashSet判断元素是否重复要考equals和hashcode一起
TreeSet
- 有序集合,底层是TreeMap,
- 非线程安全
- 支持自然排序和定制排序
- 通过compareTo方法来比较元素是否相等
LInkedHashSet
- 继承自HashSet,底层是LinkedHashMap
- 根据元素的hashcode来决定元素真正的存储位置
- 同时再使用一个链表为何原色的次序。
- 遍历的时候看起来像是以插入顺序排布的,实际并不是
HashMap
- 以哈希列表结构实现
- 通过hash函数计算其位置
- 内部定义了hash表数组,元素通过哈希转换函数将元素的哈希地址转换成数组中存放的索引,如果有冲突,使用散列链表的形式将所有相同哈希地址的元素串起来
- java.util.map.Entry是一个单链表结构
TreeMap
- 有序的k-v集合,底层是一个红黑树,存储时会进行排序,自然排序和定制排序,构造方法不同
- 自然排序:key要实现Comparable接口
- 定制排序:自己创建一个Comparator对象,可以对map中所有的key进行排序,不需要实现Comparable
- 两个key通过comparaTo方法返回0,认为这两个key相等
- 自己定义需要equals返回true,同时comparaTo方法返回0