简介
集合类存放于Java.util包中,主要有3种,set,list,queue,map。
Collection,是集合set,list,queue的最基本的接口。
map,是映射表的基本接口。
iterator,迭代器,可以通过迭代器遍历结合中的数据。
结构
**Collection:**接口
- [List] 接口
**arrayList:**排列有序,可以重复,底层使用数组,查询速度快,增删速度慢,getter()和setter()方法块。线程不安全,当容量不够时newsize = oldsize*1.5+1
**linkedList:**排列有序,可以重复,底层使用双向循环链表数据结构,查询速度慢,增删速度快,add()和remove()方法块。线程不安全。
**vector:**排列有序,可以重复,底层使用数组,查询速度快,增删速度慢,线程安全,效率低,当容量不够时,默认扩展一倍。 - [Set ] 接口
**hashSet:**排列无需,不可重复,底层使用hash表实现,存取速度快,内部是hashMap
**TreeSet:**排列无需,不可重复,底层使用二叉树实现,排序存储,内部是TreeMap的SortedSet.
**LinkedHashSet:**采用hash表存储,并用双向链表记录插入顺序,内部是LinkedHashMap. - [Queue ] 接口:在两端出入的List,也可以用数组或链表实现。先进先出。
Map接口
- HashMap:键不可以重复值可以重复,key、value都可以为null,null值存放在table[0]的位置,底层是数组+链表,线程不安全, 默认初始值16,加载因子0.75。HashMap的容量大小一直是2的幂,初始化时会选择大于制定容量的第一个2的幂作为容量。newsize = oldsize * 2。Iterator it = map.entrySet().iterator()。遍历
Java8之后,hashMap由数组+链表+红黑树组成,当链表中的元素超过了8个之后,会将链表转换为红黑树。 - Hashtable:键不可以重复,值可以重复,key、value都不能为null。线程安全,实现方式为对整个表加锁synchronized,性能较差,底层数组+链表。初始容量11,默认加载因子为0.75,newsize = oldsize*2+1。put(key,value)时,当value为null时,直接抛出空指针异常,key为null时,调用key.hash方法时抛出空指针异常。Iterator it = map.entrySet().itreator()。遍历
- TreeMap :键不能重复,值可以重复,底层是二叉树。
- ConcurrentHashmap:底层使用数组+链表实现。key和value都不能为null,线程安全,实现线程安全是通过锁分离,为每一段加锁。并且扩容是在段内扩容。由Segment(桶)和HashEntry(节点)数组组成。Segment是一种可重入锁ReentrantLock。
默认有最多支持16个线程并发写。Java8也引入了红黑树。