Collection(单列集合 value)
- 有两个重要的接口,list、set
- collection实现子类可以存放多个元素,每个元素可以是Object
- 有些Collection的实现类,可以存放重复的元素,有些不可以
- 有些Collection的实现类,有些是有序的(List),有些不是有序(Set)
- Collection接口没有直接的实现子类,是通过它的子接口Set和List来实现的
List
- List集合类中元素有序、且可重复
- List集合中的每个元素都有对应的顺序索引,即支持索引
- List容器中的元素都对应一个整数型的序号记载其在容器中的位置,可以根据序号存取容器中的元素
- 常用的:ArrayList、LinkedList、Vector
- ArrayList
可变数组
- LinkedList
双向链表
- 如果我们改查的操作多,选择ArrayList
- 如果我们增删的操作多,选择LinkedList
- 一般来说,在程序中,80%~90%都是查询,因此大部分情况下会选择ArrayList
- 在一个项目中,根据业务灵活选择,也可以这样,一个模块使用ArrayList,另一个模块是LinkedList.
Set
- Set接口实现类的对象,不能存放重复的元素,可以添加一个Null
- Set接口对象存放数据是无序的(即添加的顺序和取出的顺序不一致)
- 取出的顺序的顺序随饭不是添加的顺序,但是它是固定的
- 获取元素的时候不能通过索引去获取
HashSet
- HashSet底层是HashMap
- HashMap的底层是(数组+链表+红黑树)
- 可以存放null,但是只能有一个
- HashSet不保证元素是有序的,取决于hash后,在确定索引的结果
- 不能有重复的元素
/* 1.HashSet底层是HashMap
2.添加一个元素时,先得到hash值-会转成->索引值
3.找到存储数据表table,看这个索引位置是否已经存放的有元素
4.如果没有直接加入
5.如果有,调用equals比较,如果相同,就放弃添加,如果不同,则添加到最后
6.在Java8中,如果一条链表的元素个数超过TREEIFY_THRESHOLD(默认是8),并且table的大小 >= MIN_TREEIFY_CAPACITY(默认是64)就会进行树化(红黑树)
*/
Vector
Map(双列集合 key-value)
- Map用于保存具有映射关系的数据Key-Value
- Map中的key和value可以是任何引用类型的数据额,会封装到HashMap$Node对象中
- Map中的Key不允许重复,原因和HashSet一样
- Map中的Value可以重复
- Map的key可以为null,value也可以为null,注意key为null只能有一个,value为null可以多个
- 常用String作为Map的key
- key和value之间存在单向一对一关系,即通过指定key总能找到对应的value
Hashtable
- 存放的元素是键值对:即key-value
- hashtable的键和值都不能为null,否则会抛出NullPointerException
- hashTable 使用方法基本上和HashMap一样
- hashTable是线程安全的(synchronized),hashMap是线程不安全的
Properties
- Properties类继承自Hashtable类并实现了Map接口,也是使用一种键值对的形式来保存数据
- 它的会用特点Hashtable类似
- Properties和可以用于从xxx.properties文件中,加载数据到Properties类对象,并进行读取和修改
- xxx.properties文件通常作为配置文件
开发中如何选择集合实现类
-
- 先判断存储的类型
-
- 一组对象:Collection接口
- 允许重复:List
- 增删多:LiknedList(底层维护了一个双向链表)
- 改查多:ArrayList(底层维护Object类型可变数组)
- 不允许重复:Set
- 无序:HashSet(底层是HashMap,维护了一个哈希表-即 数组+链表+红黑树)
- 排序:TreeSet
- 插入和取出的顺序一致:LinkedHashSet,维护数组+双向链表
-
- 一组键值对:Map
- 键无序:HashMap(底层是:哈希表 jdk7:数组+链表 , jdk8:数组+链表+红黑树)
- 键排序:TreeMap
- 键插入和取出顺序一致:LinkedHasMap
- 读取文件 Properties