Java集合类

news2024/10/2 12:21:23

在了解Java集合类之前,我们必须首先了解java.util包,这个包提供了所有集合相关的接口和类。

集合是用来存储数据类型的一种数据结构,提到存储数据类型的数据结构我们最先想到的应该是数组,接下来我们简单回顾下Java中集合和数组的区别。

一、数组声明了它容纳的元素的类型,而集合不声明。

二、数组是静态的,一个数组实例具有固定的大小,一旦创建了就无法改变容量了。而集合是可以动态扩展容量,可以根据需要动态改变大小,集合提供更多的成员方法,能满足更多的需求。

三、数组的存放的类型只能是一种(基本类型/引用类型),集合存放的类型可以不是一种(不加泛型时添加的类型是Object)。

四、数组是java语言中内置的数据类型,是线性排列的,执行效率或者类型检查都是最快的。


集合类的架构

Collection接口实现类中存放的是元素;Map接口实现类中存放的是键值对。

Set接口不保证维护元素的顺序,而且元素不能重复;List接口维护元素的顺序,而且元素可以重复。

SortedSet和SortedMap提供了排序的功能。 

集合接口的实现类 

HashSet和LinkedHashSet:HashSet,为快速查找而设计的Set。存入HashSet的对象必须实现hashCode()和equals()。LinkedHashSet,具有HashSet的查询速度,且内部使用链表维护元素的顺序(插入的次序),于是在使用迭代器遍历Set时,结果会按元素插入的次序显示。

TreeSet: 提供排序功能的Set,底层为树结构 。相比较HashSet其查询速度低,如果只是进行元素的查询,我们一般使用HashSet。

ArrayList和LinkedList:ArrayList底层采用数组实现,具有较高的查询速度。LinkedList底层采用双向循环列表实现,进行插入和删除操作时具有较高的速度,我们还可以使用LinkedList来实现队列和栈。

TreeMap和HashMap:HashMap具有较高的速度(查询增删),TreeMap则提供了按照键进行排序的功能。


List接口

List 接口是一个有序的 Collection,使用此接口能够精确的控制每个元素插入的位置,能够通过索引(元素在List中位置,类似于数组的下标)来访问 List 中的元素,第一个元素的索引为 0,而且允许有相同的元素。

List 接口的常用实现类有 ArrayList 与 LinkedList。

ArrayList,LinkedList和Vector的区别

ArrayList

ArrayList 类实现了可变的数组,允许保存所有元素,包括 null,并可以根据索引位置对集合进行快速的随机访问;缺点是向指定的索引位置插入对象或删除对象的速度较慢。

ArrayList 继承了 AbstractList 类,并实现了 List 接口。

在这里插入图片描述

使用总结

  • ArrayList 可以存放 null。
  • ArrayList 本质上就是一个数组。
  • ArrayList 区别于数组的地方在于能够自动扩展大小,其中关键的方法就是 grow() 方法。每次扩容是他原本大小的1.5倍。解读ArrayList中的grow(int minCapacity)方法
  • ArrayList 中 removeAll(collection c) 和 clear() 的区别就是 removeAll 可以删除批量指定的元素,而 clear 是全是删除集合中的元素。
  • ArrayList 由于本质是数组,所以它在数据的查询方面会很快,而在插入删除这些方面,性能下降很多,需要移动很多数据才能达到应有的效果。
  • ArrayList 实现了RandomAccess,所以在遍历它的时候推荐使用 for 循环。

LinkedList

LinkedList 类采用链表结构保存对象。这种结构的优点是便于向集合中插入和删除对象,需要向集合中插入、删除对象时,使用 LinkedList 类实现的 List 集合的效率较高;但对于随机访问集合中的对象,使用 LinkedList 类实现 List 集合的效率较低。

LinkedList 继承了 AbstractSequentialList 类,并实现了 Queue、List、Deque、Cloneable、ava.io.Serializable 接口。

 在这里插入图片描述

使用总结

  • LinkedList 本质上是一个双向链表,通过一个 Node 内部类实现的这种链表结构。
  • LinkedList 可以存放 null。
  • LinkedList 跟 ArrayList 相比较,在删除和增加等操作上性能好,而 ArrayList 在查询的性能上好。
  • LinkedList 从源码中看,它不存在容量不足的情况。
  • LinkedList 不光能够向前迭代,还能像后迭代,并且在迭代的过程中,可以修改值、添加值、还能移除值。
  • LinkedList 不光能当链表,还能当队列使用,这个就是因为实现了 Deque 接口。

Set集合

Set 集合中的对象不按特定的方式排序,只是简单地把对象加入集合中,但 Set 集合中不能包含重复对象。Set 集合由 Set 接口和 Set 接口的实现类组成。Set 接口继承了 Collection 接口,因此包含 Collection 接口的所有方法。

Set 接口常用的实现类有 HashSet 与 TreeSet。

HashSet

HashSet 类实现 Set 接口,由哈希表(实际上是一个 HashMap 实例)支持。它不保证 Set 的迭代顺序,特别是它不保证该顺序恒久不变。此类允许使用 null 元素。

该类实现了 Set 接口,不允许出现重复元素,不保证集合中元素的顺序,允许包含值为 null 的元素,但最多只能一个。

在这里插入图片描述

TreeSet

TreeSet 类不仅实现了 Set 接口,还实现了 java.util.SortedSet 接口,因此,TreeSet 类实现的 Set 集合在遍历集合时按照自然顺序递增排序,也可以按照指定比较器递增排序,即可以通过比较器对用 TreeSet 类实现的 Set 集合中的对象进行排序。

该类实现了Set接口,可以实现排序等功能。

TreeSet 类增加的方法

方法描述
first()返回此 Set 中当前第一个(最低)元素
last()返回此 Set 中当前最后一个(最高)元素
comparator()返回对此 Set 中的元素进行排序的比较器。如果此 Set 使用自然排序,则返回 null
headSet(E toElement)返回一个新的 Set 集合,新集合是 toElement(不包括)之前的所有对象
subSet(E fromElement, E fromElement)返回一个新的 Set 集合,是 fromElement(包含)对象与 fromElement(不包含)对象之间的所有对象
tailSet(E fromElement)返回一个新的 Set 集合,新集合包含对象 fromElement(包含)之后的所有对象

Map集合

Map 集合没有继承 Collection 接口,其提供的是 key 到 value 的映射。Map 中不能包含相同的 key,每个 key 只能映射一个 value。key 还决定了存储对象在映射中的存储位置,但不是由 key 对象本身决定的,而是通过一种“散列技术”进行处理,产生一个散列码的整数值。散列码通常用作一个偏移量,该偏移量对应分配给映射的内存区域的起始位置,从而确定存储对象在映射中的存储位置。Map 集合包括Map 接口以及 Map 接口的所有实现类。

Map 接口常用方法

方法描述
put(K key, V value)向集合中添加指定的 key 与 value 的映射关系
containsKey(Object key)如果此映射包含指定 key 的映射关系,则返回 true
containsValue(Object Value)如果此映射将一个或多个 key 映射到指定值,则返回 true
get(Object key)如果存在指定的 key 对象,则返回该对象对应的值,否则返回 null
keySet()返回该集合中的所有 key 对象形成的 Set 集合
values()返回该集合中所有值对象形成的 Collection 集合

Map 接口常用的实现类有 HashMap 和 TreeMap。建议使用 HashMap 类实现 Map 集合,因为由 HashMap 类实现的 Map 集合添加和删除映射关系效率更高。HashMap 是基于哈希表的 Map 接口的实现,HashMap 通过哈希码对其内部的映射关系进行快速查找;而TreeMap 中的映射关系存在一定的顺序,如果希望 Map 集合中的对象也存在一定的顺序,应该使用 TreeMap 类实现 Map 集合。

HashMap

HashMap 类是基于哈希表的 Map 接口的实现,此实现提供所有可选的映射操作,并允许使用 null 值和 null 键,但必须保证键的唯一性。HashMap 通过哈希表对其内部的映射关系进行快速查找。此类不保证映射的顺序,特别是它不保证该顺序恒久不变。

HashMap 继承于 AbstractMap,实现了 Map、Cloneable、java.io.Serializable 接口。

在这里插入图片描述

使用总结

  • hashMap 在 JDK1.8 以前是一个链表散列这样一个数据结构,而在 JDK1.8 以后是一个数组加链表加红黑树的数据结构。
  • hashMap 是一个能快速通过 key 获取到 value 值得一个集合,原因是内部使用的是 hash 查找值得方法。
  • Java HashMap底层实现

TreeMap

TreeMap 类不仅实现了 Map 接口,还实现了 java.util.SortedMap 接口,因此,集合中的映射关系具有一定的顺序。但在添加、删除和定位映射关系时,TreeMap 类比 HashMap 类性能稍差。由于 TreeMap 类实现的 Map 集合中的映射关系是根据键对象按照一定的顺序排列的,因此不允许键对象是 null。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/397658.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Xilinx ZYNQ 7000 HDMI

High-Definition Multimedia Interface (HDMI) 参考xilinx application note XAPP460 HDMI来自High-Definition Multimedia Interface 高分辨率多媒体接口,多媒体一般包含图像和声音。 Transition Minimized Differential Signaling (TMDS) 是HDMI的物理层。 TMDS…

春招冲刺(十一):前端面试之网络总结

网络总结 Q1: GET和POST的请求的区别 应用场景:Get是一个幂等请求,一般用于请求资源。post不是幂等请求,一般用于修改资源。缓存:Get请求一般缓存,Post一般不缓存报文格式:Get请求体一般为空,…

【Linux】linux | 修改dns | 修改网卡dns

一、说明1、业务需要,需要修改服务的dns的地址2、改成阿里的二、操作查询需要修改dns的网卡ifconfig说明1: 留意ens192,即网卡名称查看网卡配置文件信息cd /etc/sysconfig/network-scripts ll备份cp /etc/sysconfig/network-scripts/ifcfg-en…

Advantest爱德万直流电源维修电压电流发生器ADCMT系列

Advantest爱德万电源维修常见型号:ADCMT6240A/B;R6243/R6246;ADCMT系列。 维修品牌: 安捷伦Agilent/HP、泰克Tektronix、安立Anritsu、罗德施瓦茨、爱德万Advantest、艾法斯/马可尼IFR/Marconi、吉时利Keithley、日立Hitachi、 松…

【BOOST C++】组件编程(2)-- 组件的设计原理

GitHub - ros2/demos at foxy 一、说明 为了研究ROS2的组件编程,首先要理解如何何为组件。组件本是微软的发明物体,但是在ubuntu上需要自己从底层实现,就说ROS2不用你写,但是就能看明白也是需要一点理论功底的。本篇按照COM内幕的…

【2223sW3】LOG1

写在前面 好好学习,走出宿舍,走向毕设! 一些心路历程记录,很少有代码出现 因为鬼知道哪条代码到时候变成毕设的一部分了咧,还是不要给自己的查重挖坑罢了 23.3.6 lammps代码修改 因为学姐要中期答辩了,…

用Biome-BGC模型如何模拟水循环过程

在Biome-BGC模型中,对于碳的生物量积累,采用光合酶促反应机理模型计算出每天的初级生产力(GPP),将生长呼吸和维持呼吸减去后的产物分配给叶、枝条、干和根。生物体的碳每天都按一定比例以凋落方式进入凋落物碳库;对于水份输运过程…

2023/3/8集合之TreeSet HashSet简介 不含代码

TreeSet : 底层是由TreeMap维护的 无序的,不可重的 底层结构 : 红黑树(平衡二叉树) 特点 : 查询效率高,默认升序排序引用场景 : 适合应用在存储多个单个值的数据的集合,去重的,自动升序排序的场景新增方法:新增了一些与比较大小相关的方法 遍历方式 1)foreach 2)iterator 1测试…

【C语言学习笔记】:图解指针变量

1 指针变量的基本操作基本操作 int a,*iptr,*jptr,*kptr;iptr &a;jptr iptr;*jptr 100;kptr NULL; 图解: 1.1 己址和己空间 指针变量也是一个变量,对应一块内存空间,对应一个内存地址,指针名就是己址。这空内存空间多大…

42-Golang中的单元测试

Golang中的单元测试需求传统方法基本介绍单元测试快速入门总结综合案例需求 在工作中,我们会遇到这样的情况,就是去确认一个函数,或者一个模块的结果是否正确 传统方法 在main函数中,调用addUpper函数,看看实际输出…

322. 零钱兑换 279.完全平方数

322. 零钱兑换 完全背包问题&#xff0c;需要注意的是数组的初始值。 class Solution {public int coinChange(int[] coins, int amount) {int[] dp new int[amount1];for(int i 0;i < amount;i){dp[i] Integer.MAX_VALUE;}dp[0] 0;for(int i 0;i < coins.length;i…

使用 create-react-app 脚手架搭建React项目

❀官网 1、安装脚手架&#xff1a;npm install -g create-react-app 2、查看版本&#xff1a;create-react-app -V &#xff01;&#xff01;&#xff01;注意 Node版本必须是14以上&#xff0c;不然会报以下错误。 3、创建react项目&#xff08;项目名不能包含大写字母&…

Windows上一款特别好用的画图软件

安装 废话不多说&#xff0c;打开windows的应用商店&#xff0c;搜索draw.io&#xff0c;点击获取即可。 画图 draw.io的布局左边是各种图形组件&#xff0c;中间是画布&#xff0c;右边是属性设置&#xff0c;文件扩展名是.drawio。 点击左边列表中的图形可以将它添加到画…

设计模式(十七)----行为型模式之模板方法模式

行为型模式用于描述程序在运行时复杂的流程控制&#xff0c;即描述多个类或对象之间怎样相互协作共同完成单个对象都无法单独完成的任务&#xff0c;它涉及算法与对象间职责的分配。 行为型模式分为类行为模式和对象行为模式&#xff0c;前者采用继承机制来在类间分派行为&…

二、JVM内存结构

文章目录运行时数据区子系统程序计数器&#xff08;PC寄存器&#xff09;虚拟机栈本地方法接口和本地方法栈堆运行时数据区子系统 1、Java虚拟机定义了若干程序运行期间使用到的运行时数据区&#xff0c;其中有一些会随着虚拟机启动而创建&#xff0c;随着虚拟机推出而销毁。另…

SpringBoot接口 - 如何对参数进行校验

在以SpringBoot开发Restful接口时, 对于接口的查询参数后台也是要进行校验的&#xff0c;同时还需要给出校验的返回信息放到上文我们统一封装的结构中。那么如何优雅的进行参数的统一校验呢&#xff1f;什么是不优雅的参数校验后端对前端传过来的参数也是需要进行校验的&#x…

刷题笔记7 | 454.四数相加II 、383. 赎金信 、 15. 三数之和 、 18. 四数之和 、 总结

454.四数相加II 给你四个整数数组 nums1、nums2、nums3 和 nums4 &#xff0c;数组长度都是 n &#xff0c;请你计算有多少个元组 (i, j, k, l) 能满足&#xff1a; 0 < i, j, k, l < n nums1[i] nums2[j] nums3[k] nums4[l] 0 输入&#xff1a;nums1 [1,2], nums…

全网最全Fiddler抓包教程,超过十万人学习此教程!

零基础玩转Fiddler抓包在测试领域应用实战&#xff01;各位做测试的同学想必对抓包工具fiddler并不陌生&#xff0c;但是很多同学可能没有总结过它的用法&#xff0c;下面我总结了fiddler一些常用的用法。 Web端抓包配置 打开Fiddler&#xff0c;Tools -> Fiddler Options…

界面组件DevExpress WinForms v22.2 - 升级对HTML CSS的支持

DevExpress WinForms拥有180组件和UI库&#xff0c;能为Windows Forms平台创建具有影响力的业务解决方案。DevExpress WinForms能完美构建流畅、美观且易于使用的应用程序&#xff0c;无论是Office风格的界面&#xff0c;还是分析处理大批量的业务数据&#xff0c;它都能轻松胜…

3.Elasticsearch初步进阶

3.Elasticsearch初步进阶[toc]1.文档批量操作批量获取文档数据批量获取文档数据是通过_mget的API来实现的在URL中不指定index和type请求方式:GET请求地址:_mget功能说明:可以通过ID批量获取不同index和type的数据请求参数docs:文档数组参数_index:指定index_type:指定type_id:指…