java高级知识之集合

前言

集合是java开发中的重点内容,需要掌握的东西很多,面试中可问的东西很多,无论是深度还是广度。集合框架中Collection对应的实现类如下所示,这些都是要完全掌握,一个可以分为三大类List集合、Set‘集合以及Map集合’。
在这里插入图片描述
其中Collection代表单列集合,而Map代表双列集合,即一个key和可以对应的键值对。

1.Collection集合

Collection集合包括List和Set。他们都有不同的实现类,使用不同的数据结构,实现不同的性能属性。比如ArrayList在查找上会快点,而插入和删除就性能就比较差,LinkedList插入比较快,但是查找性能比较差。
1 、 List系列集合:有序集合:添加的元素是有序、可重复、有索引的

  • ArrayList、LinkedList:有序、可重复、有索引
  • 2、Set系列集合:添加的元素无序、不重复、无索引
  • HashSet:无序、不重复、无索引
  • LinkedHashSet:有序、不重复、无索引
  • TreeSet:按照大小默认升序排序、不重复、无索引
    代码验证本文省略掉了。可以在java环境中试试看看。
    在这里插入图片描述

1.1 Collection常用的方法

常用的方法便是add()、clear()、isEmpty()、size()、remove()、toArray()
Collection的遍历方式,如下图所示:
在这里插入图片描述
这里推荐使用迭代器的方式进行遍历,经过实验证明,迭代器遍历是速度最快的 。

2.List集合

2.1 特点、特有的方法

List系列的集合特点:有序、可重复、有索引
在这里插入图片描述

2.2 List集合的特有方法

List集合因为支持索引,所以多了很多与索引相关的方法,当然,Collection的功能List也都继承了。
在这里插入图片描述
这一系列的集合中,因为List是有索引的,可以直接用for进行循环,其他Collection的遍历方式也能使用。

2.3 ArrayList底层原理

ArrayList基于素组实现的。其中,索引根据索引查找速度会比较快;查询数据通过地址和索引定位,查询任意值数据耗时相同。
删除效率低:可能需要把后面的数据前移。
添加效率极低:可能需要把后面很多的数据后移,再添加元素;或者也可能需要进行数组的扩容。

ArrayList底层原理
1 . 利用无参构造器创建的集合,会在底层创建一个默认长度为0的数组;
2 .添加第一个元素时,底层会创建一个新的长度为10的数组;
3.存满时,会扩容1.5倍;
4.如果一次添加多个元素,1.5倍还放不下,则新创建数组的长度以实际为准
在这里插入图片描述

2.4 LinkedList底层原理

LinkedList是基于双向链表实现的。链表有什么特点呢,首先链表中的结点是独立的对象,在内存中是不连续的,每个结点包含数据值和下一个结点的地址。
在这里插入图片描述

链表的添加过程如下所示:
在这里插入图片描述
查询慢的特点:无论查询哪个数据都要从头开始。
链表的特点:链表增删相对快。只是修改指针。对首尾元素增删改查的速度极快。
索引Linked特意添加了头部与尾部的增删改的操作。
在这里插入图片描述

3.Set集合

Set系列集合特点:无序:添加数据的顺序和获取出的数据顺序不一致;不重复;无索引。
在这里插入图片描述

  • HashSet:无序、不重复、无索引。
  • LinkedHashset:有序、不重复、无索引。
  • Treeset:排序、不重复、无索引。

3.1 HashSet底层实现原理

需要也别说明的是,在真正了解HashSet集合的底层原理前,需要先搞清楚一个前置知识:哈希值。
在这里插入图片描述
HashSet集合的实现原理

  • 基于哈希表实现。
  • 哈希表是一种中增删改查数据,性能都好比较的数据结构。
    哈希表
  • JDK8之前,哈希表=数组+链表
    在这里插入图片描述
  • JDK8之后,哈希表=数组+链表+红黑树
  • 在这里插入图片描述
    关于红黑树,可理解为一颗自动平衡的二叉树。
    HashTable是一种增删改查性能都较好的数据结构。

3.2 HashSet去重原理

在这里插入图片描述

3.3 LinkedHashSet集合

特点:有序、不重复、无索引;实现依旧是基于数组+链表+红黑树实现。但是,它的每个元素都额外的多了一个双链表的机制记录他前后的位置。

在这里插入图片描述
缺点:占用内存比较大。

3.4 TreeSet集合

特点:不重复、无索引、可排序(默认升序,按照元素大小,由小到大排序)。
底层实现时基于红黑树的排序 。
注意:
对于数字类型:Integer、Double,默认按照本身的大小进行升序排序。
对于字符串类型:默认按照首字母升序排序
对于自定义类型如Student对象,TreeSet无法直接排序。
自定义排序规则
在这里插入图片描述
具体实现代码如下所示:
在这里插入图片描述
关于Collection相关的集合已经结束,在工作过程中,可以根据集合的特性实现不同的业务功能。
在这里插入图片描述
注意并发执行修改出现的问题。如在集合遍历里面添加删除或者添加的问题。
在这里插入图片描述
修改后:
在这里插入图片描述
在这里插入图片描述
用增强for没办法解决并发修改的问题。

4.Map集合

4.1 前置知识:

可变参数

  • 就是一种特殊的形参,定义在方法、构造器的形参列表里面,格式:数据类型…参数名称
    可变参数的特点和好处
  • 特点:可以不传数据给他,可以传一个或者同时传多个数据给它,也可以传一个数组给它。
  • 好处:常常用来灵活的接收数据
    在这里插入图片描述

4.2 概述

在这里插入图片描述

  • Map集合称为双列集合,格式:{key1=value1,key2=value2,key3=value3,….,一次需要存一对数据做为一个元素。
  • Map集合的每个元素“key=value”称为一个键值对/键值对对象/一个Entry对象,Map集合也被叫做“键值对集合。
  • Map集合的所有键是不允许重复的,但值可以重复,键和值是一一对应的,每一个键只能找到自己对应的值。

在这里插入图片描述
在开发中,如果遇到存储一一对应的数据时,就可以考虑使用Map集合来做。
Map集合体系的特点
注意:Map系列集合的特点都是由键决定的,值只是一个附属品,值是不做要求的

  • HashMap(由键决定特点):无序、不重复、无索引;(用的最多)
  • LinkedHashMap (由键决定特点):由键决定的特点:有序、不重复、无索引。
  • TreeMap (由键决定特点):按照大小默认升序排序、不重复、无索引。

4.3 Map集合常用的方法以及遍历

常用的方法: put(key,value),get(key),clear,isEmpty()。无非就是增删改查,清空的操作,判断是否为空。本文不进行代码实操了,有专门的javaapi文档,所以不需要记住,就跟我们不认识的字要去查字典一样。
遍历:一共就有三种,具体如下图所示:
在这里插入图片描述
第一种 方法:
在这里插入图片描述
代码实现:
在这里插入图片描述
第二种遍历方式:
在这里插入图片描述
第三种遍历方式:
推荐使用,代码太简单。直接上代码吧。
在这里插入图片描述

4.4 HashMap集合

特点:无序、无重复、无索引。
底层原理

  • HashMap跟Hashset的底层原理是一模一样的,都是基于哈希表实现的。
    实际上:原来学的Set系列集合的底层就是基于Map实现的,只是Set集合中的元素只要键数据,不要值数据而已
    哈希表:
  • JDK8之前,哈希表=数组+链表
  • JDK8之后,哈希表=数组+链表+红黑树
  • 哈希表是一种增删改查性能都较好的数据结构。
  • HashMap的键依赖hashCode方法和equals方法保证键的唯一。
  • 如果键存储的是自定义类型的对象,可以通过重写hashcode和equals方法,这样可以保证多个对象内容一样时,HashMap集合就能认为是重复的。

4.5 HashMap集合

LinkedHashMap集合的原理:
底层数据结构依然是基于哈希表实现的,只是每个键值对元素又额外的多了一个双链表的机制记录元素顺序(保证有序)。
实际上:原来学习的LinkedHashset集合的底层原理就是LinkedHashMap。
在这里插入图片描述

4.6 TreeMap特点

TreeMap (由键决定特点):按照键的大小默认升序排序、不重复、无索引。
TreeMap
特点:不重复、无索引、可排序(按照键的大小默认升序排序,只能对键排序)
原理:TreeMap跟TreeSet集合的底层原理是一样的,都是基于红黑树实现的排序。
TreeMap集合同样也支持两种方式来指定排序规则
让类实现Comparable接口,重写比较规则。
TreeMap集合有一个有参数构造器,支持创建Comparator比较器对象,以便用来指定比较规则。
在这里插入图片描述
或者这样更加灵活
在这里插入图片描述

结束语

结束了,关于集合看起来很多,其实有些实现原理是重复的,比如Set和Map的实现类,Set的实现类是基于Map实现的。

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

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

相关文章

51c自动驾驶~合集49

我自己的原文哦~ https://blog.51cto.com/whaosoft/13164876 #Ultra-AV 轨迹预测新基准!清华开源:统一自动驾驶纵向轨迹数据集 自动驾驶车辆在交通运输领域展现出巨大潜力,而理解其纵向驾驶行为是实现安全高效自动驾驶的关键。现有的开…

C# ASP.NET 介绍

.NET学习资料 .NET学习资料 .NET学习资料 一、概述 ASP.NET是由微软创建的一个开源 Web 框架,用于使用.NET 构建现代化的 Web 应用程序和服务。它为开发者提供了一套丰富的工具、库和编程模型,使得创建功能强大、高效且安全的 Web 应用变得更加容易。…

AI基础 -- AI学习路径图

人工智能从数学到大语言模型构建教程 第一部分:AI 基础与数学准备 1. 绪论:人工智能的过去、现在与未来 人工智能的定义与发展简史从符号主义到统计学习、再到深度学习与大模型的变迁本书内容概览与学习路径指引 2. 线性代数与矩阵运算 向量与矩阵的…

【05】RUST常用的集合函数宏类型

文章目录 常用集合VecStringHashMap 宏打印 类型Option<T> 常用集合 Vec 堆上连续内存vector可能出现扩容&#xff0c;把老元素copy到内存新位置 因此不允许let first &v[0];作用域内调用v.push(4); // 定义 let v: Vec<i32> Vec::new(); let v vec![1,…

Unity-Mirror网络框架-从入门到精通之MultipleMatches示例

文章目录 前言MultipleMatchesLobbyViewRoomViewMatchGUIPlayerGUI总结前言 在现代游戏开发中,网络功能日益成为提升游戏体验的关键组成部分。本系列文章将为读者提供对Mirror网络框架的深入了解,涵盖从基础到高级的多个主题。Mirror是一个用于Unity的开源网络框架,专为多人…

VMware Workstation创建虚拟机

目录 创建新的虚拟机 虚拟机快照功能 虚拟机添加空间 其他注意事项 创建新的虚拟机 打开VMware Workstation&#xff1a;启动软件后&#xff0c;点击“创建新的虚拟机”。 选择安装方式&#xff1a; 典型安装&#xff1a;适合大多数用户&#xff0c;会自动完成大部分配置…

DeepSeek AI R1推理大模型API集成文档

DeepSeek AI R1推理大模型API集成文档 引言 随着自然语言处理技术的飞速发展&#xff0c;大语言模型在各行各业的应用日益广泛。DeepSeek R1作为一款高性能、开源的大语言模型&#xff0c;凭借其强大的文本生成能力、高效的推理性能和灵活的接口设计&#xff0c;吸引了大量开发…

前后端交互方式

在现代 Web 开发中,前后端的高效交互是构建流畅、响应迅速应用的核心。随着技术的不断发展,传统的请求响应模型已不再满足复杂应用的需求。本文将探讨多种前后端交互的方式,从经典的 HTTP 请求到实时数据传输的 WebSocket、GraphQL 等协议,每种方法都有其独特的优势和适用场…

Node.js调用DeepSeek Api 实现本地智能聊天的简单应用

在人工智能快速发展的今天&#xff0c;如何快速构建一个智能对话应用成为了开发者们普遍关注的话题。本文将为大家介绍一个基于Node.js的命令行聊天应用&#xff0c;它通过调用硅基流动&#xff08;SiliconFlow&#xff09;的API接口&#xff0c;实现了与DeepSeek模型的智能对话…

活泼瘤胃球菌(Ruminococcus gnavus)——多种疾病风险的潜在标志物

​ 前几日&#xff0c;南方医科大学深圳医院院长周宏伟教授团队在国际顶尖医学期刊《Nature Medicine》上发表了一项重要研究。首次揭示一种名为活泼瘤胃球菌(Ruminococcus gnavus)的细菌产生的物质——苯乙胺&#xff0c;在肝性脑病发生中的关键作用。 ​ 同时谷禾的人群检测数…

8.flask+websocket

http是短连接&#xff0c;无状态的。 websocket是长连接&#xff0c;有状态的。 flask中使用websocket from flask import Flask, request import asyncio import json import time import websockets from threading import Thread from urllib.parse import urlparse, pars…

qiime2:安装与使用

试一下docker安装 docker pull quay.io/qiime2/amplicon:2024.10 docker images docker run -v {挂载的目录}:/data quay.io/qiime2/amplicon:2024.10 qiime -h使用 import.txt docker run -v ~/diarrhoea/MJ/qingzhu:/data quay.io/qiime2/amplicon:2024.10 qiime tools imp…

pair的使用(c++)

pair 是 C 标准库中的一个模板类&#xff0c;用于将两个值组合成一个单一对象&#xff0c;通常用于存储键值对或返回多个它有两个公有成员 first 和 second&#xff0c;分别表示第一个值和第二个值。 我们可以把pair 理解成 C为我们提供一个结构体&#xff0c;里面有两个变量:…

JUnit断言方法详解与实战

在Java开发中&#xff0c;JUnit是一个不可或缺的单元测试框架&#xff0c;而org.junit.Assert类中的断言方法则是JUnit的核心功能之一。通过这些方法&#xff0c;我们可以方便地验证代码的正确性。本文将详细介绍一些常用的断言方法&#xff0c;并通过实例展示它们的使用。 一、…

推荐算法实践:movielens数据集

MovieLens 数据集介绍 MovieLens 数据集是由明尼苏达大学的GroupLens研究小组维护的一个广泛使用的电影评分数据集&#xff0c;主要用于推荐系统的研究。该数据集包含用户对电影的评分、标签以及其他相关信息&#xff0c;是电影推荐系统开发与研究的常用数据源。 数据集版本 …

基于vue2 的 vueDraggable 示例,包括组件区、组件放置区、组件参数设置区 在同一个文件中实现

为了在Vue 2中实现一个包含组件区、组件放置区以及组件参数设置区的界面&#xff0c;我们可以使用vue-draggable库来处理拖拽功能&#xff0c;并结合其他UI组件库如Element UI来构建界面。下面是一个基本的示例&#xff0c;展示如何实现这样的布局。 第一步&#xff1a;安装必…

技术实战|ELF 2学习板本地部署DeepSeek-R1大模型的完整指南(一)

DeepSeek作为国产AI大数据模型的代表&#xff0c;凭借其卓越的推理能力和高效的文本生成技术&#xff0c;在全球人工智能领域引发广泛关注。DeepSeek-R1作为该系列最新迭代版本&#xff0c;实现了长文本处理效能跃迁、多模态扩展规划、嵌入式适配等技术维度的突破。 RK3588作为…

DeepSeek本地部署_桌面版AnythingLLM本地知识库搭建

一.DeepSeek本地部署 1.下载并安装&#xff1a;ollama Download Ollama on macOSDownload Ollama for macOShttps://ollama.com/download 安装是否成功确认&#xff0c;管理员权限运行PowerShell&#xff1a; ollama -h 2.下载安装DeepSeek 管理员方式运行PowerShell&#…

DeepSeek+3D视觉机器人应用场景、前景和简单设计思路

DeepSeek3D视觉机器人在多个领域具有广泛的应用场景和巨大的前景。以下是详细的分析&#xff1a; 应用场景 制造业 自动化装配&#xff1a;机器人可以精确地抓取和装配零件&#xff0c;提高生产效率和产品质量。 质量检测&#xff1a;通过3D视觉技术检测产品缺陷&#xff0c;确…

BGP基础协议详解

BGP基础协议详解 一、BGP在企业中的应用二、BGP概述2.1 BGP的特点2.2 基本配置演示2.3 抓包观察2.4 BGP的特征三、BGP对等体关系四、bgp报文4.1 BGP五种报文类型(重点)4.2 BGP报文格式-报文头格式4.3 Open报文格式4.4 Update报文格式4.5 Notification报文格式4.6 Route-refre…