JAVA 集合小结

提到集合,相信大家都不陌生,几乎所有的应用程序都会用到,自己也尝试阅读过其源码,觉得很有必要进行一些汇总总结。

以下内容(基于jdk1.8.0)算是自己对这一块的总结,也希望能给大家带来一些帮助。由于个人水平有限,难免会有理解不到位的地方,还是大家及时指出。

基本集合关系图


List集合重点学习的是ArrayList和LinkedList,ArrayList底层是数组,LinkedList底层是链表。

对ArrayList进行添加元素时,可能存在扩容的动作,每次扩容的增长因子为1/2,也就是增加当前数组长度的一半。

Set集合重点学习的是HashSet和TreeSet,Set是借助Map来存储元素的,HashSet内部封装了一个HashMap, TreeSet内部封装了一个TreeMap(准确的说是一个

NavigableMap接口指向的对象,目前jdk1.8中NavigableMap只有一个实现类TreeMap)

Queue集合重点学习的是PriorityQueue,

内部是一个实现了二叉树的数组,加入的元素要么实现了Comparable接口,要么在创建PriorityQueue时传递一个Comparator进来,根节点为数组的第0个元素,i节点的左右

子节点分别为2i+1和2i+2, 元素入队时与父节((n-1)/2)点比较,如果比父节点小(优先级高),就与父结节交换,保证每个节点都比所有子节点的值小(优先级高),但不保证不

同子树节点的有序,元素出队时先出队,然后从根节点开始从左右子节点中选择较小元素放在父节点位置上,然后从左/右子树开始,重复上述部署,只保证每一个父节点都比

子树节点的优先级高,从而保证出队列所有元素的顺序。

Map集合重点学习的是HashMap和TreeMap,特别需要注意的是Map并没有继承Collection接口

HashMap默认的初始大小是16,增长因子是0.75,内部是一个Node<K,V>类型的数组,Node<K,V>元素包含一个Node<K,V> next元素,换句话说,HashMap是一个数组加链

表;当数组元素填填充超过临界值(数组长度*0.75)时,数组需要扩容为原来的2倍;当链表长度超过8个时,数组需要扩容为原来的2倍。需要放到HashMap/HashSet中的元素必

须有hashCode和equals方法。

TreeMap是一个有序的二叉树,每个元素是Entry<K,V>,有left, right,parent元素,放入的元素必须能够比较出大小,要么实现了Comparable接口,要么在创建TreeMap时传递

一个Comparator进来。

辅助类

Collections

      有排序,二分查找,逆序,洗排(打乱顺序),交换元素顺序,填充元素,复制集合,求最大值,最小值 , 不可修改集合包装(如UnmodifiableCollection),同步集合包装

(SynchronizedCollection)等静态方法。

Arrays

      有排序,二分查找,判断两数组是否相等,填充元素,复制元素等静态方法。

并发容器集合关系图



List 重点学习CopyOnWriteArrayList(写时拷贝)

Set重点学习CopyOnWriteArraySet(写时拷贝)

Map重点学习ConcurrentHashMap(并发HashMap)

Queue重点学习ArrayBlockingQueque(阻塞队列,基于数组),LinkedBlockingQueue(阻塞队列,基于链表),PriorityBlockingQueque(优先级的阻塞队列)

及ConcurrentLinkedQueue(并发队列)

此外,在上面提到过的Collections中有一系列的SynchronizdeXXX的内部类,由synchronizedXXX的静态方法返回对应同步类的实例。


本文链接地址:http://blog.csdn.net/musa875643dn/article/details/71438978, 转载请保留出处。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值