java-单列集合List详解

一、List概述

​​​​​​​List 接口继承自 Collection 接口。这意味着所有 List 类型的对象都是 Collection 类型的对象,它们共享 Collection 接口中定义的所有方法。

List集合的特点:

1、有序:存和取得元素顺序一致

2、有索引:可以通过索引操作元素

3、可重复:存储的元素可以重复

二、List的方法

Collection接口的方法List都继承了,在此基础上List还增加了索引操作的方法

List独有的方法:

它的特有方法都与索引有关

1、增加元素

语法1:集合名称.add(元素);

在集合的末尾添加元素

语法2:集合名称.add(索引,元素);    特有方法

在指定索引添加元素原索引及其之后的元素都会向后移动一位 而不是覆盖该索引处的元素

import java.util.ArrayList;
import java.util.List;public class test1 {public static void main(String[] args) {// 1.创建集合List<String> l=new ArrayList<>();// 2.添加元素// 通用方法l.add("aaa");l.add("bbb");l.add("ccc");System.out.println(l);// [aaa, bbb, ccc]// 特有方法// 在指定索引处添加元素 原索引及其之后的元素都会向后移动一位 而不是覆盖该索引处的元素l.add(1,"在索引1处添加元素");System.out.println(l);// [aaa, 在索引1处添加元素, bbb, ccc]}
}

2、删除元素

语法1:集合名称.remove(元素);

根据元素删除,如果存在则删除成功,返回值为true,如果不存在则删除失败,返回值为false

语法2:集合名称.remove(索引,元素);    特有方法

在指定索引删除元素,返回值为删除的元素

import java.util.ArrayList;
import java.util.List;public class test1 {public static void main(String[] args) {// 1.创建集合List<String> l=new ArrayList<>();// 2.添加元素// 通用方法l.add("aaa");l.add("bbb");l.add("ccc");System.out.println(l);// [aaa, bbb, ccc]// 特有方法// 在指定索引处添加元素 原索引及其之后的元素都会向后移动一位 而不是覆盖该索引处的元素l.add(1,"qqq");System.out.println(l);// [aaa, qqq, bbb, ccc]// 3.删除元素// 通用方法// 集合未存在java 删除失败 返回falseboolean r1=l.remove("java");System.out.println(r1);// falseSystem.out.println(l);// [aaa, qqq, bbb, ccc]// 集合存在qqq 删除成功 返回trueboolean r2=l.remove("qqq");System.out.println(r2);// trueSystem.out.println(l);// [aaa , bbb, ccc]// 特有方法// 在指定索引处删除元素String r3=l.remove(2);System.out.println(r3);// cccSystem.out.println(l);// [aaa , bbb]}
}

3、修改元素

语法:集合名称.set(索引,元素);特有方法

修改指定索引的元素,返回值为修改前的元素

import java.util.ArrayList;
import java.util.List;public class test1 {public static void main(String[] args) {// 1.创建集合List<String> l=new ArrayList<>();// 2.添加元素// 通用方法l.add("aaa");l.add("bbb");l.add("ccc");System.out.println(l);// [aaa, bbb, ccc]// 特有方法// 在指定索引处添加元素 原索引及其之后的元素都会向后移动一位 而不是覆盖该索引处的元素l.add(1,"qqq");System.out.println(l);// [aaa, qqq, bbb, ccc]// 3.修改元素// 修改指定索引的元素 返回修改前的元素String r1=l.set(1, "kkk");System.out.println(r1);// qqqSystem.out.println(l);// [aaa, kkk, bbb, ccc]}
}

4、获取元素

语法:集合名称.set(索引);特有方法

返回值为该索引对应的元素

import java.util.ArrayList;
import java.util.List;public class test1 {public static void main(String[] args) {// 1.创建集合List<String> l=new ArrayList<>();// 2.添加元素// 通用方法l.add("aaa");l.add("bbb");l.add("ccc");System.out.println(l);// [aaa, bbb, ccc]// 特有方法// 在指定索引处添加元素 原索引及其之后的元素都会向后移动一位 而不是覆盖该索引处的元素l.add(1,"qqq");System.out.println(l);// [aaa, qqq, bbb, ccc]// 3.获取元素// 返回值为该索引对应的元素String r1=l.get(1);System.out.println(r1);// qqq}
}

5、注意点

因为出现了方法的重载,在调用方法时,会优先调用形参类型与实参类型一致的方法

三、List的遍历方式

List的遍历方式不仅继承Collection接口的遍历方式,还有自己特有的根据索引遍历的方式,它的遍历方式共5种,包括迭代器遍历、增强for遍历、lamdba表达式遍历、普通for循环(特有 因为List集合存在索引)、列表迭代器遍历(特有),其中迭代器遍历、增强for遍历、lamdba表达式遍历是继承Collection接口的遍历方式,用法完全一致

详情可以参考以下文章:http://t.csdnimg.cn/zTdXHicon-default.png?t=N7T8http://t.csdnimg.cn/zTdXH

1、迭代器遍历

语法:

Iterator<集合元素类型>迭代器名称=集合名称.Iterator();

while(迭代器对象名称.hasnext()){

        System.out.println(迭代器对象名称.next());

}

import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;public class 迭代器遍历 {public static void main(String[] args) {// 1.创建集合List<String> l=new ArrayList<>();// 2.添加元素l.add("aaa");l.add("bbb");l.add("ccc");// 3.遍历集合// 通过iterator方法创建迭代器对象Iterator<String> it=l.iterator();// hasNext()判断该位置是否存在元素 若存在则返回true 不存在则返回falsewhile (it.hasNext()){// next()是用来返回当前位置元素 并指向下一位置的元素String s=it.next();System.out.println(s);}// aaa// bbb// ccc}
}

2、列表迭代器遍历(特有)

列表迭代器遍历与迭代器遍历的方法很相似,不同的是列表迭代器遍历不仅可以在遍历的时候删除元素,还可以在遍历的时候添加元素

语法:(仅仅遍历)

ListIterator<集合元素类型>迭代器名称=集合名称.ListIterator();

while(迭代器对象名称.hasnext()){

        System.out.println(迭代器对象名称.next());

}

补充知识:

ListIterator与Iterator的关系: ListIterator接口则是一个专门为List设计的迭代器接口 它扩展了Iterator接口,并添加了一些针对List集合特有的方法

ListIterator与List的关系: ListIterator是专门为List设计的一个迭代器的接口 List含有获取ListIterator迭代器的方法 即listIterator()

import java.util.ArrayList;
import java.util.List;
import java.util.ListIterator;public class 列表迭代器遍历 {public static void main(String[] args) {// 1.创建集合List<String> l=new ArrayList<>();// 2.添加元素l.add("aaa");l.add("bbb");l.add("ccc");// 3.列表迭代器遍历// 通过listIterator方法生成列表迭代器/*ListIterator与Iterator的关系:ListIterator接口则是一个专门为List设计的迭代器接口它扩展了Iterator接口,并添加了一些针对List集合特有的方法ListIterator与List的关系:ListIterator是专门为List设计的一个迭代器的接口List含有获取ListIterator迭代器的方法 即listIterator()*/ListIterator<String> it=l.listIterator();// hasNext()判断该位置是否存在元素 若存在则返回true 不存在则返回falsewhile (it.hasNext()){// next()是用来返回当前位置元素 并指向下一位置的元素String s=it.next();System.out.println(s);}//aaa//bbb//ccc}
}

语法:(遍历中增加元素)

it.add(元素);

注意:ListIteratoradd()方法的作用是在当前迭代器位置之前插入一个元素

import java.util.ArrayList;
import java.util.List;
import java.util.ListIterator;public class 列表迭代器遍历 {public static void main(String[] args) {// 1.创建集合List<String> l=new ArrayList<>();// 2.添加元素l.add("aaa");l.add("bbb");l.add("ccc");// 3.列表迭代器遍历// 通过listIterator方法生成列表迭代器/*ListIterator与Iterator的关系:ListIterator接口则是一个专门为List设计的迭代器接口它扩展了Iterator接口,并添加了一些针对List集合特有的方法ListIterator与List的关系:ListIterator是专门为List设计的一个迭代器的接口List含有获取ListIterator迭代器的方法 即listIterator()*/ListIterator<String> it=l.listIterator();// hasNext()判断该位置是否存在元素 若存在则返回true 不存在则返回falsewhile (it.hasNext()){// next()是用来返回当前位置元素 并指向下一位置的元素String s=it.next();if(s.equals("bbb")){it.add("qqq");}System.out.println(s);}/*第一次遍历时指针指向aaa 调用it.next(); 将aaa赋值给s 并将指针指向下一位置bbb然后判断s是否为bbb 此时s不是bbb 因此it.add("qqq");没有执行  输出aaa第二次遍历时指针指向bbb 调用it.next(); 将bbb赋值给s 并输出bbb 并将指针指向下一位置ccc然后判断s是否为bbb 此时s是bbb 因此it.add("qqq");执行 并输出bbbListIterator的add()方法的作用是在当前迭代器位置之前插入一个元素。所以在ccc前添加qqq 将ccc赋值给s 此时s不是bbb 因此it.add("qqq");不执行 并将指针指向下一位置(没有元素) 循环结束整个过程qqq没有输出*///aaa//bbb//cccSystem.out.println(l);// [aaa, bbb, qqq, ccc]}
}
import java.util.ArrayList;
import java.util.List;
import java.util.ListIterator;public class 列表迭代器遍历 {public static void main(String[] args) {// 1.创建集合List<String> l=new ArrayList<>();// 2.添加元素l.add("aaa");l.add("bbb");l.add("ccc");// 3.列表迭代器遍历// 通过listIterator方法生成列表迭代器/*ListIterator与Iterator的关系:ListIterator接口则是一个专门为List设计的迭代器接口它扩展了Iterator接口,并添加了一些针对List集合特有的方法ListIterator与List的关系:ListIterator是专门为List设计的一个迭代器的接口List含有获取ListIterator迭代器的方法 即listIterator()*/ListIterator<String> it=l.listIterator();// hasNext()判断该位置是否存在元素 若存在则返回true 不存在则返回falsewhile (it.hasNext()){// next()是用来返回当前位置元素 并指向下一位置的元素it.add("qqq");String s=it.next();/*ListIterator的add()方法的作用是在当前迭代器位置之前插入一个元素。第一次遍历时指针指向aaa 调用it.add("qqq"); 会在aaa前添加qqq然后调用it.next()输出aaa 并将指针指向下一位置bbb 因此qqq不会输出第二次遍历时指针指向bbb 调用it.add("qqq"); 会在bbb前添加qqq然后调用it.next()输出bbb 并将指针指向下一位置ccc 因此qqq不会输出第三次遍历时指针指向aaa 调用it.add("qqq"); 会在ccc前添加qqq然后调用it.next()输出aaa 并将指针指向下一位置(没有元素) 因此qqq不会输出循环结束*/System.out.println(s);}//aaa//bbb//cccSystem.out.println(l);// [qqq, aaa, qqq, bbb, qqq, ccc]}
}

3、增强for遍历

快速生成增强for遍历:集合名称.for+回车

import java.util.ArrayList;
import java.util.List;public class 增强for遍历 {public static void main(String[] args) {// 1.创建集合List<String> l=new ArrayList<>();// 2.添加元素l.add("aaa");l.add("bbb");l.add("ccc");// 3.遍历集合// 增强for遍历// 快速生成增强for遍历:集合名称.for+回车// s是用来存储遍历的元素for (String s : l) {System.out.println(s);}// aaa// bbb// ccc}
}

4、lamdba表达式遍历

forEach方法的底层其实是一个循环遍历  依次得到集合中的每一个元素

并将每一个元素传递给accept方法(其中String s中,s就是传入的元素)

 accept方法就是将传入的元素输出

最后利用lamdba表达式进行简化

import java.util.ArrayList;
import java.util.List;
import java.util.function.Consumer;public class lamaba表达式遍历 {public static void main(String[] args) {// 1.创建集合List<String> l=new ArrayList<>();// 2.添加元素l.add("aaa");l.add("bbb");l.add("ccc");// 3.lamdba表达式遍历// forEach方法的底层其实是一个循环遍历 依次得到集合中的每一个元素// 并将每一个元素传递给accept方法(其中String s,s就是传入的元素)// accept方法就是将传入的元素输出// 简化前:l.forEach(new Consumer<String>() {@Overridepublic void accept(String s) {System.out.println(s);}});// aaa// bbb// ccc// 简化后:l.forEach(s->System.out.println(s));// aaa// bbb// ccc}
}

5、普通for循环(特有 因为List集合存在索引)

语法:       

for (int i = 0; i < l.size(); i++) {
            System.out.println(l.get(i));
  }

通过get和size方法结合,遍历集合的元素

import java.util.ArrayList;
import java.util.List;public class 普通for遍历 {public static void main(String[] args) {// 1.创建集合List<String> l=new ArrayList<>();// 2.添加元素l.add("aaa");l.add("bbb");l.add("ccc");// 3.普通for遍历元素// 通过集合名称.size().fori快速生成for循环// l.size()获取集合的长度// l.get(i)获取索引为i的元素值for (int i = 0; i < l.size(); i++) {System.out.println(l.get(i));}//aaa//bbb//ccc}
}

6、五种遍历方式的对比

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

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

相关文章

使用FPGA实现比较器

介绍 比较器就是通过比较输入的大小&#xff0c;然后输出给出判断。 在这个比较器中&#xff0c;有两个输入&#xff0c;三个输出。根据输出就可以判断出哪个输入值大了。 设计文件 library ieee; use ieee.std_logic_1164.all; use ieee.std_logic_arith.all; entity compa…

【大语言模型LLM】-使用大语言模型搭建点餐机器人

关于作者 行业&#xff1a;人工智能训练师/LLM 学者/LLM微调乙方PM发展&#xff1a;大模型微调/增强检索RAG分享国内大模型前沿动态&#xff0c;共同成长&#xff0c;欢迎关注交流… 大语言模型LLM基础-系列文章 【大语言模型LLM】-大语言模型如何编写Prompt?【大语言模型LL…

zabbix监控华为网络设备路由器eNSP(3)

如果有没搭建zabbix的网友可以先看我上一个搭建文档&#xff0c;把监控系统搭建上https://blog.csdn.net/weixin_72819498/article/details/137751059 拓扑图&#xff1a; 绑定和服务器同地址的网卡 1.监控端配置 (1)SNMP服务安装 [rootzbx-server ~]# yum -y install net-…

编译一个基于debian/ubuntu,centos,arhlinux第三方系统的问题解答

如果是开机卡boot注意看前面几行会有错误提示&#xff0c;一般会比较好找&#xff0c;下面是过了kernel内核加载后出现的问题 目录 上一篇文章 第一个问题 错误原因 解决办法 第二个问题 注意 第三个问题 上一篇文章 编译一个基于debian/ubuntu,centos,arhlinux第三方系…

什么是0-day漏洞,怎么防护0-day漏洞攻击

随着信息技术的快速发展&#xff0c;网络安全问题日益凸显&#xff0c;其中0day漏洞攻击作为一种高级威胁手段&#xff0c;给企业和个人用户带来了极大的风险。下面德迅云安全就对0day漏洞攻击进行简单讲解下&#xff0c;并分享相应的一些安全措施&#xff0c;以期提高网络安全…

第15届蓝桥杯题解

A题 结果&#xff1a;2429042904288 思路很简单 前20个数分别是 20 24 40 48 60 72 80 96 100 120 140 144 160 168 180 192 200 216 220 240 第2 4 6 8 12 ...n个数分别是24的 1倍 2倍 3倍 4倍 6倍 n/2倍 所以第202420242024 个数就是 24的 101210121012倍 B题 答案&am…

二维前缀和与差分

前言 延续前面所讲的一维前缀和以及差分&#xff0c;现在来写写二维前缀和与差分 主要这个画图就比前面的一维前缀和与差分复杂一点&#xff0c;不过大体思路是一样的 一维和二维的主要思路在于一维是只针对对一行一列&#xff0c;而二维是针对与一个矩阵的 好吧&#xff0…

ACE框架学习2

目录 ACE Service Configurator框架 ACE_Server_Object类 ACE_Server_Repository类 ACE_Server_Config类 ACE Task框架 ACE_Message_Queue类 ACE_TASK类 在开始之前&#xff0c;首先介绍一下模板类的实例化和使用。给出以下代码 //ACCEPTOR代表模板的方法 template <…

VSCode插件开发学习

一、环境准备 0、参考文档&#xff1a;VS Code插件创作中文开发文档 1、大于18版本的nodejs 2、安装Yeoman和VS Code Extension Generator&#xff1a; npm install -g yo generator-code 3、生成脚手架 yo code 选择内容&#xff1a; ? What type of extension do yo…

DASCTF X GFCTF 2024|四月开启第一局

前言 题目都比较简单&#xff0c;&#xff0c;&#xff0c;没啥好说的&#xff0c;很久没做题了&#xff0c;简单记录一下 dynamic_but_static 仅仅开了 NX 保护栈溢出 先泄漏 libc 地址&#xff0c;然后栈溢出打 ret2libc&#xff0c;开了沙箱得 orw from pwn import * c…

Vue3+TS版本Uniapp:项目前置操作

作者&#xff1a;前端小王hs 阿里云社区博客专家/清华大学出版社签约作者✍/CSDN百万访问博主/B站千粉前端up主 环境&#xff1a;使用vscode进行开发 如果一开始是使用的HbuilderX&#xff0c;请看hbuilderX创建的uniapp项目转移到vscode 为什么选择vscode&#xff1f;有更好…

Windows进入黑屏,操作CMD提示命令提示符已被系统管理员停用

背景 由于安装或者卸载某些服务导致主机无法正常显示桌面&#xff0c;从控制台进入打开操作执行命令提示禁用。 操作步骤 注意务必做好快照备份后再操作。 打开注册表中将其重新启用&#xff1a; 依次打开“运行”命令&#xff0c;然后在打开的“运行”对话框中输入 “regedit…

一个简单的记工tkinter窗口

代码分享: 导入datetime模块&#xff0c;用于获取当前日期 import datetime as da 导入csv模块&#xff0c;用于读写csv文件 import csv 导入tkinter模块&#xff0c;用于创建窗口和按钮 from tkinter import * 创建主窗口 appTk() 设置窗口大小为1048x2048&#xff0…

华为海思校园招聘-芯片-数字 IC 方向 题目分享——第六套

华为海思校园招聘-芯片-数字 IC 方向 题目分享——第六套 (共9套&#xff0c;有答案和解析&#xff0c;答案非官方&#xff0c;未仔细校正&#xff0c;仅供参考&#xff09; 部分题目分享&#xff0c;完整版获取&#xff08;WX:didadidadidida313&#xff0c;加我备注&#x…

【OpenHarmony-NDK技术】简单将cJson移植到OpenHarmony中,并在c层修改参数值再返回json

1、cJson的简单介绍 cJson - github网址 概述 一般使用cJson是&#xff0c;需要将json文本转化为json对象–编码&#xff0c;将json对象转化为json文本–解析。 git clone https://github.com/DaveGamble/cJSON.git 后留意cJSON.h和cJSON.h两个文件。 1、cJson的介绍 cJso…

Golang那些违背直觉的编程陷阱

目录 知识点1&#xff1a;切片拷贝之后都是同一个元素 知识点2&#xff1a;方法集合决定接口实现&#xff0c;类型方法集合是接口方法集合的超集则认定为实现接口&#xff0c;否则未实现接口 切片拷贝之后都是同一个元素 package mainimport ("encoding/json"&quo…

Redis 如何实现分布式锁

课程地址 单机 Redis naive 版 加锁&#xff1a; SETNX ${lockName} ${value} # set if not exist如果不存在则插入成功&#xff0c;返回 1&#xff0c;加锁成功&#xff1b;否则返回 0&#xff0c;加锁失败 解锁&#xff1a; DEL ${lockName}问题1 2 个线程 A、B&#…

前后端交互概念

前后端交互概念 1前后端分离开发概念2搭建后端环境2.1配置文件commomcommon-utilservice-utilmodelservice gitee使用 1前后端分离开发概念 前段&#xff1a;运用html、css、js和现成库&#xff0c;对数据作展示。 后端&#xff1a;运用Java和Java框架&#xff0c;提供数据或操…

立创·实战派ESP32-C3开发板 with lv_micropython

一、lv_micropython对驱动芯片的支持 ESP32-C3开发板的Display drivers:ST7789&#xff0c;Input drivers:FT6336&#xff0c;从LVGL的官方文档了解到lv_micropython包含了这两颗IC的驱动。 参考文档&#xff1a; lv_micropython already contains these drivers: 链接:Micro…

智慧化转型赋能园区创新:科技创新引领产业智慧化,打造高效发展新格局

在全球化和信息化浪潮的推动下&#xff0c;园区作为区域经济发展的重要引擎&#xff0c;正面临着前所未有的机遇与挑战。为应对这些挑战并把握机遇&#xff0c;园区需积极拥抱智慧化转型&#xff0c;通过科技创新引领产业智慧化&#xff0c;打造高效发展的新格局。本文将深入探…