您好、欢迎来到现金彩票网!
当前位置:秒速牛牛投注 > 桶链算法 >

关于Java集合总结

发布时间:2019-09-12 18:53 来源:未知 编辑:admin

  在尽可能短的篇幅里,将所有List、Map、Set、Queue的特征与实现方式捋一遍。适合所有精通Java其实还不那么自信的人阅读。

  以数组实现。节约空间,但数组有容量限制。超出限制时会增加50%容量,用System.arraycopy()复制到新的数组,因此创建数组时最好能给出数组大小的预估值。默认第一次插入元素时创建大小为10的数组。

  按数组下标访问元素--get(i)/set(i,e) 的性能很高,这是数组的基本优势。

  直接在数组末尾加入元素--add(e)的性能也高,但如果按下标插入、删除元素--add(i,o), remove(i), remove(e),则要用System.arraycopy()来移动部分受影响的数组,性能就变差了,这是数组的基本劣势。

  以双向链表实现。链表无容量限制,但双向链表本身使用了更多空间,也需要额外的链表指针操作。

  在任何地方插入、删除元素时修改前后节点的指针即可,但还是要遍历部分链表的指针才能移动到下标所指的位置,只有在链表两头的操作--add(), addFirst(),removeLast()或用iterator()上的remove()能省掉指针的移动。

  并发优化的ArrayList。用CopyOnWrite策略,在修改时会复制快照到一个新数组来修改,改完再让内部指针指向新数组。

  因为对快照的修改对读操作来说不可见,所以只有写锁没有读锁,加上复制的成本,典型的适合读多写少的场景。

  如果更新频率较高,或数组较大时,还是Collections.synchronizedList(list),对所有操作用同一把锁来保证线程安全更好。

  增加了addIfAbsent(e)方法,会遍历数组来检查元素是否已存在,性能可想像的不会太好。

  没有按元素值排序的SortedList的实现,在线程安全类中也没有实现无锁算法的ConcurrentLinkedList,凑合着用Set与Queue中等价的类时,会缺少一些List的特有方法。

  以Entry[]数组实现的哈希桶数组,用Key的哈希值取模桶数组的大小可得到数组下标。

  插入元素时,如果两条Key落在同一个桶(比如哈希值1和17取模16后都属于第一个哈希桶),Entry用一个next属性实现多个Entry以单向链表方式的存放,后入桶的Entry将next指向桶当前的Entry。

  查找哈希值为17的key时,先定位到第一个哈希桶,然后以链表遍历桶里所有元素,逐个比较其key值。

  当Entry数量达到桶数量的75%时,会成倍扩容桶数组,并重新分配所有原来的Entry,所以这里也需要一个合理的预估值。

  取模用位运算(hash & (arrayLength-1))会比较快,所以数组的大小永远是2的N次方, 你随便给一个初始值比如17会转为32。默认初始值是16。

  在JDK8里,新增默认为8的閥值,当一个桶里的Entry超过8个,就不以单向链表而以红黑树来存放以加快查找速度。

  扩展HashMap增加双向链表的实现。支持iterator()时按Entry插入的顺序来排序(只算插入不算更新, 如果设置accessOrder属性为true,则所有读写访问都算)。

  实现上是在Entry上再增加属性before/after指针,插入时把自己加到Header Entry的前面去,如果所有读写访问都要排序,还要把前后Entry的before/after拼接起来以在链表中删除掉自己。

  以红黑树实现。支持iterator()时按Key值排序,可按实现了Comparable接口的Key的自然顺序升序排序,或由传入的Comparator控制。红黑树的原理见入门教程,可想象的,在树上插入/删除元素的代价一定比HashMap的大。

  并发优化的HashMap,默认16把写锁(可以设置更多),有效分散了阻塞的概率,而且没有读锁。

  数据结构为Segment[],Segment里面才是哈希桶数组,每个Segment一把锁。Key先算出它在哪个Segment里,再算出它在哪个哈希桶里。

  没有读锁是因为put/remove动作对数据结构的改变最终是个原子动作(put是一个对数组元素/Entry 指针的赋值操作;remove是一个对 entry.next 的赋值操作,rehash是一个对数组引用的赋值操作),因此read不会看到一个更新动作的中间状态。

  JDK6新增的并发优化的SortedMap,以SkipList实现。SkipList是红黑树的一种简化替代方案,是个很流行的有序集合算法,见入门教程。Concurrent包中选用它是因为它支持无锁算法,而红黑树则没有好的无锁算法。

  是的,以双向链表实现的LinkedList既是List,也是Queue。它是唯一一个允许放入null的Queue。

  普通数组只能快速在末尾添加元素,为了支持FIFO,从数组头快速取出元素,就需要使用循环数组:有队头队尾两个下标:弹出元素时,队头下标递增;加入元素时,如果已到数组空间的末尾,则将元素循环赋值到数组[0](如果此时队头下标大于0,说明队头弹出过元素,有空位),同时队尾下标指向0,再插入下一个元素则赋值到数组[1],队尾下标指向1。如果队头与队尾的下标重合,说明数组所有空间已用完,进行双倍的扩容。

  用二叉堆实现的优先级队列,详见入门教程,不再是FIFO而是按元素实现的Comparable接口或传入Comparator的比较结果来出队,越小优先级越高。注意其iterator()的返回不会排序。

  不限长的并发优化的Queue,基于链表,也是很棒的实现了无锁算法,见入门教程,由head与tail两个变量管理链表的两端。

  不限长的并发优化的PriorityQueue,也是基于二分堆。使用一把公共的读写锁。虽然实现了BlockingQueue接口,其实没有任何阻塞队列的特征,空间不够时会自动扩容。

  内部包含一个PriorityQueue,元素需实现Delayed接口,每次调用时需返回当前离触发时间还有多久,小于0表示已到点。

  pull()时会用peek()查看队头的元素,检查其是否到达触发时间。Java的定时任务Scheduler用了类似的结构。

  BlockingQueue的队列长度受限,用以保证生产者与消费者的速度不会相差太远。队列长度设定后不可改变。

  定长的并发优化的BlockingQueue,基于循环数组实现。也由一把公共读写锁与notFull,notEmpty两个Condition管理阻塞状态。

  集合:储存元素的容器。集合与数组与区别:①长度区别:数组长度固定,集合长度不固定;②内容区别:数组存储的是同一类型的元素(Object类型的除外,因为Object类型的数组也可以存储任意类型的数据),...博文来自:yff933的博客

  1、集合的概述1.1定义:为了保存数量不确定的数据,以及保存具有映射关系的数据(也被称为关联数组),Java提供了集合类。集合类主要负责保存、盛装其他的数据,所有的集合类都位于java.util包下。...博文来自:jiaMaiga的博客

  Set集合特点; 无序 不允许重复的实现类:  HashSet   通过hash码数据结构进行存储的  无序 不重复        如果想要判断两个对象是否是同一个对象,通常情况比较地址,但是现在需要...博文来自:小咖奋斗史

  主要验证一下List集合的常用操作:list中添加,获取,删除元素;添加方法是:.add(e);获取方法是:.get(index);删除方法是:.remove(index);按照索引删除;...博文来自:Codingzhangxin的博客

  目录什么是集合Java集合框架常用的集合类什么是集合在认识集合之前首先看一下什么是数组:存放一组相同的数据类型(基本或对象)的数据,从而实现对数据的管理。但是数组一旦初始化的时候指定了长度就不能改变。...博文来自:armarm9的博客

  关于Java集合的总结,直接上图。一、二、三、四、五、六、七、Collection接口方法八、九、十、11、12、13、14、15、16、17、18、19、20、...博文来自:ldc5306590的专栏

  一下内容完全是自己总结和网络中查找的!(如有不恰当之处还望指正,谢谢合作!)总结,List/Set/Map三个接口的实现类基本都是 一个基本实现 然后再 一个树性实现。特别是set和map。Set是在...博文来自:的博客

  Collection和Map都可以在你向其中添加更多的元素时,自动调整其尺寸。容器不能持有基本类型,当你尝试向容器中加入一个基本类型时会自动包装。如果要进行大量的随机访问,就是有ArrayList。如...博文

  Java集合系列Java集合1-Map总结Java集合2-HashMap详解(含源码分析)1、MapMap主要用于存储健值对,根据键得到值,因此不允许键重复,但允许值重复。2、HashMapHashm...博文来自:唐影若凡的专栏

  List接口实现类一.ArrayList特征:1.允许添加添加null,可以存储重复数据,有序的,底层是数组结构增删慢,查询快。是非线.初始化ArrayListarr=newArray...博文来自:xuanzhiqiang的博客

  今天是自己自学java的第二十天,也是自己发布的第一篇博客。刚刚学完集合,回首望去,什么都不记得。每天的java视频可能自己只是过了一遍,即使是看完再去敲一遍,那也是死记硬背,没有理解代码的含义,所以...博文来自:weixin_42940932的博客

  1.java集合结构:java集合类主要有两个接口派生而出:Collection和map。Collection和Map是Java集合框架的根接口,这两个接口又包含了一些接口或实现类2.Set的介绍se...博文来自:nanazhang的博客

  Collection(接口,集合框架的最高父类)同一个集合可以存放不同类型的元素,但是不建议这么使用同一个集合放同一种数据类型元素才有意义两个接口   List有顺序的,可重复的   用户可以根据元素...博文来自:似水流年

  常用的集合包主要包括Collection和Map两个接口,Collection主要用于多个单对象,Map用于存放Key-Value形式的键值对现将其总结如下,便于查阅:Collection:非线程安全...博文来自:不为博学,只为休闲

  JAVA中的集合按照接口继承分为collection和Map两个分支,collection为数组结构,独有的特点是可以迭代。Map为键值对结构,往往是散列算法(hash),当然collection接口...博文来自:cd_cd的专栏

  1、List的实现类,以及实现类的优缺点 a、ArrayList:实现是基于动态数组的数据结构 b、LinkedList:实现是基于链表的数据结构 c、Vector:同ArrayList的数据结构,但...博文来自:u010313441的专栏

  集合(容器):包含的都是接口: Collection接口:存储一组不唯一,无序的对象。List接口:存储一组不唯一,有序(插入顺序)的对象。Set接口:存储一组唯一,无序的对象。Map接口:存储一组键...博文来自:zgz的博客

  此文档属于本人当初学习java基础之集合,所整理的文档。里面整理了单列集合Collection与双列集合Map的子类及常用方法。希望对你的学习有帮助,谢谢!

  List: 有顺序的,元素可以重复 遍历:for 迭代 排序:Comparable Comparator Collections.sort() ArrayList:底层用数组实现的List 特点:查询效率高,增删效率低 轻量级 线程...

  记性逐渐不好,有的东西忘记,本文复习备忘用,先从最基本的java基础集合开始,集合分为Collection接口和Map接口,这两个接口又衍生出了很多子接口,下面对着2个接口分别作介绍。一,collec...博文来自:xuehanxin的专栏

  自己总结,不足错误之处,敬请指教。集合的定义:集合是一种容器,长度可变。专门用来存储对象的(不能存储基本数据类型,只能存储其封装类)为什么出现集合:Java是一门面向对象的语言,即世间万物皆为对象。集...博文来自:叫我匪爷吧

  一、集合框架的基本结构最上层的三个接口分别是:Collection:用于存储一个对象的,Collection层次结构中的根接口。  Collection表示一组对象,这些对象也称为collection...博文来自:jd123789的博客

  相信初学小伙伴们对于java的集合学的也是一脸懵逼,下面我就为大家总结一下三大集合常用方法及遍历集合的方法Collection接口===================================...博文来自:哲学君的博客

  1.有一个集合是一个类manager的成员变量privateListlist,在另一个类test中,对manager创建对象了两次,如果想要这两个创建对象使用同一个集合list,那么就得使这个集合是静...博文来自:.....

  Java的集合详细总结Collection是java集合中的根接口,当然只包括只包括Set和List。1.Collection接口介绍Collection接口中的方法(不列出所有,详细情况JDK文档)...博文来自:逗号的博客

  java集合是非常重要的一块,是每个java程序员必须掌握的内容,不仅要会使用这些集合的方法,还要对它们底层的数据结构实现原理有一定的了解。这里就简单归纳一下List集合中关键的几个点:List集合,...博文来自:29DCH的博客

  前言:面向对象语言事物的体现都是以对象的形式,为了方便对多个对象的操作,就要对对象进行存储。另外,使用Array存储对象具有一些弊端,而Java集合就像一种容器,可以动态地把多个对象的引用放入容器中。...博文来自:一路向前!

http://duchtech.com/tongliansuanfa/513.html
锟斤拷锟斤拷锟斤拷QQ微锟斤拷锟斤拷锟斤拷锟斤拷锟斤拷锟斤拷微锟斤拷
关于我们|联系我们|版权声明|网站地图|
Copyright © 2002-2019 现金彩票 版权所有