目录
java集合
集合存放于java.util包中,主要由3种:set、list和map
- Collection:是集合list、set、queue的最基本的接口
- 不包含重复元素
- List:有顺序的collection,并且可以包含重复元素。
- map:可以把键(key)映射到值(value)的对象,键不能重复。
List
List继承于Collection,是有序的,有三个实现类,分别是ArrayList、Vector、LinkedList
ArrayList
- 内部通过数组实现的
- 允许对元素快速随机访问
- 插入和删除元素代价较高
- 适用于随机查找和遍历,不适合插入和删除
Vector
- 通过数组实现
- 线程同步,即某一时刻只有一个线程能够写Vector,避免不一致性,但实现同步消耗高
- 访问速度比ArrayList慢
LinkList
- 内部通过链表结构实现
- 适合数据的动态插入和删除
- 随机访问和遍历速度慢
- 他还提供了List接口中没有定义的方法,专门用于操作表头和表尾元素,可以当做堆栈、队列和双向队列使用,实现双向链表
Set
set用户存储无序元素,并且值不允许重复。对象的相等性本质是对象hashCode值判断的。
HashSet(Hash表)
- HashSet是基于HashMap实现的
- 哈希表存放的是哈希值。HashSet是无序的,存储元素的顺序不是按照存入时的顺序,而是按照哈希值来存取。元素的哈希值是通过元素的hashcode方法来获取的。
- 允许放入null值
HashSet判断元素是否相同:首先判断两个元素的hashCode值,如果hashCode值相同,接着调用equals方法,如果结果为true,则视为同一元素。
注意:hashCode值相同,equals不一定为true,而equeals为true,hashCode一定相同
TreeSet(二叉树)
- TreeSet底层是基于二叉树原理实现的,每增加一个对象,都会进行排序(升序或降序),将对象插入二叉树指定位置
- 不允许放入null值
- Integer和String对象口可以进行默认TreeSet排序,而自定义类的对象不可以。自定义的类必须实现Comparable接口,重写compareTo()函数
LinkHashSet
- 继承于HashSet,又是基于LinkedHashMapshxian的。底层使用LinkedHashMap来存储所有元素,继承于HashSet,其所有方法操作又与HashSet相同。
Map
HashMap
- 底层实现是数组+链表+红黑树(java8中加入了红黑树,java7中的结构就是数组+链表)
- HashMap根据键的hashCode值存储数据,因此能够快速访问
- HashMap最多只允许一条记录的键为null,允许多条记录的值为null
- HashMap非线程安全,即某一时刻允许多个线程同时写HashMap,可能导致数据不一致
- 可以使用Collection的synchronizedMap方法使HashMap具有才能成安全能力,或者使用ConcurrentHashMap
java8中的HashMap结构
java8中的HashMap结构
我们知道,在java7中,查找某个元素的时候,根据hash值我们能够快速定位到数组的具体下标,但是,之后我们需要顺着链表一个个比较查找我们需要的元素,时间复杂度取决于链表的长度为O(n),为了降低这部分的开销,在java8中,当元素超过8个以后,会将链表转换为红黑树,这样查找的时间复杂度将可以降低O(logN)
ConcurrentHashMap
- ConcurrentHashMap支持并发操作,整个ConcurrentHashMap由一个个Segment组成
- 简单的说ConcurrentHashMap是一个Segment数组,Segment通过继承ReentrantLock进行加锁,每次加锁的是一个Segment,保证了每个Segment线程安全,也就实现了全局的线程安全
- ConcurrentHashMap默认有16个Segment,所以理论上同时支持16个线程并发写,只要他们分布在不同的Segment
- ConcurrentHashMap一旦初始化后不能扩容
ConcurrentHashMap数据结构
注意:在java8中,ConcurrentHashMap也引入了红黑树
HashTable
- 很多功能与HashMap类似,但是它继承自Dictionary类
- HashTable线程安全,任一时间只有一个线程能写HashTable,并发性不如ConcurrentHashMap,因为ConcurrentHashMap引入了分段锁。因此HashTable不建议在代码中使用,因为不需线程安全可以使用HashMap替代,需要线程安全可以用ConcurrentHashMap替代
TreeMap
- TreeMap可排序,实现了SortedMap接口,能够根据键排序,默认按简直的升序排序。也可以自定义。
- 在使用TreeMap,key必须实现Compareable接口,否则会抛出java.lang.ClassCastException类型的异常
LinkHashMap
- LinkHashMap是HashMap的子类,保存了记录的插入顺序,所以是有序的