Java语言第三篇集合

集合

  • 集合
      • List集合
      • ArrayList
      • LinkedList
      • 泛型
      • Set
      • TreeSet集合特点
      • 数据结构
      • HashSet集合
      • Map集合
      • HashMap
      • TreeMap
      • 可变参数
      • 创建不可变集合

集合

集合和数组的对比

  • 数组的长度是不可变的,集合的长度是可变的。
  • 数组可以存基本数据类型和引用数据类型。集合只能存引用数据类型,如果要存基本数据类型,需要存对应的包装类。

Collection 集合

  • 是单例集合的顶层接口,它表示一组对象,这些对象也称为Collection的元素
  • JDK 不提供此接口的任何直接实现,它提供更具体的子接口(如Set和List)实现
    创建Collection集合的对象
  • 多态的方式
  • 具体的实现类ArrayList

Collection 集合常用方法

boolean add(E e) 添加元素
boolean remove(Object o) 从集合中移除指定的元素
boolean removeif(Object o) 根据条件进行删除
void clear() 清空集合
boolean contains(Object o) 判断集合中是否存在指定的元素
boolean isEmpty() 判断集合是否为空
int size() 集合的长度,也就是集合中元素的个数

Collection 集合的遍历
Iterator:迭代器,集合的专用遍历方式

  • Iterator iterator():返回集合中的迭代器对象,该迭代器对象默认指向当前集合的0索引。

Iterator中的常用方法

  • boolean hasNext():判断当前位置是否有元素可以被取出
  • E next():获取当前位置的元素将迭代器对象移向下一个索引位置

增强for循环:简化数组和Collection集合的遍历

  • 它是JDK5之后出现的,其内部原理是一个Iterator迭代器
  • 实现Iterable接口的类才可以使用迭代器和增强for

增强for的格式

for(元素数据类型 变量名 : 数组或者Collection集合) {
//在此处使用变量即可,该变量就是元素
}

List集合

List集合概述

  • 有序集合,这里的有序指的是存取顺序
  • 用户可以精确控制列表中每个元素的插入位置。用户可以通过整数索引访问元素,并搜索列表中的元素
  • 与Set集合不同,列表通常允许重复的元素

List集合特点

  • 有序:存储和取出的元素顺序一致
  • 有索引:可以通过索引操作元素
  • 可重复:存储的元素可以重复

List集合特有方法

void add(int index,E element) 在此集合中的指定位置插入指定的元素
E remove(int index) 删除指定索引处的元素,返回被删除的元素
E set(int index,E element) 修改指定索引处的元素,返回被修改的元素
E get(int index) 返回指定索引处的元素

数据结构

  • 栈:先进后出
  • 队列:先进先出
  • 数组:查询快,增删慢的模型
  • 链表:单向链表,双向链表

ArrayList

底层数据结构是数组,查询快,增删慢

  1. ArrayList的构造方法和添加方法
public ArrayList()创建一个空的集合对象
public boolean add(E e)将指定的元素追加到此集合的末尾
public void add(int index,E element)在此集合中的指定位置插入指定的元素

ArrayList :

​ 可调整大小的数组实现

​ : 是一种特殊的数据类型,泛型。在出现E的地方我们使用引用数据类型替换即可

3.ArrayList类常用方法

**成员方法 : **

public boolean remove(Object o)删除指定的元素,返回删除是否成功
public E remove(int index)删除指定索引处的元素,返回被删除的元素
public E set(int index,E element)修改指定索引处的元素,返回被修改的元素
public E get(int index)返回指定索引处的元素
public int size()返回集合中的元素的个数

4.创建集合对象
ArrayList<引用数据类型> 对象名 = new ArrayList<引用数据类型>();

LinkedList

底层数据结构是链表,查询慢,增删快

泛型

泛型:是JDK5中引入的特性,它提供了编译时类型安全检测机制
泛型可以使用的地方:
类后面-泛型类
方法申明上-泛型方法
接口后面-泛型接口

创建泛型类的对象时,必须要给这个泛型确定具体的数据类型。

泛型的定义格式:

  • <类型>:指定一种类型的格式。
    • 尖括号里面可以任意书写,按照变量的定义规则即可。一般只写一个字母。
  • <类型1,类型2…>:指定多种类型的格式,多种类型之间用逗号隔开。比如:<E , T> <Q , M> <K , V>

泛型类

  • 格式:修饰符 class 类名<类型> { }
  • 范例:public class Generic { }
    • 此处T可以随便写为任意标识,常见的如T、E、K、V等形式的参数常用于表示泛型

泛型方法

  • 格式:修饰符 <类型> 返回值类型 方法名(类型 变量名) { }
  • 范例:public void show(T t) { }

泛型接口

  • 格式:修饰符 interface 接口名<类型> { }
  • 范例:public interface Generic { }

泛型接口的使用方式:

  • 实现类也不给泛型
  • 实现类确定具体的数据类型

类型通配符

  • 类型通配符:<?>
  • ArrayList<?>:表示元素类型未知的ArrayList,它的元素可以匹配任何的类型
  • 但是并不能把元素添加到ArrayListList中了,获取出来的也是父类类型
  • 类型通配符上限:<? extends 类型>
  • 比如: ArrayListList <? extends Number>:它表示的类型是Number或者其子类型
  • 类型通配符下限:<? super 类型>
  • 比如: ArrayListList <? super Number>:它表示的类型是Number或者其父类型

Set

Set集合特点

  • 可以去除重复
  • 存取顺序不一致
  • 没有带索引的方法,所以不能使用普通for循环遍历,也不能通过索引来获取,删除Set集合里面的元素

TreeSet集合特点

  • 不包含重复元素的集合
  • 没有带索引的方法
  • 可以将元素按照规则进行排序

自然排序Comparable的使用

  • 使用空参构造创建TreeSet集合
  • 自定义的Student类实现Comparable接口
  • 重写里面的compareTo方法

比较器排序Comparator的使用

  • TreeSet的带参构造方法使用的是比较器排序对元素进行排序的
  • 比较器排序,就是让集合构造方法接收Comparator的实现类对象,重写compare(T o1,T o2)方法
  • 重写方法时,一定要注意排序规则必须按照要求的主要条件和次要条件来写

两种比较方式小结

  • 自然排序:自定义类实现Comparable接口,重写compareTo方法,根据返回值进行排序。
  • 比较器排序:创建TreeSet对象的时候传递Comparator的实现类对象,重写compare方法,根据返回值进行排序。
  • 在使用的时候,默认使用自然排序,当自然排序不满足现在的需求时,使用比较器排序

两种方式中,关于返回值的规则:

  • 如果返回值为负数,表示当前存入的元素是较小值,存左边
  • 如果返回值为0,表示当前存入的元素跟集合中元素重复了,不存
  • 如果返回值为正数,表示当前存入的元素是较大值,存右边

数据结构

二叉树

二叉查找树又称二叉排序树或者二叉搜索树
特点:

  • 每一个节点上最多有两个子节点
  • 左子树上所有节点的值都小于根节点的值
  • 右子树上所有节点的值都大于根节点的值

平衡二叉树

  • 二叉树左右两个子树的高度差不超过1
  • 任意节点的左右两个子树都是一颗平衡二叉树

旋转

  • 左旋
    • 逆时针旋转
    • 右子节点变成父节点(根节点)
    • 原先的根节点降级变成左子节点
    • 将多余的左子节点出让,给降级的节点作为右子节
  • 右旋
    • 顺时针旋转
    • 左子节点变成父节点(根节点)
    • 原先的根节点降级变成右子节点
    • 将多余的右子节点出让,给降级的节点作为左子节点
  • 触发时机:当添加一个节点之后,该树不再是一颗平衡二叉树

红黑树

  • 平衡二叉B树
  • 每一个节点可以是红或者黑
  • 红黑树不是高度平衡的,它的平衡是通过“自己的红黑规则"进行实现的

红黑规则

  1. 每一个节点或是红色的,或者是黑色的。
  2. 根节点必须是黑色
  3. 如果一个节点没有子节点或者父节点,则该节点相应的指针属性值为Nil,这些Nil视为叶节点,每个叶节点(Nil)是黑色的;
  4. 如果某一个节点是红色,那么它的子节点必须是黑色(不能出现两个红色节点相连的情况)
  5. 对每一个节点,从该节点到其所有后代叶节点的简单路径上,均包含相同数目的黑色节点;

HashSet集合

  • 底层数据结构是哈希表
  • 对集合的迭代顺序不作任何保证,也就是说不保证存储和取出的元素顺序一致
  • 没有带索引的方法,所以不能使用普通for循环遍历
  • 由于是Set集合,所以元素唯一

哈希值

哈希值:是JDK根据对象的地址或者字符串或者数字算出来的int类型的数值
Object类中有一个方法可以获取对象的哈希值

  • public int hashCode():返回对象的哈希码值

对象的哈希值特点

  • 同一个对象多次调用hashCode()方法返回的哈希值是相同的
  • 默认情况下,不同对象的哈希值是不同的。而重写hashCode()方法,可以实现让不同对象的哈希值相同

常见数据结构之哈希表

  • JDK8之前,底层采用数组+链表实现,可以说是一个元素为链表的数组
  • JDK8以后,在长度比较长的时候,底层实现了优化

HashSet1.7版本原理解析

  1. 创建一个默认长度16,默认加载因为0.75的数组,数组名table
  2. 根据元素的哈希值跟数组的长度计算出应存入的位置
  3. 判断当前位置是否为null,如果是null直接存入
  4. 如果位置不为null,表示有元素,则调用equals方法比较属性值
  5. 如果一样,则不存,如果不一样,则存入数组,老元素挂在新元素下面
  6. 当数组存满到16*0.75=12时,就自动扩容,每次扩容原先的两倍

HashSet1.8版本原理解析

底层结构:哈希表。(数组、链表、红黑树的结合体)。当挂在下面的元素过多,那么不利于查询,所以在JDK8以后,当链表长度超过8的时候,自动转换为红黑树。存储流程不变。

利用HashSet存储自定义元素,必须重写hashCode和equals方法

Map集合

  • Interface Map<K,V> K:键的数据类型;V:值的数据类型
  • 键不能重复,值可以重复
  • 键和值是一一对应的,每一个键只能找到自己对应的值
  • (键 + 值) 这个整体 我们称之为“键值对”或者“键值对对象”,在Java中叫做“Entry对象

Map集合的基本功能

V put(K key,V value) 添加元素
V remove(Object key) 根据键删除键值对元素
void clear() 移除所有的键值对元素
boolean containsKey(Object key) 判断集合是否包含指定的键
boolean containsValue(Object value) 判断集合是否包含指定的值
boolean isEmpty() 判断集合是否为空
int size() 集合的长度,也就是集合中键值对的个数

Map集合的获取功能

V get(Object key) 根据键获取值
Set<K> keySet() 获取所有键的集合
Set<Map.Entry<K,V>> entrySet() 获取所有键值对对象的集合
K getKey() 获得键
V getValue() 获得值

HashMap

  • HashMap是Map里面的一个实现类。
  • 没有额外需要学习的特有方法,直接使用Map里面的方法就可以了
  • HashMap跟HashSet一样底层是哈希表结构的
  • 依赖hashCode方法和equals方法保证键的唯一
  • 如果键要存储的是自定义对象,需要重写hashCode和equals方法

TreeMap

  • TreeMap是Map里面的一个实现类。
  • 没有额外需要学习的特有方法,直接使用Map里面的方法就可以了
  • TreeMap跟TreeSet一样底层是红黑树结构的
  • 依赖自然排序或者比较器排序,对键进行排序
  • 如果键存储的是自定义对象,需要实现Comparable接口或者在创建TreeMap对象时候给出比较器排序规则

可变参数

可变参数:就是形参的个数是可以变化的

  • 格式:修饰符 返回值类型 方法名(数据类型… 变量名) { }
  • 范例:public static int sum(int… a) { }
    可变参数注意事项
  • 这里的变量其实是一个数组
  • 如果一个方法有多个参数,包含可变参数,可变参数要放在最后

创建不可变集合

static <E> List<E> of(E…elements) 创建一个具有指定元素的List集合对象
static <E> Set<E> of(E…elements) 创建一个具有指定元素的Set集合对象
static <K , V> Map<K,V> of(E…elements) 创建一个具有指定元素的Map集合对象
  • 在List、Set、Map接口中,都存在of方法,可以创建一个不可变的集合。
  • 这个集合不能添加,不能删除,不能修改。
  • 但是可以结合集合的带参构造,实现集合的批量添加。
  • 在Map接口中,还有一个ofEntries方法可以提高代码的阅读性。
  • 首先会把键值对封装成一个Entry对象,再把这个Entry对象添加到集合当中。

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

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

相关文章

「nuxt2配置tailwindcss」nuxt2添加tailwindcss详细步骤!解决版本不对称各种报错~~

1.插件下载 官方地址 npm install -D nuxtjs/tailwindcss3.4.3 tailwindcss3.4.1 postcss^8.4.33 autoprefixer10.4.17 2.nuxt.config.js配置 module.exports {// ...buildModules: [nuxtjs/tailwindcss],// ... }3.tailwind.config.js npx tailwindcss init module.exports…

【NVIDIA】Jetson Orin Nano系列:Qt+Gstreamer(02):gstreamer输出图像到Qt控件上

1、pro配置 QT += core gui greaterThan(QT_MAJOR_VERSION, 4): QT += widgets CONFIG += c++17LIBS +=-lglib-2.0 LIBS +=-lgobject-2.0 LIBS +=

复合机器人颠覆传统上下料,实现高效精准生产

在追求高效、精准生产的现代制造业中&#xff0c;传统的上下料方式已经无法满足企业的需求。复合机器人的出现&#xff0c;为制造业带来了革命性的变革。它不仅提高了生产效率&#xff0c;降低了生产成本&#xff0c;还为企业创造了更大的竞争优势。复合机器人的广泛应用&#…

记录php 生成树

经常用php 生成树形结构&#xff0c;这里记录一遍 有两种方法 第一种是引用调用&#xff0c;特点是运行速度快&#xff0c;只需要循环一遍&#xff0c;但是无法动态修改里面数据 第二种是递归调用&#xff0c;可以动态调用数据 结论&#xff1a; 如果数据在几十条建议使用 …

openssl3.2/test/certs - 023 - EC cert with explicit curve

文章目录 openssl3.2/test/certs - 023 - EC cert with explicit curve概述笔记END openssl3.2/test/certs - 023 - EC cert with explicit curve 概述 openssl3.2 - 官方demo学习 - test - certs 并没有看到指定了椭圆曲线的参数, 还是rsa证书. 可能后面的脚本会生成指定了…

SpringBoot 整合redis

1、添加项目依赖 <dependency><groupId>redis.clients</groupId><artifactId>jedis</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test&l…

【复现】万户ezoffice协同管理平台 SQL注入漏洞_26

目录 一.概述 二 .漏洞影响 三.漏洞复现 1. 漏洞一&#xff1a; 四.修复建议&#xff1a; 五. 搜索语法&#xff1a; 六.免责声明 一.概述 万户ezOFFICE协同管理平台分为企业版和政务版。 解决方案由五大应用、两个支撑平台组成&#xff0c;分别为知识管理、工作流程、沟…

小新22-IAP,24-IAP,27-IAP(F0GG,F0GH,F0GJ)原厂Win11.22H2系统

lenovo联想小新22寸,24寸,27寸IAP原装出厂Windows11系统镜像还原包&#xff0c;恢复出厂开箱状态 适用型号&#xff1a; 联想小新27-IAP(F0GJ),小新24-IAP(F0GH),小新22-IAP(F0GG) IdeaCentre AIO 3 22IAP7,IdeaCentre AIO 3 24IAP7,IdeaCentre AIO 3 27IAP7 链接&#xff1…

每日一练:LeeCode-257、二叉树的所有路径【二叉树】

本文是力扣LeeCode-257、二叉树的所有路径 学习与理解过程&#xff0c;本文仅做学习之用&#xff0c;对本题感兴趣的小伙伴可以出门左拐LeeCode。 给你一个二叉树的根节点 root &#xff0c;按 任意顺序 &#xff0c;返回所有从根节点到叶子节点的路径。 叶子节点 是指没有子…

网络协议与攻击模拟_06攻击模拟SYN Flood

一、SYN Flood原理 在TCP三次握手过程中&#xff0c; 客户端发送一个SYN包给服务器服务端接收到SYN包后&#xff0c;会回复SYNACK包给客户端&#xff0c;然后等待客户端回复ACK包。但此时客户端并不会回复ACK包&#xff0c;所以服务端就只能一直等待直到超时。服务端超时后会…

算法通关村番外篇-面试150题二

​ 大家好我是苏麟 , 今天开始LeetCode面试经典150题 . ​ 大纲 1. 两数之和167. 两数之和 II - 输入有序数组15. 三数之和 1. 两数之和 描述 : 给定一个整数数组 nums 和一个整数目标值 target&#xff0c;请你在该数组中找出 和为目标值 target 的那 两个 整数&#xff0…

【GitHub项目推荐--开源2D 游戏引擎】【转载】

microStudio 是一个可在浏览器中运行的游戏引擎&#xff0c;它拥有一套精美、设计精良、全面的工具&#xff0c;可以非常轻松地帮助你创建 2D 游戏。 你可以在浏览器中访问 microStudio.dev 开始搭建你的游戏&#xff0c;当然你可以克隆现有项目或创建新游戏并开始编码&#x…

Flink多流转换(1)—— 分流合流

目录 分流 代码示例 使用侧输出流 合流 联合&#xff08;Union&#xff09; 连接&#xff08;Connect&#xff09; 简单划分的话&#xff0c;多流转换可以分为“分流”和“合流”两大类 目前分流的操作一般是通过侧输出流&#xff08;side output&#xff09;来实现&…

Mac Idea安装后无法启动

1、起因 想安装一个新版的idea2023.3.2&#xff0c;结果安装完之后直接无法启动 以为是卸载不干净&#xff0c;下载了一个腾讯柠檬&#xff0c;结果将2018版也一并卸载了 好家伙&#xff0c;彻底没得用 2、找原因 1&#xff09;查看idea报错信息 网上找了一圈&#xff0c;其…

C++20新版本特性—类型与对象

第一章 类型与对象 编程语言中会有类型的概念&#xff0c;C同样也拥有&#xff0c;而C是属于静态类型系统&#xff0c;也就是说对象、变量包括常量都是在编译时就能得到对象的类型&#xff0c;并且确定之后是不可以在改变的。但是对象是运行时的概念&#xff0c;那么&#xff…

Unity 适配器模式(实例详解)

文章目录 简介1. **Input Adapter 示例**2. **Component Adapter 示例**3. **网络数据解析适配器**4. **物理引擎适配**5. **跨平台服务适配** 简介 Unity中的适配器模式&#xff08;Adapter Pattern&#xff09;主要用于将一个类的接口转换为另一个接口&#xff0c;以便于原本…

系统移植 day1 tftp简单文件传输协议和nfs网络文件系统的环境搭建

一.系统移植 1.嵌入式系统的特点 三低&#xff1a;功耗低 成本低 体积小 两高&#xff1a;可靠性高 安全性高 2.通用嵌入式系统硬件一般由一下部分组成 微控制器:cpu 晶振:提供时钟 内存&#xff08;如&#xff1a;SRAM&#xff0c;SDRAM&#xff09;…

ctfshow-命令执行(web53-web72)

目录 web53 web54 web55 web56 web57 web58 web59 web60 web61 web62 web63 web64 web65 web66 web67 web68 web69 web70 web71 web72 web53 …

麒麟系统—— openKylin 安装到虚拟机以及开放SSH通过工具连接

麒麟系统—— openKylin 安装到虚拟机以及开放SSH通过工具连接 1. 在VMware中安装openKylin麒麟系统步骤1&#xff1a;准备VMware环境步骤2&#xff1a;创建新的虚拟机步骤3&#xff1a;安装openKylin麒麟系统步骤4&#xff1a;调整分别率步骤5&#xff1a;安装SSH 2. 使用Open…

x-cmd pkg | perl - 具有强大的文本处理能力的通用脚本语言

目录 介绍首次用户技术特点竞品进一步阅读 介绍 Perl 是一种动态弱类型编程语言。Perl 内部集成了正则表达式的功能&#xff0c;以及巨大的第三方代码库 CPAN;在处理文本领域,是最有竞争力的一门编程语言之一 生态系统&#xff1a;综合 Perl 档案网络 (CPAN) 提供了超过 25,0…