当前位置: 首页 > news >正文

JAVA-编程基础-10-集合

Lison <dreamlison@163.com>, v1.0.0, 2023.04.23

JAVA-编程基础-10-集合

文章目录

  • JAVA-编程基础-10-集合
    • List、Set、Map、队列全面解析
      • List
        • ArrayList
          • 创建ArrayList
        • 向ArrayList中添加元素

List、Set、Map、队列全面解析

在这里插入图片描述

Java 集合框架可以分为两条大的支线:”

  • Collection,主要由 List、Set、Queue 组成,List 代表有序、可重复的集合,典型代表就是封装了动态数组的 ArrayList 和封装了链表的 LinkedList;Set 代表无序、不可重复的集合,典型代表就是 HashSet 和 TreeSet;Queue 代表队列,典型代表就是双端队列 ArrayDeque,以及优先级队列 PriorityQueue。
  • Map,代表键值对的集合,典型代表就是 HashMap。

List

List 的特点是存取有序,可以存放重复的元素,可以用下标对元素进行操作。

ArrayList

// 创建一个集合
ArrayList<String> list = new ArrayList<String>();
// 添加元素
list.add("Li");
list.add("Cun");
list.add("Lison");// 遍历集合 for 循环
for (int i = 0; i < list.size(); i++) {String s = list.get(i);System.out.println(s);
}
// 遍历集合 for each
for (String s : list) {System.out.println(s);
}// 删除元素
list.remove(1);
// 遍历集合
for (String s : list) {System.out.println(s);
}// 修改元素
list.set(1, "Lison520");
// 遍历集合
for (String s : list) {System.out.println(s);
}

简单介绍一下 ArrayList 的特征

  • ArrayList 是由数组实现的,支持随机存取,也就是可以通过下标直接存取元素;
  • 从尾部插入和删除元素会比较快捷,从中间插入和删除元素会比较低效,因为涉及到数组元素的复制和移动;
  • 如果内部数组的容量不足时会自动扩容,因此当元素非常庞大的时候,效率会比较低。
创建ArrayList
ArrayList<String> alist = new ArrayList<String>();

可以通过上面的语句来创建一个字符串类型的 ArrayList(通过尖括号来限定 ArrayList 中元素的类型,如果尝试添加其他类型的元素,将会产生编译错误),更简化的写法如下:

List<String> alist = new ArrayList<>();

由于 ArrayList 实现了 List 接口,所以 alist 变量的类型可以是 List 类型;new 关键字声明后的尖括号中可以不再指定元素的类型,因为编译器可以通过前面尖括号中的类型进行智能推断

此时会调用无参构造方法(见下面的代码)创建一个空的数组,常量DEFAULTCAPACITY_EMPTY_ELEMENTDATA的值为 {}

public ArrayList() {this.elementData = DEFAULTCAPACITY_EMPTY_ELEMENTDATA;
}

如果非常确定 ArrayList 中元素的个数,在创建的时候还可以指定初始大小。

List<String> alist = new ArrayList<>(20);

这样做的好处是,可以有效地避免在添加新的元素时进行不必要的扩容。

向ArrayList中添加元素

可以通过 add() 方法向 ArrayList 中添加一个元素:

alist.add("Lison");
堆栈过程图示:
add(element)
└── if (size == elementData.length) // 判断是否需要扩容├── grow(minCapacity) // 扩容│   └── newCapacity = oldCapacity + (oldCapacity >> 1) // 计算新的数组容量│   └── Arrays.copyOf(elementData, newCapacity) // 创建新的数组├── elementData[size++] = element; // 添加新元素└── return true; // 添加成功

先是 add() 方法的源码

/** jdk1.8* 将指定元素添加到 ArrayList 的末尾* @param e 要添加的元素* @return 添加成功返回 true*/
public boolean add(E e) {ensureCapacityInternal(size + 1);  // 确保 ArrayList 能够容纳新的元素elementData[size++] = e; // 在 ArrayList 的末尾添加指定元素return true;
}

参数 e 为要添加的元素,此时的值为“Lison520”,size 为 ArrayList 的长度,此时为 0。

/*** 确保 ArrayList 能够容纳指定容量的元素* @param minCapacity 指定容量的最小值*/
private void ensureCapacityInternal(int minCapacity) {if (elementData == DEFAULTCAPACITY_EMPTY_ELEMENTDATA) { // 如果 elementData 还是默认的空数组minCapacity = Math.max(DEFAULT_CAPACITY, minCapacity); // 使用 DEFAULT_CAPACITY 和指定容量的最小值中的较大值}ensureExplicitCapacity(minCapacity); // 确保容量能够容纳指定容量的元素
}

此时:

  • 参数 minCapacity 为 1(size+1 传过来的)
  • elementData 为存放 ArrayList 元素的底层数组,前面声明 ArrayList 的时候讲过了,此时为空 {}
  • DEFAULTCAPACITY_EMPTY_ELEMENTDATA 前面也讲过了,为 {}

所以,if 条件此时为 true,if 语句minCapacity = Math.max(DEFAULT_CAPACITY, minCapacity)要执行。

DEFAULT_CAPACITY 为 10(见下面的代码),所以执行完这行代码后,minCapacity 为 10,Math.max() 方法的作用是取两个当中最大的那个。

private static final int DEFAULT_CAPACITY = 10;

执行 ensureExplicitCapacity() 方法,来看一下源码:

/*** 检查并确保集合容量足够,如果需要则增加集合容量。** @param minCapacity 所需最小容量*/
private void ensureExplicitCapacity(int minCapacity) {// 检查是否超出了数组范围,确保不会溢出if (minCapacity - elementData.length > 0)// 如果需要增加容量,则调用 grow 方法grow(minCapacity);
}

此时:

  • 参数 minCapacity 为 10
  • elementData.length 为 0(数组为空)

所以 10-0>0,if 条件为 true,进入 if 语句执行 grow() 方法,来看源码:

/*** 扩容 ArrayList 的方法,确保能够容纳指定容量的元素* @param minCapacity 指定容量的最小值*/
private void grow(int minCapacity) {// 检查是否会导致溢出,oldCapacity 为当前数组长度int oldCapacity = elementData.length;int newCapacity = oldCapacity + (oldCapacity >> 1); // 扩容至原来的1.5倍if (newCapacity - minCapacity < 0) // 如果还是小于指定容量的最小值newCapacity = minCapacity; // 直接扩容至指定容量的最小值if (newCapacity - MAX_ARRAY_SIZE > 0) // 如果超出了数组的最大长度newCapacity = hugeCapacity(minCapacity); // 扩容至数组的最大长度// 将当前数组复制到一个新数组中,长度为 newCapacityelementData = Arrays.copyOf(elementData, newCapacity);
}

此时:

  • 参数 minCapacity 为 10
  • 变量 oldCapacity 为 0

所以 newCapacity 也为 0,于是 newCapacity - minCapacity 等于 -10 小于 0,于是第一个 if 条件为 true,执行第一个 if 语句 newCapacity = minCapacity,然后 newCapacity 为 10。

紧接着执行 elementData = Arrays.copyOf(elementData, newCapacity);,也就是进行数组的第一次扩容,长度为 10。

回到 add() 方法:

public boolean add(E e) {ensureCapacityInternal(size + 1);elementData[size++] = e;return true;
}

执行 elementData[size++] = e

此时:

  • size 为 0
  • e 为 “Lison520”

相关文章:

JAVA-编程基础-10-集合

Lison <dreamlison163.com>, v1.0.0, 2023.04.23 JAVA-编程基础-10-集合 文章目录 JAVA-编程基础-10-集合List、Set、Map、队列全面解析ListArrayList创建ArrayList 向ArrayList中添加元素 List、Set、Map、队列全面解析 Java 集合框架可以分为两条大的支线&#xff1a;…...

Unity实现倒计时和获取系统时间

一:创建UGUI 1.创建Canvas画布组件,调节Canvas画布的分辨率等其他设置。我们可以把视图设置为2D模式下。 2.创建Text文本组件,取名为Timer计时器,我们调整Text文本组件的大小,用锚点设置Text文本组件的位置,并且设置好Text文本组件的颜色。 3.我们再创建一个Text文…...

Unity 之 Time.deltaTime 的详细介绍以及用法

文章目录 Time.deltaTime 是什么&#xff1f;Time.deltaTime 有什么用&#xff1f;移动游戏对象&#xff1a;控制动画播放速度&#xff1a;实现平滑的计时器和延时&#xff1a; Time.deltaTime 是什么&#xff1f; “DeltaTime”&#xff08;也被称为 “Delta Time”&#xff…...

十四、Ubuntu中如何更换pip国内镜像源?以及设置软链接

前言&#xff1a;在配置之前&#xff0c;一定要给虚拟机拍照&#xff0c;以防万一&#xff01;&#xff01;&#xff01; 1、安装pip3 输入&#xff1a; sudo apt-get install python3-pip2、建立软链接 输入&#xff1a; sudo ln -s /usr/bin/pip3 /usr/bin/pip一般会出现…...

Spring Boot+Atomikos进行多数据源的分布式事务管理详解和实例

文章目录 0.前言1.参考文档2.基础介绍3.步骤1. 添加依赖到你的pom.xml文件:2. 配置数据源及其对应的JPA实体管理器和事务管理器:3. Spring BootMyBatis集成Atomikos4. 在application.properties文件中配置数据源和JPA属性&#xff1a; 4.使用示例5.底层原理 0.前言 背景&#x…...

地上集装箱式村庄污水处理设备厂家价格

诸城市鑫淼环保小编带大家了解一下地上集装箱式村庄污水处理设备厂家价格 废水经水解酸化池后自流到生物接触氧化池,接触氧化法是一种好氧生物膜法工艺,微生物以生物膜形式及悬浮态生长于水中.它兼具活性污泥及生物滤池二者的特点.在生物接触氧化池中有机碳水化合物被分解成C0和…...

ASIC-WORLD Verilog(13)状态机FSM

写在前面 在自己准备写一些简单的verilog教程之前&#xff0c;参考了许多资料----Asic-World网站的这套verilog教程即是其一。这套教程写得极好&#xff0c;奈何没有中文&#xff0c;在下只好斗胆翻译过来&#xff08;加点自己的理解&#xff09;分享给大家。 这是网站原文&…...

设置微软Edge浏览器主页和新标签页,摆脱扰人和分散注意力的主页

默认情况下,Microsoft Edge会向您显示世界上最令人分心和讨厌的主页(也称为主屏幕)。微软不想只向你展示一个搜索框,也许还有一个漂亮的背景或一些你喜欢的网站的快捷方式,而是想在你面前扔一堆新闻标题和广告。 你可能会打开浏览器阅读电子邮件,结果被Microsoft Edge主…...

视频汇聚平台EasyCVR安防视频监控平台新增经纬度选取功能的详细介绍

视频云存储/安防监控EasyCVR视频汇聚平台基于云边端智能协同&#xff0c;支持海量视频的轻量化接入与汇聚、转码与处理、全网智能分发、视频集中存储等。音视频流媒体视频平台EasyCVR拓展性强&#xff0c;视频能力丰富&#xff0c;具体可实现视频监控直播、视频轮播、视频录像、…...

HCIP-HCS华为私有云的使用

1、概述 HCS&#xff08;HuaweiCoudStack&#xff09;华为私有云&#xff1a;6.3 之前叫FusionSphere OpenStack&#xff0c;6.3.1 版本开始叫FusionCloud&#xff0c;6.5.1 版本开始叫HuaweiCloud Stack (HCS)华为私有云软件。 开源openstack&#xff0c;发放云主机的流程&am…...

深度学习1.卷积神经网络-CNN

目录 卷积神经网络 – CNN CNN 解决了什么问题&#xff1f; 需要处理的数据量太大 保留图像特征 人类的视觉原理 卷积神经网络-CNN 的基本原理 卷积——提取特征 池化层&#xff08;下采样&#xff09;——数据降维&#xff0c;避免过拟合 全连接层——输出结果 CNN …...

浏览器输入一个URL之后发生了什么?

URL解析DNS解析TCP连接TSL连接HTTP请求TCP挥手接收并解析响应 URL 解析 主要分为&#xff1a; 协议&#xff0c;eg http,https域名或者ip地址&#xff0c;eg www.baidu.com 域名相对于ip地址来说&#xff0c;更方便人们记忆&#xff0c;但是实际的网络传输中使用的是ip地址 端…...

uniapp 布局(自定义导航栏加固定高度的主要内容)

不想让整体页面出现滚动条 页面大致分为三部分&#xff0c;导航栏、主题内容、tabbar&#xff0c;不想让整个页面出现滚动条&#xff0c;只想让主要内容滚动。 我这里是直接用了uni.getSystemInfoSync()&#xff0c;整体分为两部分&#xff0c;自定义头部和滚动内容&#xff…...

android手机销售app(IDEA,SpringBoot,SSM,MySQL)+支付宝支付+全套视频教程

本项目亮点: 支付宝支付 eCharts柱状图图表数据统计 【项目功能介绍】 本系统包含后台管理和前端app双端系统&#xff0c;后台管理的功能包含: 登录, 退出, 修改管理员信息(基本信息与头像),资源管理,角色管理,资源权限分配,字典管理,用户管理,图书管理,订单管理,订单统计; a…...

深入探讨Java虚拟机(JVM)的工作原理与优化策略

摘要&#xff1a;本文对Java虚拟机&#xff08;JVM&#xff09;的工作原理进行深入探讨&#xff0c;包括其内存管理、垃圾回收以及代码执行等方面。同时&#xff0c;文章还通过具体的代码示例&#xff0c;阐述了JVM的优化策略&#xff0c;旨在提高Java程序的性能。 一、引言 …...

WPF数据绑定

数据绑定是一个很强大且优雅的技能&#xff0c;之前用过好多次&#xff0c;但有些地方总不是特别清晰&#xff0c;常常需要重新翻阅资料来回顾&#xff0c;于是这次用了几天时间好好梳理一下&#xff0c;记录一下。 首先数据绑定对数据对象的要求&#xff1a;需要是公有属性&a…...

Android学习之路(6) 其他UI控件

ImageView(图像视图) RadioButton(单选按钮)&Checkbox(复选框) 开关按钮ToggleButton和开关Switch ProgressBar(进度条) SeekBar(拖动条) RatingBar(星级评分条) ScrollView(滚动条)...

matlab实现牛顿迭代法求解非线性方程

非线性方程是指含有未知数的方程&#xff0c;且方程中至少有一个未知数的次数大于一或者含有非一次幂的函数&#xff08;如指数、对数、三角函数等&#xff09;。例如&#xff0c;$f(x) x^3 - 2x - 5 0$就是一个非线性方程。非线性方程通常没有显式的解析解&#xff0c;因此需…...

Cpp学习——编译链接

目录 ​编辑 一&#xff0c;两种环境 二&#xff0c;编译环境下四个部分的 1.预处理 2.编译 3.汇编 4.链接 三&#xff0c;执行环境 一&#xff0c;两种环境 在程序运行时会有两种环境。第一种便是编译环境&#xff0c;第二种则是执行环境。如下图&#xff1a; 在程序运…...

android - fragment 数据丢失?状态丢失?

最佳答案 一些状态丢失的例子: 1. 假设您有一个按钮和一个 TextView 。在代码中&#xff0c;你已经定义了初始值为 0 的整数 i&#xff0c;它通过单击按钮递增 1&#xff0c;并且它的值显示在 TextView 中。假设你已经按下按钮 5 次&#xff0c;那么 textview 将被设置为 0。也…...

RocketMQ延迟消息机制

两种延迟消息 RocketMQ中提供了两种延迟消息机制 指定固定的延迟级别 通过在Message中设定一个MessageDelayLevel参数&#xff0c;对应18个预设的延迟级别指定时间点的延迟级别 通过在Message中设定一个DeliverTimeMS指定一个Long类型表示的具体时间点。到了时间点后&#xf…...

逻辑回归:给不确定性划界的分类大师

想象你是一名医生。面对患者的检查报告&#xff08;肿瘤大小、血液指标&#xff09;&#xff0c;你需要做出一个**决定性判断**&#xff1a;恶性还是良性&#xff1f;这种“非黑即白”的抉择&#xff0c;正是**逻辑回归&#xff08;Logistic Regression&#xff09;** 的战场&a…...

Admin.Net中的消息通信SignalR解释

定义集线器接口 IOnlineUserHub public interface IOnlineUserHub {/// 在线用户列表Task OnlineUserList(OnlineUserList context);/// 强制下线Task ForceOffline(object context);/// 发布站内消息Task PublicNotice(SysNotice context);/// 接收消息Task ReceiveMessage(…...

前端倒计时误差!

提示:记录工作中遇到的需求及解决办法 文章目录 前言一、误差从何而来?二、五大解决方案1. 动态校准法(基础版)2. Web Worker 计时3. 服务器时间同步4. Performance API 高精度计时5. 页面可见性API优化三、生产环境最佳实践四、终极解决方案架构前言 前几天听说公司某个项…...

【配置 YOLOX 用于按目录分类的图片数据集】

现在的图标点选越来越多&#xff0c;如何一步解决&#xff0c;采用 YOLOX 目标检测模式则可以轻松解决 要在 YOLOX 中使用按目录分类的图片数据集&#xff08;每个目录代表一个类别&#xff0c;目录下是该类别的所有图片&#xff09;&#xff0c;你需要进行以下配置步骤&#x…...

如何理解 IP 数据报中的 TTL?

目录 前言理解 前言 面试灵魂一问&#xff1a;说说对 IP 数据报中 TTL 的理解&#xff1f;我们都知道&#xff0c;IP 数据报由首部和数据两部分组成&#xff0c;首部又分为两部分&#xff1a;固定部分和可变部分&#xff0c;共占 20 字节&#xff0c;而即将讨论的 TTL 就位于首…...

.Net Framework 4/C# 关键字(非常用,持续更新...)

一、is 关键字 is 关键字用于检查对象是否于给定类型兼容,如果兼容将返回 true,如果不兼容则返回 false,在进行类型转换前,可以先使用 is 关键字判断对象是否与指定类型兼容,如果兼容才进行转换,这样的转换是安全的。 例如有:首先创建一个字符串对象,然后将字符串对象隐…...

HDFS分布式存储 zookeeper

hadoop介绍 狭义上hadoop是指apache的一款开源软件 用java语言实现开源框架&#xff0c;允许使用简单的变成模型跨计算机对大型集群进行分布式处理&#xff08;1.海量的数据存储 2.海量数据的计算&#xff09;Hadoop核心组件 hdfs&#xff08;分布式文件存储系统&#xff09;&a…...

基于Java Swing的电子通讯录设计与实现:附系统托盘功能代码详解

JAVASQL电子通讯录带系统托盘 一、系统概述 本电子通讯录系统采用Java Swing开发桌面应用&#xff0c;结合SQLite数据库实现联系人管理功能&#xff0c;并集成系统托盘功能提升用户体验。系统支持联系人的增删改查、分组管理、搜索过滤等功能&#xff0c;同时可以最小化到系统…...

PHP 8.5 即将发布:管道操作符、强力调试

前不久&#xff0c;PHP宣布了即将在 2025 年 11 月 20 日 正式发布的 PHP 8.5&#xff01;作为 PHP 语言的又一次重要迭代&#xff0c;PHP 8.5 承诺带来一系列旨在提升代码可读性、健壮性以及开发者效率的改进。而更令人兴奋的是&#xff0c;借助强大的本地开发环境 ServBay&am…...