Java集合框架

我是南城余!阿里云开发者平台专家博士证书获得者!

欢迎关注我的博客!一同成长!

一名从事运维开发的worker,记录分享学习。

专注于AI,运维开发,windows Linux 系统领域的分享!

本章节对应知识库


 

集合框架 (yuque.com)

面试相关

集合中安全与不安全的类

不安全:ArrayList、HashMap、HashSet

安全:Vector、Hashtable

两种遍历集合的方式
public class exer1 {public static void main(String[] args) {HashMap hashMap = new HashMap();hashMap.put("张杰","逆战");hashMap.put("邓紫棋","喜欢你");hashMap.put("群星","逆战");hashMap.put("张杰","天下");//遍历 方式1Iterator iterator = hashMap.keySet().iterator();while (iterator.hasNext()){System.out.println(iterator.next());}System.out.println("======");Iterator iterator1 = hashMap.keySet().iterator();;while (iterator1.hasNext()){System.out.println(iterator1.next());}//遍历方式2:增强for循环System.out.println("======");for(Object obj: hashMap.entrySet()){System.out.println(obj);}}
}

数组存储的特点

》数组一旦初始化,其长度是确定的

》数组中的多个元素是依次紧密排列的,有序的,可重复的

》(优点)数组一旦初始化完成,其元素的类型就确定的。不是此类型的元素,就不能添加到此数组中

int[] arr = new int[10];
arr[1] = 1;
arr[2] = "aa"; //编译报错Object[] arr1 = new Object[10];
arr[0] = new String();
arr[1] = new Date();

(优点)元素的类型既可以是基本数据类型,也可以是引用数据类型

数据存储的弊端

数组一旦初始化,其长度就不可变

》数组中存储数据特点单一,对于无序的、不可重复的场景的多个数据就无能为力

》数组中可用的方法、属性都极少。具体的需求,都需要自己来组织代码逻辑

集合框架(java.util包下)

java.util.Collection:存储一个一个的数据

子接口:List:存储有序的、可重复的数据(动态数组)

ArrayList(主要实现类)、LinkedList、Vector

子接口:Set:存储无序的、不可重复的数据

HashSet(主要实现类)、LinkedHashSet、TreeSet

java.util.Map :存储一对一对的数据(key-value键值对,(x1、y1)(x2、y2)->y=f(x),类似于高中的函数)

HashMap(主要实现类)、LinkedHashMap、TreeMap、Hashtable、Properties

集合与数组的相互转换

集合——》数组:toArray()

数组——》集合:调用Arrays的静态方法asList(Object ... objs),返回一个List

Collection

向Collection中添加元素要求

要求元素所属的类的equals()方法重写

原因:

因为Collection中的相关方法(contains()/remove())在使用时,要调用元素所在类的equals()方法。

迭代器(Iterator)

迭代器是用来遍历Collection,不能用来遍历Map(因为Map里面存储的键值)

设计模式的一种

迭代器不负责存储数据,只用来遍历集合元素

迭代器创建对象

Iterator itertor = 对象名.Iterator();

遍历Iterator对象

while(iterator.hasNext()){

System.out.pringtln(iteror.next());

}

增强for循环(foreach循环)(jdk5)

作用

用来遍历数组、集合

for(要遍历的集合或数组的类型 临时变量名:要遍历的集合或数组的变量名){

操作临时变量的输出

}

说明

》针对集合来讲,增强for循环的底层仍然使用的是迭代器

》增强for循环的执行过程,是将集合和数中的元素依次赋值给临时变量,注意,循环体对临时变量的修改,可能不会导致原有集合和数组中的元素的修改。

一般for循环

一般for循环是用来遍历List

List

由于时Colletion类的子类,所以Colletion类方法List都可以使用

但是继承关系,所以新增了多种方法

add(Object obj)

addAll(Collection coll)

remove(Obeject obj)

remove(int index)

set(int index,Object ele)

get(int index)

add(int index,Object ele)

addAll(int index,Collection eles)

长度

size()

遍历

Iterator()

增强for循环

一般for循环

List实现类

java.util.Collection:存储一个一个的数据

子接口:List:存储有序的、可重复的数据(动态数组)

ArrayList:List的主要实现类;线程不安全;底层使用Object[]数组存储

在添加数据、查找数据时,效率高效,在插入、删除数据时,效率低效

LinkedList:底层使用双向链表的方式进行存储数据;在对集合中的数据进行频繁删除,插入操作 时,建议使用此类

在插入数据、删除数据时,效率较高,在添加数据、查找数据时,效率低效

Vector:List的古老实现类;线程安全的,效率低;底层使用Object[]数组储存

Set

Set实现类

java.util.Collection:存储一个一个的数据

子接口:Set:存储无序的、不可重复的数据

HashSet:主要实现类,底层使用的时HashMap,即使用的是数组+单向链表+红黑树进行存储

LinkedHashSet:是HashSet子类,在现有的数组+单向链表+红黑树结构基础上,又添加 了一组双向链表,用于记录添加的元素先后顺序。即我们可以按照添加元素的顺序进行遍历

TreeSet:底层使用红黑树进行存储,可以按照添加的元素的指定属性的大小顺序进行遍历。

开发中,Set使用频率比List、Map少,用来过滤重复数据

无序性:!=随机性

添加元素的顺序和遍历的元素的顺序不一致,是不是无序性呢?No!

这里的无序性,指的是与添加的元素的位置有关,不像ArrayList一样依次紧密排列

这里根据的是添加元素的哈希值,计算的其在数组中的存储位置。此位置不是依次排列的,表现为无序性

不可重复性:

是根据哈希值先判断两个存储数据的哈希值是否相等,若相等,则判断值是否相等,或者是否存 在,不存在则放入,存在则覆盖数据。

比较标准,需判断hashCode()得到的哈希值以及equals()得到的boolean型的结果

哈希值相同且equals()返回true,则认为元素相同

添加到HashSet和LinkedHahSet元素的要求

要求元素所在类要重写两个方法:equals()和hashCode()

TreeSet

底层使用红黑树进行存储,可以按照添加的元素的指定属性的大小顺序进行遍历。

添加元素的属性必须保持一致,否则会保错异常ClassException

必须考虑排序:①自然排序②定制排序

判断数据是否相同的标准

不再是考虑hashCode()和equals()方法,也意味着添加到TreeSet中的元素所在的类不需要重写这两种方法

比较元素的方法为排序:①自然排序②定制排序(compareTo()或者compare()的返回值)

如果compareTo()或者compare()的返回值为0,则认为两个对象相等

由于TreeSet中存放的元素不能相同,则后一个元素如果i相同,则不能添加到TreeSet中

Map

java.util.Map:存储一对一对的数据(key-value键值对,(x1,y1),(x2,y2)->y=f(x))

HashMap:主要的实现类,线程不安全,效率高,可以添加null的key和value的值,底层使用的 数组+单向链表+红黑树结构存储

LinkedHashMap:是HashMap的子类,在HashMap使用的数据结构基础上,增加了一 对双向链表,用于记录添加的元素的先后顺序,即添加的顺序即为打·· 印输出的顺序,进而遍历元素时,就可以按照添加的元素显示

TreeMap:底层使用的红黑树存储,可以添加按照key-value中的key元素指定的属性大小顺序遍 历,需要考虑①自然排序②定制排序(compareTo()或者compare()的返回值)

Hashtable:古老的实现类,线程安全,效率低,不可以添加null的key或value的值;底层使用的是数组+单向链表存储

Properties:其key和value都是String类型。常用来处理属性文件

HashMapkey存储位置

存储在数组+链表+红黑树。key、value作为树的node属性出现。

HashMap中的元素特点

》HashMap中的所有的key彼此之间是不可重复的,无序的。所有的key就构成了一个Set集合。——》key所在类要重写HashCode()和equals()方法

》HashMap中的所有的value彼此之间是可重复的、无序的。所有的value就构成一个Collection集合——》value所在的类要重写equals()

》HashMap中的一个key—value,就构成了一个entry

》HasnMap中的所有entry彼此之间是不可重复的、无序的。所以entry就构成了一个Set集合

Map中的常用方法

  • 添加、修改操作:
    • Object put(Object key,Object value):将指定key-value添加到(或修改)当前map对象中
    • void putAll(Map m):将m中的所有key-value对存放到当前map中
  • 删除操作:
    • Object remove(Object key):移除指定key的key-value对,并返回value
    • void clear():清空当前map中的所有数据
  • 元素查询的操作:
    • Object get(Object key):获取指定key对应的value
    • boolean containsKey(Object key):是否包含指定的key
    • boolean containsValue(Object value):是否包含指定的value
    • int size():返回map中key-value对的个数
    • boolean isEmpty():判断当前map是否为空
    • boolean equals(Object obj):判断当前map和参数对象obj是否相等
  • 元视图操作的方法:
    • Set keySet():返回所有key构成的Set集合
    • Collection values():返回所有value构成的Collection集合
    • Set entrySet():返回所有key-value对构成的Set集合
import java.util.HashMap;public class TestMapMethod {public static void main(String[] args) {//创建 map对象HashMap map = new HashMap();//添加元素到集合map.put("黄晓明", "杨颖");map.put("李晨", "李小璐");map.put("李晨", "范冰冰");map.put("邓超", "孙俪");System.out.println(map);//删除指定的key-valueSystem.out.println(map.remove("黄晓明"));System.out.println(map);//查询指定key对应的valueSystem.out.println(map.get("邓超"));System.out.println(map.get("黄晓明"));}
}
TreeMap

底层使用红黑树进行存储,可以按照添加的key-value的中key元素的指定属性的大小顺序进行遍历。

添加元素的属性必须保持一致,否则会保错异常ClassException

必须考虑排序:①自然排序②定制排序

向TreeMap中添加的key属性必须保持一致,即唯一

Properties

Properties是HashTable的子类

Colletions

Collections是一个操作Set、List、Map等集合的工具类

Colletion和Colletions的区别

Colletion:集合框架的接口,其子类包括Set、List等子接口

Collections是一个操作Set、List、Map等集合的工具类

Map不是直接继承自Collection接口。实际上,Map是继承自Collection接口的另一个接口,叫做Map接口。Map接口提供了键值对数据的存储和访问方法,与Collection接口提供的基本集合操作方法不同。

以下是一些与Map相关的常用实现类:

  • HashMap:基于哈希表的实现,提供快速的插入和查找操作。
  • TreeMap:基于红黑树的实现,按键进行排序,可以进行二分查找。
  • LinkedHashMap:在HashMap的基础上,通过链表维护插入顺序或访问顺序。
  • ConcurrentHashMap:支持高并发访问的线程安全Map实现。

这些实现类都是基于Map接口的扩展,具有不同的特性和适用场景。

常用方法

Collections 中提供了一系列静态的方法对集合元素进行排序、查询和修改等操作,还提供了对集合对象设置不可变、对集合对象实现同步控制等方法(均为static方法):

排序操作:

  • reverse(List):反转 List 中元素的顺序
  • shuffle(List):对 List 集合元素进行随机排序
  • sort(List):根据元素的自然顺序对指定 List 集合元素按升序排序
  • sort(List,Comparator):根据指定的 Comparator 产生的顺序对 List 集合元素进行排序
  • swap(List,int, int):将指定 list 集合中的 i 处元素和 j 处元素进行交换

查找

  • Object max(Collection):根据元素的自然顺序,返回给定集合中的最大元素
  • Object max(Collection,Comparator):根据 Comparator 指定的顺序,返回给定集合中的最大元素
  • Object min(Collection):根据元素的自然顺序,返回给定集合中的最小元素
  • Object min(Collection,Comparator):根据 Comparator 指定的顺序,返回给定集合中的最小元素
  • int binarySearch(List list,T key)在List集合中查找某个元素的下标,但是List的元素必须是T或T的子类对象,而且必须是可比较大小的,即支持自然排序的。而且集合也事先必须是有序的,否则结果不确定。
  • int binarySearch(List list,T key,Comparator c)在List集合中查找某个元素的下标,但是List的元素必须是T或T的子类对象,而且集合也事先必须是按照c比较器规则进行排序过的,否则结果不确定。
  • int frequency(Collection c,Object o):返回指定集合中指定元素的出现次数

复制、替换

  • void copy(List dest,List src):将src中的内容复制到dest中
  • boolean replaceAll(List list,Object oldVal,Object newVal):使用新值替换 List 对象的所有旧值
  • 提供了多个unmodifiableXxx()方法,该方法返回指定 Xxx的不可修改的视图。

添加

  • boolean addAll(Collection  c,T... elements)将所有指定元素添加到指定 collection 中。

同步

  • Collections 类中提供了多个 synchronizedXxx() 方法,该方法可使将指定集合包装成线程同步的集合,从而可以解决多线程并发访问集合时的线程安全问题:

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

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

相关文章

代理模式-静态动态代理-jdk动态代理-cglib动态代理

代理模式 静态代理 动态代理:jdk动态代理 cglib动态代理 注意 :下面的代码截图 要配合文字去看 我对代码的每一步都做了解释 所以需要配合图片观看提取吗1111https://pan.baidu.com/s/1OxQSwbQ--t5Zvmwzjh1T0A?pwd1111 这里直接把项目文件 及代码 …

MySQL(15):存储过程与函数

存储过程概述 含义: 存储过程的英文是 Stored Procedure 。它的思想很简单,就是一组经过 预先编译 的 SQL 语句的封装。 执行过程: 存储过程预先存储在 MySQL 服务器上,需要执行的时候,客户端只需要向服务器端发出调用…

一文简单聊聊protobuf

目录 基本介绍 原理 同类对比 为什么要使用protobuf? 基本介绍 protobuf的全称是Protocol Buffer,是Google提供的一种数据序列化协议。Protocol Buffers 是一种轻便高效的结构化数据存储格式,可以用于结构化数据序列化,很适合做数据存储…

RFID技术在仓储物流管理中的应用方案

一、方案背景 当前市场竞争日益激烈,提高生产效率、降低运营成本对来说企业至关重要,仓储物流管理在各个行业广泛应用,设计和建立完善的仓储管理流程,提高仓储周转效率,减少运营资金的占用,将冻结的资产转…

github私有仓库开发,公开仓库发布版本

文章目录 github私有仓库开发,公开仓库发布版本需求背景实现思路GitHub Releases具体步骤广告 github私有仓库开发,公开仓库发布版本 需求背景 github私有仓库开发,公开仓库发布版本,既可以保护源代码,又可以发布版本给用户使用。许多知名软件项目都采用了这样的开…

多机器人群体的任务状态与机器人状态同步设计思路

背景技术 近年来,随着科学技术的发展需要,机器人技术不断进步。面临任务的日益复杂化,单机器人在很多环境下已经无法满足生产要求,于是国内外科研工作者对多机器人技术投入了大量关注,提出了利用多机器人协作来代替单机…

拍摄视频的时候相机断电导致视频文件损坏,怎么修复

3-4 现在好多人都有自己的相机,但是专业用来录像的机器应该是不太可能都有的,相机的稳定性会比专业的机器差一些,如果用于比较重要的场景,比如婚庆、会议录像、家庭录像使用等,有较少的概率会出现一些奇怪的情况&…

YOLOv8-Seg改进:卷积变体系列篇 | DCNv3可形变卷积基于DCNv2优化 | CVPR2023

🚀🚀🚀本文改进:DCNv3算子,基于DCNv2算子引入共享投射权重、多组机制和采样点调制,引入到YOLOv8,与C2f结合实现二次创新; 🚀🚀🚀DCNv3 亲测在多个数据集能够实现涨点,同样适用于小目标分割 🚀🚀🚀YOLOv8-seg创新专栏:http://t.csdnimg.cn/KLSdv 学姐…

一个关于jdbc操作mysql和java基础练手的通讯录管理系统小项目

首先 : 整个项目的项目结构为 : 1.第一步先导入数据库的驱动,我的mysql数据库是8.0以上版本,然后导入的驱动就是8.0.16版本的jar包; 1.JdbcBase : JDBC基础操作封装成了JdbcBase类,在里面先静态定义了数据库连接对象和DQL查询结果&#x…

CoreByte多云管理平台,国际站自助注册及充值教程

国际云的免实名备案优势为企业及个人提供灵活、可选择的云服务器资源,全球性的覆盖和高度可定制化的服务,使企业和个人可以在全球范围内高效运营,CoreByte独家签署多家云厂商,包含:阿里云、华为云、腾讯云、AWS等&…

Linux 程序开发流程 / 基本开发工具 / Vim / GCC工具链 / Make 工具 / Makefile 模板

编辑整理 by Staok。 本文部分内容摘自 “100ask imx6ull” 开发板的配套资料(如 百问网的《嵌入式Linux应用开发完全手册》,在 百问网 imx6ull pro 开发板 页面 中的《2.1 100ASK_IMX6ULL_PRO:开发板资料》或《2.2 全系列Linux教程&#xf…

android 10车载桌面ActivityView触摸事件源码详解分析

hi,粉丝朋友们: 背景 大家好!近来居然有好几个粉丝朋友居然问到了一个虚拟屏幕触摸相关的问题,还有老版本android 10上面有个车载桌面使用的ActivityView可以正常触摸的问题。 其实这个ActivityView在最新的版本已经没有了&…

Node.js 框架 star 星数量排名——NestJs跃居第二

文章目录 什么是NodeJs?什么是NodeJs框架?图表数据框架排名 什么是NodeJs? Node.js是一个基于Chrome V8引擎的JavaScript运行环境,它使得我们可以在服务器端使用JavaScript开发高效、可扩展的应用程序。作为一个快速、轻量级的平台,Node.js在Web开发领…

企业计算机中了eking勒索病毒如何解毒,eking勒索病毒文件恢复

网络技术的不断发展,为企业的生产生活提供了极大便利,但随之而来的网络安全威胁也不断增加,近期,很多企业的计算机服务器遭到了eking勒索病毒攻击,导致企业的计算机服务器所有数据被加密,无法正常使用&…

深眸科技聚焦3D机器视觉技术,从技术形态到应用前景实现详细分析

机器视觉技术的不断升级,使得对二维图像的处理逐渐扩展到了更复杂的三维领域,形成了3D机器视觉。3D机器视觉是机器视觉的重要应用领域之一,通过计算机能够在短时间内处理视觉传感器采集的图像信号,从而获得目标对象的三维信息。 …

C++ 11 新特性

目录 1. 支持特性的编译器版本2. 模板表达式中空格3. 空指针4. auto5. 统一初始化6. explict7. 范围for8. default,delete9. 化名模板(alias template)10. using11. noexcept12. override13. final14. decltype15. lambda16. Variadic Templa…

SpringBoot整合Activiti7——定时器事件(九)

文章目录 定时器事件时间定义时间固定时间段时间周期 1.开始事件2.中间事件3.边界事件代码实现xml文件自定义服务任务监听器自定义用户任务监听器测试流程流程执行步骤 定时器事件 可以用在开始事件、中间事件、边界事件上,边界事件可以是中断和非中断边界事件 需要…

基于springboot实现小学家校一体“作业帮”系统项目【项目源码】计算机毕业设计

基于springboot实现小学家校一体“作业帮”系统演示 Java语言简介 Java是由SUN公司推出,该公司于2010年被oracle公司收购。Java本是印度尼西亚的一个叫做爪洼岛的英文名称,也因此得来java是一杯正冒着热气咖啡的标识。Java语言在移动互联网的大背景下具…

Scala---数据基础

一、数据类型 二、变量和常量的声明 定义变量或者常量的时候,也可以写上返回的类型,一般省略,如:val a:Int 10常量不可再赋值 1./** 2. * 定义变量和常量 3. * 变量 :用 var 定义 ,可修改 4. * 常量 :用 val 定…

黑马程序员微服务Docker实用篇

Docker实用篇 0.学习目标 1.初识Docker 1.1.什么是Docker 微服务虽然具备各种各样的优势,但服务的拆分通用给部署带来了很大的麻烦。 分布式系统中,依赖的组件非常多,不同组件之间部署时往往会产生一些冲突。在数百上千台服务中重复部署…