登录  | 加入社区

黑狼游客您好!登录后享受更多精彩

只需一步,快速开始

新浪微博登陆

只需一步, 快速开始

查看: 702|回复: 0

java.util.Collection源码分析和深度解说

[复制链接]

165

主题

165

帖子

0

现金

黑狼菜鸟

Rank: 1

积分
0
发表于 2019-3-4 06:37:21 | 显示全部楼层 |阅读模式 来自 江苏徐州
WER0rIbbhza0mpe0.jpg


java.util.Collection作为Java开辟最常用的接口之一,我们常常利用,本日我带各人一起研究一下Collection接口,盼望对各人以后的编程以及体系计划能有所资助,本文所研究的jdk版本为jdk1.8.0_131


明白一下几点:
Collection是接口,其继续了Iterable接口
Collection属于单值范例聚集,重点子接口List接口和Set接口
wLq5D4665OsqnyNN.jpg
Java.util.List接口(有序、不唯一)


ArraryList
wQPTMq2xAmaWRgzt.jpg


ArrayList 是一个数组队列,相称于动态数组。与Java中的数组相比,它的容量能动态增长。它继续于AbstractList,实现了List, RandomAccess, Cloneable, java.io.Serializable这些接口。ArrayList黑白同步的,服从高但是线程不安全,Collections.sychromiziedList(new ArraryList());可以让谁人ArrayList酿成线程安全类;
ArrayList是基于动态数组实现的,在增删时间,必要数组的拷贝复制;
ArrayList的默认初始化容量是10,每次扩容时间增长原先容量的一半,也就是变为原来的1.5倍;
删除元素时不会淘汰容量,若盼望淘汰容量则调用trimToSize();
它不是线程安全的。它能存放null值。


LinkedList
  

a5Yw5nn2aL522g15.jpg
LinkedList是一个双向循环列表队列;
LinkedList是一个继续于AbstractSequentialList的双向链表。它也可以被看成堆栈、队列或双端队列举行操纵;
LinkedList实现List接口,能对它举行队列操纵;
LinkedList实现Deque接口,即能将LinkedList看成双端队列利用;
LinkedList实现了Cloneable接口,即覆盖了函数clone(),能克隆;
LinkedList实现java.io.Serializable接口,这意味着LinkedList支持序列化,能通过序列化去传输;
LinkedList黑白同步的。


Vector
底层是数组,如今已少用,被ArrayList替换,缘故原由有两个:
Vector全部方法都是同步,有性能丧失。
Vector初始length是10 凌驾length时 以100%比率增长,相比于ArrayList更多斲丧内存。
参考资料:http://www.zhihu.com/question/31948523/answer/113357347
总的来说:查询多用ArrayList,增删多用LinkedList。
ArrayList增删慢不是绝对的(在数目大的环境下,会有破例):假如增长元素不停是利用add()(增长到末端)的话,而且不扩容的环境下)不停删除末端的元素也是ArrayList要快【不消复制移动位置】至于假如删除的是中心的位置的话,照旧ArrayList要快!但一样平常来说:增删多照旧用LinkedList,由于上面的环境是极度的~


Java.util.Set接口(无序、唯一)
|——SortedSet接口——TreeSet实现类
Set接口——|——HashSet实现类
|——LinkedHashSet实现类
hashSet
hashSet底层基于hashMap实现,如图:
  

jB64OEmcXoUU8KX2.jpg


hashSet中的add()方法,是将对象E放入hashMap中的key的位置,value位置存放的是一个固定的Object,如图:
SgO4HOG4Ov3efVHG.jpg
QmXhxrYxdnXWwdXd.jpg


HashSet是无序唯一的,当元素为自界说对象时,两者的hashCode差别,被以为是差别的元素从而被答应放入HashSet中,但这不符合现实的生产意义,因此必要让其判断位相称,就要重写hashCode(),然而重写HashCode(),会出现重码的bug,因此必要重写equals()来办理;
添加元素的时间,假如key(也对应的Set聚集的元素)相称,那么则修改value值。而在Set聚集中,value值仅仅是一个Object对象罢了(该对象对Set自己而言是无用的)。


也就是说:Set聚集假如添加的元素雷同时,是根本没有插入的(仅修改了一个无用的value值),从源码(HashMap)中也看出来,==和equals()方法都有利用,详细过程如下:
  新元素的hsah是否即是老元素的hash,假如不相称,则元素差别,假如相称,那么举行第二部比力;
  新元素与老元素用“==”举行比力,假如相称,则为同一元素,若差别则举行第三部比力;
  新元素和老元素用equals()方法判断是否相称,假如不等则不是同一元素,假如相称那么效果为:两个元素不是同一个对象,步伐想把它们当成同一个对象,因此重写了equals方法。


TreeSet
HashSet是基于HashMap实现一样,TreeSet同样是基于TreeMap实现的。
TreeSetSortedSet接口的唯一实现类,TreeSet可以确保聚集元素处于排序状态。TreeSet支持两种排序方式,天然排序和定制排序,此中天然排序为默认的排序方式。向TreeSet中参加的应该是同一个类的对象。


LinkedHashSet
LinkedHashSetHashSet的一个“扩展版本”,HashSet并不管什么次序,差别的是LinkedHashSet会维护“插入次序”。HashSet内部利用HashMap对象来存储它的元素,而LinkedHashSet内部利用LinkedHashMap对象来存储和处置惩罚它的元素。



  •  2017-10-10 1,00
保举阅读
 centos7.4下mysql5.7.25安装具体步调教程

Linux体系下搭建svnadmin服务具体步调解说

怎样利用Maven将jar包发布到中心堆栈?

华为企业云Linux体系挂载数据盘办理方案

源码分析系列1:HashMap源码分析(基于JDK1.8)

Intellij IDEA开辟中你大概忽略利用的那些快捷键

IntelliJ IDEA利用本领—IDEA设置默认Maven版本04期

IntelliJ IDEA利用本领——IDEA工具Debug模式断点调试详解03期

IntelliJ IDEA利用本领——IDEA增长jar包02期

Java底子篇——Java中switch case语句用法及留意事项口试题9期

怎样成为架构师?7 个关键的思索、风俗和履历

Java口试高级篇—Session和Cookie的区别与接洽口试题12期
yIFcizL2hC2FzIIx.jpg
更多保举↓↓↓ 
C99om07zjMCdd4MC.jpg

关注微信公众号“Java精选”(w_z90110),复兴关键字领取资料:如HadoopDubboCAS源码等等,免费领取资料视频和项目。 



涵盖:步伐人生、搞笑视频、算法与数据布局、黑客技能与网络安全、前端开辟、Java、Python、Redis缓存、Spring源码、各大主流框架、Web开辟、大数据技能、Storm、Hadoop、MapReduce、Spark、elasticsearch、单点登录同一认证、分布式框架、集群、安卓开辟、iOS开辟、C/C++、.NET、Linux、Mysql、Oracle、NoSQL非关系型数据库、运维等。




上一篇:将来产物体现的大概:keyshotXR
下一篇:学习R我该怎么安装什么步伐?该怎么安装?
您需要登录后才可以回帖 登录 | 加入社区

本版积分规则

 

QQ|申请友链|小黑屋|手机版|Hlshell Inc. ( 豫ICP备16002110号-5 )

GMT+8, 2024-5-8 08:48 , Processed in 0.091064 second(s), 47 queries .

HLShell有权修改版权声明内容,如有任何爭議,HLShell將保留最終決定權!

Powered by Discuz! X3.4

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表