java.util.Collection源码分析与深度理解

 更新时间:2019年03月03日 15:08:26   作者:FOEVERYANG  
这篇文章主要给大家介绍了关于java.util.Collection的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面来一起学习学习吧

写在开头

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对象来存储和处理它的元素

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,如果有疑问大家可以留言交流,谢谢大家对脚本之家的支持。

相关文章

  • Java集合Stream流操作的基本使用教程分享

    Java集合Stream流操作的基本使用教程分享

    流操作并不会影响原来的集合,可以简单认为,流操作是把集合中的一个元素逐个复制放到一个首尾相接的流动的水槽中。这篇文章整理了Stream流操作的基本使用,需要的可以参考一下
    2023-02-02
  • Java实现猜数字小游戏(有次数限制)

    Java实现猜数字小游戏(有次数限制)

    这篇文章主要为大家详细介绍了Java实现猜数字小游戏,有次数限制,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2020-05-05
  • java8 streamList转换使用详解

    java8 streamList转换使用详解

    这篇文章主要介绍了java8 streamList转换使用详解,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-08-08
  • springmvc模式的上传和下载实现解析

    springmvc模式的上传和下载实现解析

    这篇文章主要介绍了springmvc模式下的上传和下载实现解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2019-11-11
  • MyBatisPlus 主键策略的实现(4种)

    MyBatisPlus 主键策略的实现(4种)

    MyBatis Plus 集成了多种主键策略,帮助用户快速生成主键,本文主要介绍了MyBatisPlus主键策略的实现,具有一定的参考价值,感兴趣的可以了解一下
    2023-10-10
  • Java读取String分行字符串的方法

    Java读取String分行字符串的方法

    今天小编就为大家分享一篇Java读取String分行字符串的方法,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2018-07-07
  • Java多线程之并发编程的基石CAS机制详解

    Java多线程之并发编程的基石CAS机制详解

    这篇文章主要介绍了java并发编程之cas详解,涉及cas使用场景和cas用作原子操作等内容,具有一定参考价值,需要的朋友可以了解下
    2021-09-09
  • Spring框架基于注解的AOP之各种通知的使用与环绕通知实现详解

    Spring框架基于注解的AOP之各种通知的使用与环绕通知实现详解

    这篇文章主要介绍了Spring框架基于注解的AOP之各种通知的使用及其环绕通知,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习吧
    2022-11-11
  • Java实现查找文件和替换文件内容

    Java实现查找文件和替换文件内容

    这篇文章主要为大家详细介绍了Java语言如何实现查找文件和替换文件内容功能,文中的示例代码讲解详细,感兴趣的可以跟随小编一起学习一下
    2022-08-08
  • java list随机抽取元素的案例

    java list随机抽取元素的案例

    这篇文章主要介绍了java list随机抽取元素的案例,具有很好的参考,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-08-08

最新评论