一、Java集合框架概述
数组与集合的区别如下:
- 数组长度不可变化而且无法保存具有映射关系的数据;集合类用于保存数量不确定的数据,以及保存具有映射关系的数据。
- 数组元素既可以是基本类型的值,也可以是对象;集合只能保存对象。
Java集合类主要由两个根接口Collection和Map派生出来的,Collection派生出了三个子接口:List、Set、Queue(Java5新增的队列),因此Java集合大致也可分成List、Set、Queue、Map四种接口体系,(注意:Map不是Collection的子接口)。
其中List代表了有序可重复集合,可直接根据元素的索引来访问;Set代表无序不可重复集合,只能根据元素本身来访问;Queue是队列集合;Map代表的是存储key-value对的集合,可根据元素的key来访问value。
上图中淡绿色背景覆盖的是集合体系中常用的实现类,分别是ArrayList、LinkedList、ArrayQueue、HashSet、TreeSet、HashMap、TreeMap等实现类。
常用集合的分类:
Collection 接口的接口 对象的集合(单列集合)
├——- List 接口
:元素按进入先后有序保存,可重复
│—————- LinkedList接口实现类
, 链表, 插入删除, 没有同步, 线程不安全
│—————-ArrayList 接口实现类
, 数组, 随机访问, 没有同步, 线程不安全
│—————- Vector接口实现类 数组
, 同步, 线程安全
│ ———————- Stack
是Vector类的实现类
└——-Set 接口
: 仅接收一次,不可重复,并做内部排序
├—————-HashSet
使用hash表(数组)存储元素
│———————— LinkedHashSet
链表维护元素的插入次序
└ —————-TreeSet
底层实现为二叉树,元素排好序
Map 接口 键值对的集合 (双列集合)
├———HashTable 接口实现类
, 同步, 线程安全
├———HashMap 接口实现类
,没有同步, 线程不安全-
│—————–LinkedHashMap
双向链表和哈希表实现
│—————–WeakHashMap
├ ——–TreeMap
红黑树对所有的key进行排序
└———IdentifyHashMap
二、集合要了解得详情
Iterator接口和ListIterator接口
Iterator是一个接口,它是集合的迭代器。集合可以通过Iterator去遍历集合中的元素。Iterator提供的API接口如下:
- boolean hasNext():判断集合里是否存在下一个元素。如果有,hasNext()方法返回 true。
- Object next():返回集合里下一个元素。
- void remove():删除集合里上一次next方法返回的元素。
ListIterator接口继承Iterator接口,提供了专门操作List的方法。ListIterator接口在Iterator接口的基础上增加了以下几个方法:
- boolean hasPrevious():判断集合里是否存在上一个元素。如果有,该方法返回 true。
- Object previous():返回集合里上一个元素。
- void add(Object o):在指定位置插入一个元素。
以上两个接口相比较,不难发现,ListIterator增加了向前迭代的功能(Iterator只能向后迭代),ListIterator还可以通过add()方法向List集合中添加元素(Iterator只能删除元素)。
TreeMap实现类
TreeMap是SortedMap的实现类,是一个红黑树的数据结构,每个key-value对作为红黑树的一个节点。TreeMap存储key-value对时,需要根据key对节点进行排序。TreeMap也有两种排序方式:
- 自然排序:TreeMap的所有key必须实现 Comparable接口,而且所有的key应该是同一个类的对象,否则会抛出ClassCastException。
- 定制排序:创建TreeMap时,传入一个 Comparator对象,该对象负责对TreeMap中的所有key进行排序。
|
---|
JDK 7 以无参数构造方法创建 ArrayList 时,直接创建了长度是10的Object[]数组elementData 。 JDK 8 以无参数构造方法创建 ArrayList 时,实际上初始化赋值的是一个空数组。当真正对数组进行添加元素操作时,才真正分配容量。即向数组中添加第一个元素时,数组容量扩为 10。当ArrayList扩容的时候,首先会设置新的存储能力为原来的1.5倍,如果扩容之后仍小于必要存储要求minCapacity,则取值为minCapacity。若新的存储能力大于MAX_ARRAY_SIZE,则取值为Integer.MAX_VALUE |
|
---|
如果HashMap的大小超过了负载因子定义的容量,就会进行扩容。默认负载因子为0.75。就是说,当一个map填满了75%的bucket时候,将会创建原来HashMap大小的两倍的bucket数组(jdk1.6,但不超过最大容量),来重新调整map的大小,并将原来的对象放入新的bucket数组中。这个过程叫作rehashing,因为它调用hash方法找到新的bucket位置。 |
Collection接口常见方法 |
---|
![]() |
Map常见方法 |
---|
![]() |