一、集合引入
数组、集合都用于对多个对象进行存储,数组特点及缺点如下1.1、1.2,故引入集合
1.1 数组特点
- 长度确定
- 类型确定
- 有序、可重复
1.2 数组缺点
- 长度不可修改
- 删除、插入等操作效率不高
- 无序、不重复的无法满足
数组与集合的区别如下:
- 数组长度不可变化而且无法保存具有映射关系的数据;集合类用于保存数量不确定的数据,以及保存具有映射关系的数据。
- 数组元素既可以是基本类型的值,也可以是对象;集合只能保存对象(基本数据类型存在集合中须转为包装类)。
二、集合框架
Java集合类主要由两个根接口Collection和Map派生出来的,Collection派生出了三个子接口:List、Set、Queue,因此Java集合大致也可分成List、Set、Queue、Map四种接口体系(注意:Map不是Collection的子接口)
其中List代表了有序可重复集合,可直接根据元素的索引来访问;Set代表无序不可重复集合,只能根据元素本身来访问;Queue是队列集合;Map代表的是存储key-value对的集合,可根据元素的key来访问value。
三、List--单列集合--有序可重复--按索引值顺序存储(动态数组)
- Vector:底层结构为Object[],线程安全(各方法添加synchronized关键字)
- ArrayList:底层结构为Object[],插入、删除数据须移动数据
- LinkedList:底层结构为双向链表,插入、删除数据无须移动数据,效率比Arraylist高
图3.1 双向链表结构图
//ArrayList存数据源码
public boolean add(E e) {
ensureCapacityInternal(size + 1); // Increments modCount!!
elementData[size++] = e;
return true;
}
四、Set--单列集合--无序不可重复--按hashcode值顺序存储(输出顺序永远相同)
- HashSet:底层结构为Map,须重写hashcode和equals方法
- TreeSet:底层结构为Map,可以按对象指定属性进行排序(自然排序、定制排序)
五、Map--key无序、不可重复--key所在的类要重写hashcode和equals方法
HashTable:古老实现类,线程安全,不可存null值
--properties:常用于处理配置文件
Hashmap:底层结构为数组+链表+红黑树(jdk1.7及之前是数组+链表),可存null值
--LinkedHashMap:频繁遍历时,效率高于HashMap
TreeMap:底层结构为红黑树,保证按照添加的key进行排序,实现排序遍历