Java Collection集合用法详解

 更新时间:2021年10月22日 15:25:27   作者:做哈白日梦  
首先Collection是属于单列集合的顶层接口,表示为一组对象。其类型为引用数据类型,具体创建对象,通过多态的形式进行,本文将给大家详细的介绍,需要的朋友可以参考下

1.集合的主要体系及分支

在这里插入图片描述

1.1Collection集合及实现类

1.概述:首先Collection是属于单列集合的顶层接口,表示为一组对象。其类型为引用数据类型,具体创建对象,通过多态的形式进行。
2.主要常用方法(E这种是指泛型类型,可以为任何引用类型):

在这里插入图片描述

3.Collection集合的遍历(Iterator迭代器,集合的专用遍历方式)
概述:

在这里插入图片描述

2.List集合(List是带有索引的,所以多注意索引越界等问题)

1.概述:有序集合,且允许有重复的元素,使用者可以精确的控制每个元素的插入位置,并且可以快速访问。
特点:有序(存储与取出顺序一致),且元素可以重复。

2.常用方法:

在这里插入图片描述

3.List的列表迭代器(Listlterator)

用法:可以按照任意方向进行遍历,并在迭代期间修改列表,并获取列表中迭代器的位置,是list集合特有的迭代器。
常用方法:

在这里插入图片描述

当使用倒叙遍历时,是需要注意先进行一遍正向顺序;或者直接通过Collection工具类中的reverse()的方法进行倒叙,再输出。

4.并发修改异常(ConcurrentModificationException)

主要产生原因:通过内部类的形式,当通过hasNext()这个方法时,遍历集合中加以判断并添加时会发生并发异常,是因为list.add()会导致实际的修改集合和预期的修改集合不对等而触发并发修改异常。
因为:当你使用list的add方法时候,只会添加实际修改集合的值,而预期的修改集合值不会增加,而hasNext()的使用是需要预期和实际进行判断的。
如何避免这种异常出现?

1.使用列表迭代器的方法进行添加,因为add不会导致实际与预期的不对等。

2.通过for循环进行遍历。

2.1 List的实现类

1.ArrayList(底层数据结构属于数组实现,增删慢,查询快);
2.LinkedList(底层数据结构属于双链表,查询慢,增删快);
常用方法:

在这里插入图片描述

3.Set集合

特点:集合是无序的(存储与取出顺序不一致),且不允许有重复元素,没有索引值,因此不能使用普通for遍历。

3.1HashSet(Set的实现类)

1.哈希值

概述:哈希值是JDK通过对象的地址或者字符串或者数字算出来的int类型的值。
特点:同一个对象的哈希值是相同的,且在默认情况下不同对象的哈希值是不同的。

2.数据结构之哈希表

在这里插入图片描述

3.怎么HashSet集合的元素唯一性?(重中之重)

在这里插入图片描述

4.LinkedHashSet集合(HashSet的子类)

在这里插入图片描述

LinkedHashSet集合元素是有序的。

3.2TreeSet集合(Set的实现类)

特点:可以通过自然排序或者特定的比较器(主要用于Comparable接口来进行)来进行排序;
自然排序Comparable:

在这里插入图片描述

String类实现类自然排序Comparable接口,则可以直接调用用来判断字符串之间的大小,而当一个类的对象之间需要比较时,是需要实现自然排序Comparable接口,重写其中compareTo的方法。(TreetSet可以通过匿名内部类的方法来进行重写自然排序方法)。

4.集合的高频面试题

4.1Arraylist 与 LinkedList 异同

1. 是否保证线程安全: ArrayList 和 LinkedList 都是不同步的,也就是不保证线程安全;
2. 底层数据结构: Arraylist 底层使用的是Object数组;LinkedList 底层使用的是双向循环链表数据结构;
3. 插入和删除是否受元素位置的影响: ① ArrayList 采用数组存储,所以插入和删除元素的时间复杂度受元素位置的影响。 比如:执行add(E e)方法的时候, ArrayList 会默认在将指定的元素追加到此列表的末尾,这种情况时间复杂度就是O(1)。但是如果要在指定位置 i 插入和删除元素的话(add(int index, E element))时间复杂度就为 O(n-i)。因为在进行上述操作的时候集合中第 i 和第 i 个元素之后的(n-i)个元素都要执行向后位/向前移一位的操作。 ② LinkedList 采用链表存储,所以插入,删除元素时间复杂度不受元素位置的影响,都是近似 O(1)而数组为近似 O(n)。
4. 是否支持快速随机访问: LinkedList 不支持高效的随机元素访问,而ArrayList 实现了RandmoAccess 接口,所以有随机访问功能。快速随机访问就是通过元素的序号快速获取元素对象(对应于get(int index)方法)。
5. 内存空间占用: ArrayList的空 间浪费主要体现在在list列表的结尾会预留一定的容量空间,而LinkedList的空间花费则体现在它的每一个元素都需要消耗比ArrayList更多的空间(因为要存放直接后继和直接前驱以及数据)。

4.2ArrayList 与 Vector 区别

Vector类的所有方法都是同步的。可以由两个线程安全地访问一个Vector对象、但是一个线程访问Vector的话代码要在同步操作上耗费大量的时间。
Arraylist不是同步的,所以在不需要保证线程安全时时建议使用Arraylist。

集合框架底层数据结构总结

 1.Collection

1. List

Arraylist: Object数组
Vector: Object数组
LinkedList: 双向循环链表

2. Set

HashSet(无序,唯一): 基于 HashMap 实现的,底层采用 HashMap 来保存元素。
LinkedHashSet: LinkedHashSet 继承与 HashSet,并且其内部是通过 LinkedHashMap 来实现的。有点类似于我们之前说的LinkedHashMap 其内部是基于 Hashmap 实现一样,不过还是有一点点区别的。
TreeSet(有序,唯一): 红黑树(自平衡的排序二叉树)。

到此这篇关于Java Collection集合用法详解的文章就介绍到这了,更多相关Java Collection集合内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Maven配置仓库的方法步骤

    Maven配置仓库的方法步骤

    本文主要介绍了Maven配置仓库的方法步骤,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-06-06
  • SpringCloud之监控数据聚合Turbine的实现

    SpringCloud之监控数据聚合Turbine的实现

    这篇文章主要介绍了SpringCloud之监控数据聚合Turbine的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-08-08
  • java 多线程死锁详解及简单实例

    java 多线程死锁详解及简单实例

    这篇文章主要介绍了java 多线程死锁详解及简单实例的相关资料,需要的朋友可以参考下
    2017-01-01
  • Java按行读取文件文本内容的方式汇总

    Java按行读取文件文本内容的方式汇总

    在工作和学习中,有时候会有一些场景,代码需要配合读取文件来执行,比如:读文件数据,来进行计算、组装SQL、更新操作,本文给大家介绍在Java中按行读取文件文件内容的方式有哪些,感兴趣的朋友一起看看吧
    2023-10-10
  • 详解Java CompletableFuture使用方法以及与FutureTask的区别

    详解Java CompletableFuture使用方法以及与FutureTask的区别

    CompletableFuture实现了CompletionStage接口和Future接口,前者是对后者的一个扩展,增加了异步回调、流式处理、多个Future组合处理的能力,使Java在处理多任务的协同工作时更加顺畅便利
    2021-10-10
  • Java基础之List内元素的排序性能对比

    Java基础之List内元素的排序性能对比

    这篇文章主要介绍了Java基础之List内元素的排序性能对比,文中有非常详细的代码示例,对正在学习java基础的小伙伴们有非常好的帮助,需要的朋友可以参考下
    2021-04-04
  • SpringBoot启动遇到的异常问题及解决方案

    SpringBoot启动遇到的异常问题及解决方案

    这篇文章主要介绍了SpringBoot启动遇到的异常问题及解决方案,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-02-02
  • Struts2配置文件中使用通配符的方法(三种形式)

    Struts2配置文件中使用通配符的方法(三种形式)

    Struts2是一个基于MVC设计模式的Web应用框架,它本质上相当于一个servlet,在MVC设计模式中,Struts2作为控制器(Controller)来建立模型与视图的数据交互。这篇文章主要介绍了Struts2配置文件中使用通配符的相关知识,需要的朋友可以参考下
    2019-11-11
  • 解决spring data jpa 批量保存更新的问题

    解决spring data jpa 批量保存更新的问题

    这篇文章主要介绍了解决spring data jpa 批量保存更新的问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-06-06
  • 详解MyBatis中column属性的总结

    详解MyBatis中column属性的总结

    在MyBatis的映射中有column这么一个属性,我一直以为它映射的是数据库表中的列名,但经过学习发现他似乎映射的是SQL语句中的列名,或者说是查询结果所得到的表的列名,这篇文章主要介绍了MyBatis中column属性的总结,需要的朋友可以参考下
    2022-09-09

最新评论