JAVA集合框架中的常用集合及其特点、适用场景、实现原理简介.docxVIP

JAVA集合框架中的常用集合及其特点、适用场景、实现原理简介.docx

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  4. 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  5. 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  6. 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  7. 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
JAVA集合框架中的常用集合及其特点、适用场景、实现原理简介 ArrayList基于数组来实现集合的功能,其内部维护了一个可变长的对象数组,集合内全部对象存储于这个数组中,并实现该数组长度的动态伸缩 ArrayList使用数组拷贝来实现指定位置的插入和删除: 插入: 图片.png 删除: 图片.png LinkedList LinkedList基于链表来实现集合的功能,其实现了静态类Node,集合中的每个对象都由一个Node保存,每个Node都拥有到本人的前一个和后一个Node的引用 LinkedList追加元素的过程示例: 图片.png ArrayList vs LinkedList ArrayList的随机访问更高,基于数组实现的ArrayList可直接定位到目标对象,而LinkedList需要从头Node或尾Node开头向后/向前遍历若干次才能定位到目标对象 LinkedList在头/尾节点执行插入/删除操作的效率比ArrayList要高 由于ArrayList每次扩容的容量是当前的1.5倍,所以LinkedList所占的内存空间要更小一些 二者的遍历效率接近,但需要留意,遍历LinkedList时应用iterator方式,不要用get(int)方式,否则效率会很低 Vector Vector和ArrayList很像,都是基于数组实现的集合,它和ArrayList的次要区分在于 Vector是线程平安的,而ArrayList不是 由于Vector中的方法基本都是synchronized的,其功能低于ArrayList Vector可以定义数组长度扩容的因子,ArrayList不能 CopyOnWriteArrayList 与 Vector一样,CopyOnWriteArrayList也可以认为是ArrayList的线程平安版,不同之处在于 CopyOnWriteArrayList在写操作时会先复制出一个副本,在新副本上执行写操作,然后再修改引用。这种机制让 CopyOnWriteArrayList可以对读操作不加锁,这就使CopyOnWriteArrayList的读效率远高于Vector。 CopyOnWriteArrayList的理念比较类似读写分别,适合读多写少的多线程场景。但要留意,CopyOnWriteArrayList只能保证数据的最终全都性,并不能保证数据的实时全都性,假如一个写操作正在进行中且并未完成,此时的读操作无法保证能读到这个写操作的结果。 Vector vs CopyOnWriteArrayList 二者均是线程平安的、基于数组实现的List Vector是【确定】线程平安的,CopyOnWriteArrayList只能保证读线程会读到【已完成】的写结果,但无法像Vector一样实现读操作的【等待写操作完成后再读最新值】的力量 CopyOnWriteArrayList读功能远高于Vector,并发线程越多优势越明显 CopyOnWriteArrayList占用更多的内存空间 Map类集合 图片.png Map将key和value封装至一个叫做Entry的对象中,Map中存储的元素实际是Entry。只要在keySet()和values()方法被调用时,Map才会将keySet和values对象实例化。 每一个Map依据其本身特点,都有不同的Entry实现,以对应Map的内部类方式消灭。 前文已经对Map接口的基本特点进行过描述,我们直接来看一下Map接口的常用实现类 HashMap HashMap将Entry对象存储在一个数组中,并通过哈希表来实现对Entry的快速访问: 图片.png 由每个Entry中的key的哈希值打算该Entry在数组中的位置。以这种特功能够实现通过key快速查找到Entry,从而获得该key对应的value。在不发生哈希冲突的前提下,查找的时间简单度是O(1)。 假如两个不同的key计算出的index是一样的,就会发生两个不同的key都对应到数组中同一个位置的情况,也就是所谓的哈希冲突。HashMap处理哈 希冲突的方法是拉链法,也就是说数组中每个位置保存的实际是一个Entry链表,链表中每个Entry都拥有指向链表中后一个Entry的引用。在发生哈希冲突时,将冲突的Entry追加至链表的头部。当HashMap在寻址时发觉某个key对应的数组index上有多个Entry,便会遍历该位置上的 Entry链表,直到找到目标的Entry。 图片.png HashMap的Entry类: static class EntryK,V implements Map.EntryK,V { ? ? ? ?final K key; ? ? ? ?V value; ? ? ? ?Entry n

文档评论(0)

bob157641554 + 关注
实名认证
文档贡献者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档