集合Collection-List-ArrayList学习
一、集合
集合是数据容器。相较于数组集合具有以下几个特点:
- 数组一旦创建,长度不可改变。集合的长度会自动扩容。
- 集合具有很多数组没有的功能函数API
- 数组元素的存储特点单一,不同的集合有不同的存储特点。

1. Collection顶层接口
Collection表示一组对象,这些对象也称为collection的元素。有的是有序的List, 有的是无序的Set。
Collection c = new ArrayList();//多态的方式创建一个Collection类
1.1增删改查和其他操作
| 函数 | 作用 |
|---|---|
| add() | 添加元素 |
| remove() | 删除元素 |
| contains() | 判断是否包含 |
| toArray() | 转换成数组 |
| clear() | 清空集合 |
| size() | 获取集合元素个数 |
| retainAll() | 求两个集合的交集 |
| removeAll() | 求两个集合的差集 |
1.2迭代器遍历
| 函数 | 作用 |
|---|---|
| iterator() | 获取当前集合的迭代器对象 |
| hasNext() | 判断是否有下一个元素 |
| next() | 取出下一个元素 |
| remove() | 移除当前元素 |
public void test1(){Collection c = new ArrayList();//添加元素c.add("tom");c.add("jack");c.add("rose");c.add("jerry");//获取迭代器Iterator iterator = c.iterator();while(iterator.hasNext()){Object obj = iterator.next();System.out.println(obj);}}
1.3 foreach循环
foreach增强for循环是jdk5的新特性,通常用于遍历数组和Collection集合。相较于for循环,无法在遍历过程中得到元素的下标,进而无法直接修改元素,只能读取元素,但语法形式更为简单。
底层是使用迭代器来实现的,只有实现了Iterable接口的类才能使用foreach()来进行遍历。Collection类继承了Iterable接口,所以所有集合类都能够使用foreach和Iterator迭代器来实现所有元素的遍历。
注:实现了Iterator接口的类都可以使用foreach循环遍历。
for(元素类型 变量 :数组或Collection集合对象){//循环体
}//遍历数组
int[] arr = {11, 22, 33};
for(int i : arr){System.out.println(i);
}//遍历集合与上述代码类似,只是将数组名称改为集合名称
1.4 迭代器的快速失败机制
在使用迭代器遍历集合时, 有外部代码在同时修改元素集合,迭代器会迅速抛出ConcurrentModificationException。
例如,通常不允许一个线程在另一个线程迭代Collection时修改它。通常,在这些情况下,迭代的结果是不确定的。如果检测到这种行为,一些Iterator实现(包括JRE提供的所有通用集合实现)可能会选择抛出此异常。这样做的迭代器被称为<快速失败>迭代器,因为它们快速而干净地失败,而不是在未来不确定的时间冒任意的、不确定的行为的风险。
机制:当创建迭代器时,会使用变量modCount记录当前集合的修改次数。每次取出元素前都会检查判断该变量是否修改过,如果修改过,立即抛出异常。该机制并不能完全保证不会有外部代码修改元素。
public void test1(){Collection c = new ArrayList();//添加元素c.add("tom");c.add("jack");c.add("rose");//倒数第二个不会抛出异常c.add("jerry");//获取迭代器Iterator iterator = c.iterator();while(iterator.hasNext()){//遍历Object obj = iterator.next();if("jack".equals(obj)){//c.remove(obj);//集合的remove方法//迭代器自身的remove方法iterator.remove();}//System.out.println(obj);}System.out.println(c);}
2. List子接口
Collection有两个子接口,分别是List和Set。List集合的特点主要是以下几点:
- 元素是有序的
- 元素可以重复,Set集合不允许重复
- 可以通过索引访问元素
2.1 特有方法
List继承了父类Collection的方法,此外特有的方法都是通过下标找到指定位置来访问数据而增加的方法。
//截取一个子集合List subList = list.subList(0,2);System.out.println("subList = " + subList);//获取元素首次出现的位置int java = list.indexOf("java");System.out.println(java);//删除指定索引位置的元素Object remove = list.remove(1);//返回被删除的元素System.out.println("remove = " + remove);//替换指定位置的元素,返回被替换的元素Object java1 = list.set(1, "JAVA");System.out.println("java1 = " + java1);
2.2 List集合的遍历
- 迭代器遍历:可以使用迭代器的remove方法进行删除。
- 增强for循环:无法修改集合里面的元素
- 普通for循环:可删除,可修改。
- ListIterator迭代器
- 普通for循环:
2.3 ListIterator迭代器
Iterator接口的子接口,增加了(添加元素、修改元素、判断是否有上一个元素、取出上一个元素) 这几个方法。并且它的构造器可以定义遍历的开始位置。
//从第二个位置开始遍历
ListIterator iterator= new ListIterator(2);
查看是否有上一个元素:该方法是ListIterator特有的方法,使用该方法可以倒着遍历整个List集合。
iterator.hasPrevious();
3. ArrayList类
使用空参构造器创建对象,底层数组容量为0。第一次添加元素时,初始化容量为10。当放入数据大于初始容量时,数组扩容为原容量的1.5倍。增删时如果容量不足,需要动态扩容,效率不高,查询时直接通过数组索引查询,效率高。
特点:
- 元素有序可重复,可以通过索引访问
- 底层结构:
- 数组
- 增删慢,索引查找速度快
4. Vector类
底层也是数组实现的,线程安全的。ArrayList是线程不安全的。数组容量不足时,容量扩充到原先的2倍。效率低,不推荐使用。

相关文章:
集合Collection-List-ArrayList学习
一、集合 集合是数据容器。相较于数组集合具有以下几个特点: 数组一旦创建,长度不可改变。集合的长度会自动扩容。集合具有很多数组没有的功能函数API数组元素的存储特点单一,不同的集合有不同的存储特点。 1. Collection顶层接口 Collect…...
mybatispuls代码生成器
引入依赖 <?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://maven.apache.org/POM/4.0.0" xmlns:xsi"http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation"http://maven.apache.org/POM/4.0.…...
【设计模式】-代理模式
在软件开发中,经常遇到需要对某个对象进行控制或者监控的场景。而直接修改对象的代码可能使代码变得复杂且难以维护。这时,使用代理模式(Proxy Pattern)可以很好地解决这个问题。 代理模式是一种结构型设计模式,通过引…...
爬虫ip池越大越好吗?
作为一名资深的程序员,今天我要给大家分享一些关于爬虫ip池的知识。关于ip代理池的问题,答案是肯定的,池子越大越好。下面跟我一起来盘点一下ip池大的好处吧! 1、提高稳定性 爬虫ip池越大,意味着拥有更多可用的爬虫ip…...
目标检测常用的数据集格式
在目标检测领域,有三种常用的数据集: 数据集标注文件格式bbox格式vocxmlxmin, ymin, xmax, ymax:bbox左上角(xmin, ymin)和右下角(xmax, ymax)的坐标cocojsonx, y, w, h:bbox左上角坐标(x, y)以及宽(w)和高(h)yolotxtxcenter, ycenter, w, h:bbox的中心…...
chrome插件开发实例03-使用 chrome.storage API永久保存数据
目录 防止数据丢失 使用chrome.storage API 功能 功能演示 源代码 manifest.json popup.html...
Segment Anything(SAM) 计算过程
给定输入图像 I ∈ R 3 H W I \in R^{3 \times H \times W} I∈R3HW。给定需要的prompts: M ∈ R 1 H W M \in R^{1 \times H \times W} M∈R1HW,代表图片的前背景信息。 P ∈ R N 2 P \in R^{N \times 2} P∈RN2,其中 N N N 是点的个数…...
Nacos配置文件读取源码解析
Nacos配置文件读取 本篇文章是探究,springboot启动时nacos是如何将配置中心的配置读取到springboot环境中的 PropertySourceLocator org.springframework.cloud.bootstrap.config.PropertySourceLocator 是 springcloud 定义的一个顶级接口,用来定义所…...
Linux0.11内核源码解析-fcntl.c/iotcl.c/stat.c
fcntl fcntl.c实现了文件控制系统调用fcntl和两个文件句柄描述符的复制系统调用dup()和dup2()。 dup返回当前值最小的未用句柄,dup2返回指定新句柄的数值,句柄的复制操作主要用在文件的标准输入、输出重定向和管道方面。 dupfd 复制文件句柄ÿ…...
OpenStack简介
OpenStack简介 目录 OpenStack简介 1、云计算模式2、云计算 虚拟化 openstack之间的关系?3、OpenStack 中有哪些组件?4、计算节点负责虚拟机运行5、网络节点负责对外网络与内网之间的通信 5.1 网络节点仅包含Neutron服务5.2 网络节点包含三个网络端口6、…...
二分法的应用
文章目录 什么是二分法🎮二分查找的优先级二分查找的步骤💥图解演示🧩 代码演示🫕python程序实现🐈⬛C程序实现🐕🦺C程序实现🐯Java程序实现🐳 非常规类二分查找&…...
ChatGPT在大规模数据处理和信息管理中的应用如何?
ChatGPT作为一种强大的自然语言处理模型,在大规模数据处理和信息管理领域有着广泛的应用潜力。它可以利用其文本生成、文本理解和问答等能力,为数据分析、信息提取、知识管理等任务提供智能化的解决方案。以下将详细介绍ChatGPT在大规模数据处理和信息管…...
【算法篇C++实现】五大常规算法
文章目录 🚀一、分治法⛳(一)算法思想⛳(二)相关代码 🚀二、动态规划算法⛳(一)算法思想⛳(二)相关代码 🚀三、回溯算法⛳(一…...
MySQL和钉钉单据接口对接
MySQL和钉钉单据接口对接 数据源系统:钉钉 钉钉(DingTalk)是阿里巴巴集团打造的企业级智能移动办公平台,是数字经济时代的企业组织协同办公和应用开发平台。钉钉将IM即时沟通、钉钉文档、钉闪会、钉盘、Teambition、OA审批、智能人事、钉工牌…...
layui的基本使用-日期控件的业务场景使用入门实战案例一
效果镇楼; 1 前端UI层面; <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta http-equiv"X-UA-Compatible" content"IEedge"><meta name"viewport&…...
【2.1】Java微服务:详解Hystrix
✅作者简介:大家好,我是 Meteors., 向往着更加简洁高效的代码写法与编程方式,持续分享Java技术内容。 🍎个人主页:Meteors.的博客 💞当前专栏: Java微服务 ✨特色专栏: 知识分享 &am…...
Apache2.4源码安装与配置
环境准备 openssl-devel pcre-devel expat-devel libtool gcc libxml2-devel 这些包要提前安装,否则httpd编译安装时候会报错 下载源码、解压缩、软连接 1、wget下载[rootnode01 ~]# wget https://downloads.apache.org/httpd/httpd-2.4.57.tar.gz --2023-07-20 …...
Flume原理剖析
一、介绍 Flume是一个高可用、高可靠,分布式的海量日志采集、聚合和传输的系统。Flume支持在日志系统中定制各类数据发送方,用于收集数据;同时,Flume提供对数据进行简单处理,并写到各种数据接受方(可定制&…...
【leetcode】202. 快乐数(easy)
编写一个算法来判断一个数 n 是不是快乐数。 「快乐数」 定义为: 对于一个正整数,每一次将该数替换为它每个位置上的数字的平方和。然后重复这个过程直到这个数变为 1,也可能是 无限循环 但始终变不到 1。如果这个过程 结果为 1,…...
如何用瀑布图分析公司年报
原创: MicroStrategy微策略中国 , Jiping Sun 微策略企业级数据分析与移动应用9月21日2018年 摘要:利用达析报告开箱即用的瀑布图来展示各个度量值如何增加或减少。下载MicroStrategy Desktop 10.11以上版本,自己动手创建瀑布图。 瀑布图是由…...
Unpaywall:三步解锁学术付费墙,让论文自由获取触手可及
Unpaywall:三步解锁学术付费墙,让论文自由获取触手可及 【免费下载链接】unpaywall-extension Firefox/Chrome extension that gives you a link to a free PDF when you view scholarly articles 项目地址: https://gitcode.com/gh_mirrors/un/unpayw…...
Jasminum:3个简单步骤解决Zotero中文文献管理的核心痛点
Jasminum:3个简单步骤解决Zotero中文文献管理的核心痛点 【免费下载链接】jasminum A Zotero add-on to retrive CNKI meta data. 一个简单的Zotero 插件,用于识别中文元数据 项目地址: https://gitcode.com/gh_mirrors/ja/jasminum 还在为中文文…...
华为Hi1822 16G FC光纤卡驱动安装全攻略(CentOS7.6实测避坑指南)
华为Hi1822 16G FC光纤卡驱动安装全攻略(CentOS7.6实测避坑指南) 在数据中心运维领域,存储网络设备的驱动安装往往是系统部署中最容易踩坑的环节之一。作为华为旗舰级光纤通道卡,Hi1822 16G FC在性能与稳定性上表现优异࿰…...
51单片机 proteus仿真 直流电机
电路仿真代码#include <reg51.h>#define uchar unsigned char #define uint unsigned int #define LCD_Data P0 sbit IN1 P3^0; sbit IN2 P3^1; sbit ENA P3^2;sbit back P2^0; sbit forword P2^1; sbit up P2^2; sbit down P2^3; sbit stop P2^4; sbit LCD_RS…...
傲梅分区助手 使用教程:免安装硬盘分区管理工具
一、工具简介 傲梅分区助手是一款功能强大的硬盘分区管理工具,支持无损数据调整分区大小、合并/拆分分区、迁移系统到 SSD 等操作。 安装包下载:https://pan.xunlei.com/s/VOpm6nKehfUHH-MDyIbMIhGkA1?pwdpm5g# 二、使用步骤 1. 解压工具包 右键点…...
OpenCode快速上手:3步配置本地AI编程环境,告别复杂安装
OpenCode快速上手:3步配置本地AI编程环境,告别复杂安装 1. 引言:为什么选择OpenCode? 在AI编程助手领域,OpenCode以其独特的终端优先设计和隐私安全特性脱颖而出。作为一个2024年开源的Go语言框架,它能够…...
Deep Sort PyTorch:多目标跟踪的完整实践指南
Deep Sort PyTorch:多目标跟踪的完整实践指南 【免费下载链接】deep_sort_pytorch MOT using deepsort and yolov3 with pytorch 项目地址: https://gitcode.com/gh_mirrors/de/deep_sort_pytorch 想要在视频中实现准确的行人和车辆跟踪吗?Deep …...
详细介绍一下C++多线程同步之条件变量的典型用法
C 多线程同步:条件变量(std::condition_variable)详细用法 完整示例这是 C11 原生多线程最常用、最高效的同步机制,专门解决:线程需要等待某个条件满足才能继续执行的场景。一、核心概念(必须懂࿰…...
做自媒体一年,我靠这3个方法解决了“选题荒”
刚开始做自媒体的时候,我最怕的不是写稿,而是“今天写什么”。每天早上打开文档,脑子里一片空白。上周写了什么?前天写了什么?今天该写什么?完全没方向。有时候坐一个小时,标题都没憋出来。后来…...
ThinkPHP 8+ES的生命周期的庖丁解牛
它的本质是:PHP 应用作为客户端,通过 HTTP 协议与 ES 集群进行交互。这个过程涉及 JSON 序列化/反序列化、HTTP 连接管理、倒排索引的异步构建以及最终一致性的等待。与 MySQL 的同步事务不同,ES 的操作通常是“近实时 (NRT)”的,…...
