Java集合类

 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亦加锁并复制







评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值