List接口
存放的对象是有序的,而且是可以重复的,关注索引,有一系列的索引方法,所以查询速度快,在修改元素时涉及到元素的位置移动,所以增加和删除元素慢。
Arraylist(数组)
- 线程异步,线程不安全。
- 动态数组结构,序号索引元素,随机访问set、get较快。
- 每次扩充50%。
Vector(数组)
- 使用了synchronized方法,线程同步,线程安全。
- 动态数组结构,序号索引元素,随机访问set、get较快。查找一个指定位置的数据性能等同于ArrayList。
- 每次扩充100%,在存储数据量较大时,性能优于ArrayList。
Vector的源码可以参考Arraylist(数组)在其方法上添加了synchronized关键字保证同步。
Linkedlist(链表)
- 线程异步,线程不安全。
- 链表结构,分配的内存不是连续的,只需要修改前后指针,所以新增删除元素速度比较快。
Set接口
Set里存放的对象是无序,不能重复的,集合中的对象不按特定的方式排序,只是简单地把对象加入集合中。
Hashset(HashMap)
- HashSet的存储是无序的 ,没有前后关系,他并不是线性结构的集合。
- 内部使用HashMap,将元素存储为键值对(键值对的键为将存储的值,键值对的值为假的Object对象(元素,Object)),所以不能存储equals相同的两个元素。
- 一般情况下,无序的数据结构采用的算法效率是优于有序结构的。
TreeSet(TreeMap)
- TreeSet的存储是有序的 ,没有重复元素的集合。
- 内部使用TreeMap,底层为树结构,使用它可以从Set中提取有序序列,同时元素必须实现comparable接口。
Map接口
Map集合中存储的是键值对,键不能重复,值可以重复。根据键得到值,对map集合遍历时先得到键的set集合,对set集合进行遍历,得到相应的值。
HashMap
- 线程异步、线程不安全。
- 根据键的HashCode值存储数据,根据键可以直接获取它的值,具有很快的访问速度,遍历时,取得数据的顺序是完全随机的。
- 因为键对象不能重复,所以HashMap最多只允许一条记录的键为Null,允许多条记录的值为Null。
Hashtable
- 线程同步、线程安全的。
- Hashtale在写入时比较慢,不允许记录的键或者值为null,同时效率较低。
TreeMap
- 线程异步,线程不安全。
- 能够根据键进行排序,默认按键值的升序排序,遍历TreeMap时得到的数据是排过序的。
- 不允许键为null。