java.util.Collection源码分析与深度理解
作者:FOEVERYANG 发布时间:2022-07-31 09:05:52
写在开头
java.util.Collection 作为Java开发最常用的接口之一,我们经常使用,今天我带大家一起研究一下Collection接口,希望对大家以后的编程以及系统设计能有所帮助,本文所研究的jdk版本为jdk1.8.0_131
明确一下几点:
Collection是接口,其继承了Iterable接口
Collection属于单值类型集合,重点子接口List接口和Set接口
Java.util.List接口(有序、不唯一)
ArraryList
ArrayList 是一个数组队列,相当于 动态数组。与Java中的数组相比,它的容量能动态增长。它继承于AbstractList,实现了List, RandomAccess, Cloneable, java.io.Serializable这些接口。ArrayList是非同步的,效率高但是线程不安全,Collections.sychromiziedList(new ArraryList<>());
可以让那个ArrayList变成线程安全类
ArrayList是基于动态数组实现的,在增删时候,需要数组的拷贝复制。
ArrayList的默认初始化容量是10,每次扩容时候增加原先容量的一半,也就是变为原来的1.5倍
删除元素时不会减少容量,若希望减少容量则调用
trimToSize()
它不是线程安全的。它能存放null值。
LinkedList
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更多消耗内存。
参考资料:https://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实现,如图
hashSet中的add()方法,是将对象E放入hashMap中的key的位置,value位置存放的是一个固定的Object,如图:
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实现的。
TreeSet是SortedSet接口的唯一实现类,TreeSet可以确保集合元素处于排序状态。TreeSet支持两种排序方式,自然排序 和定制排序,其中自然排序为默认的排序方式。向 TreeSet中加入的应该是同一个类的对象。
LinkedHashSet
LinkedHashSet是HashSet的一个“扩展版本”,HashSet并不管什么顺序,不同的是LinkedHashSet会维护“插入顺序”。HashSet内部使用HashMap对象来存储它的元素,而LinkedHashSet内部使用LinkedHashMap对象来存储和处理它的元素
来源:https://www.cnblogs.com/lsgspace/p/10464757.html


猜你喜欢
- 一、系统介绍本系统实现的以下功能管理员功能:登录系统、病人信息的增删改查、就医档案的录入、医生信息的增删改查、科室信息的增删改查、收费统计功
- 熔断与降级为什么在RPC环节中有熔断以及降级的需求,详细的原因这里不多解释,从网上搜索一张图做示意。熔断我理解熔段主要解决如下几个问题:当所
- 工作以来,代码越写越多,程序也越来越臃肿,效率越来越低,对于我这样一个追求完美的程序员来说,这是绝对不被允许的,于是除了不断优化程序结构外,
- java导出Excel通用方法的实例详解Java导出Excel通用方法,只需要一个list 集合。通用方法改进之处踊跃提出package o
- 当数据量比较大的时候,我们就需要考虑读写分离了,也就是动态切换数据库连接,对指定的数据库进行操作。在spring中实现动态的切换无非就是利用
- 这篇文章主要介绍了Spring Boot Logback配置日志过程解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考
- Android实现简单音乐播放器(MediaPlayer),供大家参考,具体内容如下开发工具:Andorid Studio 1.3运行环境:
- 起因:有后端同事反馈在异步线程中获取了request中的参数,然后下一个请求是get请求的话,发现会偶尔出现参数丢失的问题.示例代码:@Ge
- 一、什么叫做匿名类?匿名类就是没有名字的类。匿名类不能被引用,只能再创建的时候用new语句来声明。二、匿名类的优势以及应用场景;1、匿名类型
- 最近做了一个功能,里面涉及到了渐变圆形的需求。就是一个颜色可以渐变的圆环,最后实现的效果如下图:左图是带渐变效果,右图是不带渐变效果。原理还
- 一、什么是CharacterEncodingFilter官方解释如下是spring内置过滤器的一种,用来指定请求或者响应的编码格式。在web
- 现在由于GWF,google基本和咱们说咱见了,就给
- 在android中常用存储数据的基本就三种,sqlite,SharedPreferences,文件存储,其中针对于对象存储,使用sqlite
- 使用到的类:net.sf.json.JSONObject 使用JSON时,除了要导入JSON网站上面下载的json-lib-2.2
- 方法重载概述方法重载指同一个类中定义的多个方法之间的关系,满足下列条件的多个方法互相构成重载* 多个方法在同一个类中* 多个放方法具有相同方
- 在上个月的对C#开发微信门户及应用做了介绍,写过了几篇的随笔进行分享,由于时间关系,间隔了一段时间没有继续写这个系列的博客了,并不是对这个方
- 题目:将一个数组逆序输出。代码:import java.util.*;public class lianxi31 {public stati
- WPF实现一个简单的多运算符表达式计算器,供大家参考,具体内容如下1.先看下效果图首先外围给了一个grid 把他分成了两行 第一行用来显示文
- 本文实例讲述了Android基于TextView实现的跑马灯效果。分享给大家供大家参考,具体如下:package sweet.venst.a
- 在我们的程序中,经常会有一些耗时较长的运算,为了保证用户体验,不引起界面不响应,我们一般会采用多线程操作,让耗时操作在后台完成,完成后再进行