Java集合类可分两种,Collection与Map,Collection用于存放多个单对象,Map用于存放key-value键值对类型对象。Collection又可分为List和Set两类,List可存放重复对象,Set中对象不可重复。List常用实现类如:ArrayList,LinkedList,
Vector及Stack;
Set接口常用有:HashSet、TreeSet.
Collection中方法:add、remove、get、iterator、contains
ArrayList:数组方式存放对象,初始大小10,每次扩容当前大小*1.5+1;add(int,E)插入指定位置,其后对象均后移动一位,
set(int,E)可替换指定位置对象;remove(E)遍历数组找到该对象,删除后再将后边对象往前复制一位;contains(E)遍历数组
LinkedList:基于双向链表,集合中每一个元素都知道其前一个元素与后一个元素的位置,add增加元素时不用考虑扩容及复制,
但它每增加一个元素都要新建一个Entry对象并修改相邻两个元素属性;remove遍历寻找后删除,无需位移;get比arrayList更
复杂,首先判断位置是否小于表size一半,若是则从头开始找,否则从尾开始找;contains则遍历整表
Vector:基于数组,但是add、remove、get、contains方法加了synchronized,为线程安全,每次扩容*2
Stack:继承于Vector,在其基础上实现了后进先出(LIFO);push压入调用addElement;pop调用peek来获取元素,并删除数组
最后一个元素;peek通过获取当前Object大小,并获取数组最后一个元素
HashSet:采用HashMap实现元素不重复,add将需要增加的元素作为map的key存入
TreeSet:采用treeMap实现,有序
HashMap:负载因子0.75,初始大小16;put()首先获取key的hashCode,再对hashCode做hash操作,再将hash出来的值
与Entry大小-1的值进行按位与操作,得出存储位置后,获取该位置entry,通过遍历该entry寻找hash值相等,key也相等的
entry对象,并替换其value完成put操作并返回旧的值,如未找到,则在对应数组位置增加新的entry;get与put同理;
当put操作发现Map容量不够将触发resize操作扩大数组容量,重新计算hash并复制对象到新数组中,HashMap是非线程安全的。
并发包concurrent
ConcurrentHashMap:分为16个segment,put先hash算得去哪个segment,再进入该segment调用put,此时需加锁
reentrantlock,余下动作与hashMap一样,完成后unlock;remove也加锁;size()操作遍历所有段,读取count及modcount,
两个均为volatile类型,遍历后再遍历一遍,若两次无差则返回,此操作无加锁
CopyOnWriteArrayList:线程安全,读操作无锁,add通过reentrantLock加锁,每次add均会创建一个新数组,将原数组复制
到新数组,再将新对象放至最末;remove亦加锁并复制