JAVA 集合框架(二) List集合详解和常用方法

Listjava.util 包下的一个接口,它是 Java 集合框架中 Collection 接口的一个子接口,用于表示有序、可重复元素的集合。

以下是 List 集合的主要特点:

  • 有序性:List 集合中的元素是有序的,这意味着元素的插入顺序决定了它们在集合中的位置。可以通过索引(index)访问集合中的元素,索引从零开始。
  • 可重复性:List 集合允许存储重复的元素,即同一个对象可以多次添加到 List 中。
  • 索引访问:List 提供了类似于数组的索引访问方法,如 get(index) 用于获取指定索引处的元素,set(index, element) 用于替换指定索引处的元素,add(index, element) 用于在指定索引处插入元素。
  • 方法丰富:List 接口中定义了许多方法,如添加、删除、查找、替换、插入、迭代等操作。
  • 主要实现类:Java 中有两个主要的 List 实现类,分别是 ArrayListLinkedList
    • ArrayList:基于动态数组实现,支持高效的随机访问(通过索引),但在插入和删除元素时(尤其是当插入或删除操作发生在列表中间时),可能会导致大量的元素移动,性能较低。
    • LinkedList:基于双向链表实现,插入和删除操作(尤其是在列表中间)的效率较高,但随机访问(通过索引)性能较差,因为它需要从头节点或者尾节点开始沿着链表遍历。
  • 线程安全性:Java 标准库提供的 List 实现类如 ArrayListLinkedList 默认是非线程安全的。如果需要线程安全的 List,可以使用 Collections.synchronizedList(List<T> list) 方法对原 List 进行包装,或者使用 CopyOnWriteArrayList 类。

List集合的特有方法

List集合接口(java.util.List)除了继承自java.util.Collection接口的所有方法之外,还提供了一些特有的方法,用于处理有序且可重复元素的列表。

以下是List集合特有的一些方法及其详细讲解和代码示例:

添加元素至指定位置:

  • void add(int index, E element):在此集合的指定位置插入一个元素。它会将指定位置之后的所有元素向后移动一位。
// 创建一个 List 集合
List<String> list = new ArrayList<>();
list.add("Apple");
list.add("Banana");
list.add(1,"Mango"); // 在索引1的位置插入"Mango"
System.out.println(list); // 输出: [Apple, Mango, Banana]

获取指定索引的元素

  • E get(int index):根据索引获取列表中的元素。
// 创建一个 List 集合
List<String> list = new ArrayList<>(Arrays.asList("Apple", "Banana", "Mango", "Orange", "Pear"));
// 根据索引获取集合元素
System.out.println("索引为3的元素: "+list.get(3)); // 输出: 索引为3的元素: Orange

设置指定索引的元素

  • E set(int index, E element):替换列表中指定索引位置的元素。
// 创建一个 List 集合
List<String> list = new ArrayList<>(Arrays.asList("Apple", "Banana", "Mango", "Orange", "Pear"));
// 设置索引1的元素为"Peach"
list.set(1,"Peach");
System.out.println(list); // 输出: [Apple, Peach, Mango, Orange, Pear]

移除指定索引的元素

  • E remove(int index):移除并返回列表中指定索引位置的元素。
// 创建一个 List 集合
List<String> list = new ArrayList<>(Arrays.asList("Apple", "Banana", "Mango", "Orange", "Pear"));
// 移除指定索引的元素
String remove = list.remove(1);
System.out.println(remove); // 输出: Banana
System.out.println(list); // 输出: [Apple, Mango, Orange, Pear]

获取元素在集合中的索引

  • int indexOf(Object o):获取指定元素在列表中首次出现的索引,如果列表中不包含该元素则返回 -1
// 创建一个 List 集合
List<String> list = new ArrayList<>(Arrays.asList("Apple", "Banana", "Mango", "Orange", "Pear"));
// 获取"Mango"在集合中的索引
int cherryIndex = list.indexOf("Mango");// 若列表不含"Mango",则输出-1
System.out.println(cherryIndex); // 输出:2

获取元素最后的索引

  • int lastIndexOf(Object o):获取指定元素在列表中最后一次出现的索引,如果列表中不包含该元素则返回 -1
// 创建一个 List 集合
List<String> list = new ArrayList<>(Arrays.asList("Apple", "Banana", "Mango", "Orange", "Pear","Banana"));
// 获取"Banana"在集合中最后一次出现的索引
int cherryIndex = list.lastIndexOf("Banana");// 若集合中不含"Banana",则输出-1
System.out.println(cherryIndex); // 输出:5

获取原集合部分元素

  • List<E> subList(int fromIndex, int toIndex):获取原列表的部分视图,而不是创建一个新的列表副本。这个方法返回一个新的 List 对象,它包含了原列表从 fromIndex(包含)到 toIndex(不包含)位置的元素。这里的索引遵循 Java 数组索引规则,即从 0 开始计数。
    • fromIndex:起始索引,从0开始,包含此索引位置的元素。
    • toIndex:结束索引,不包含此索引位置的元素。
    • 返回值: 返回一个包含原列表指定范围元素的新 List 视图。需要注意的是,这个返回的列表是原列表的一个动态视图,也就是说,当你修改原列表或子列表时,两者的内容都会相应地改变。
// 创建一个 List 集合
List<String> list = new ArrayList<>(Arrays.asList("Apple", "Banana", "Mango", "Orange", "Pear","Banana"));

// 获取 list 集合从索引1到索引3的子列表
List<String> subList = list.subList(1, 4);
// 输出原列表
System.out.println("list: " + list);// list: [Apple, Banana, Mango, Orange, Pear, Banana]
// 输出子列表
System.out.println("subList: " + subList);// subList: [Banana, Mango, Orange]

List集合的实现类

List 集合的实现类主要包括以下几个:

  • ArrayList集合
    • 底层是数组结构实现,查询快、增删慢
  • LinkedList集合
    • 底层是链表结构实现,查询慢、增删快
  • Vector
    • java.util.Vector 是早期JDK版本中提供的线程安全的动态数组实现,其功能与ArrayList相似,但由于线程安全的开销,其性能略低于ArrayList。从Java 1.2版本开始,推荐使用Collections类的synchronizedList方法来创建线程安全的ArrayList替代Vector。
  • Stack
    • java.util.Stack 类实际上是继承自 Vector,它提供栈(后进先出,LIFO)的特性,但现代Java编程实践中,通常建议使用 Deque 接口的实现类,如 ArrayDeque 来代替 Stack。

ArrayList集合

  • java.util.ArrayList 是 Java 集合框架中 List 接口的一个重要实现类,它基于动态数组实现,允许高效地随机访问元素,并且可以自动调整数组大小以适应元素数量的变化。
  • 然而,当进行插入和删除操作(特别是对于非尾部元素)时,可能需要移动大量元素,所以插入和删除操作的时间复杂度一般是 O(n)
  • ArrayList 作为 List 的实现,并没有很多真正意义上的“特有方法”,因为 List 接口规定了大部分操作集合所需的方法。

示例代码:

List<String> list = new ArrayList<>();
list.add("Apple");
list.add(0, "Banana"); // 在索引0处插入元素
String firstElement = list.get(0); // 获取第一个元素

LinkedList集合

  • java.util.LinkedList 是 Java 集合框架中 List 接口的一个实现类,它采用链表数据结构进行存储,允许元素的高效插入和删除操作。
  • LinkedList 继承了 AbstractSequentialList 类,并实现了 Deque, List, Queue, Cloneable, Serializable 接口,因此它具备了很多额外的特有方法,这些方法主要与链表结构的特性相符,包括在链表首尾插入和删除元素,以及找到前驱和后继节点等。

示例代码:

List<String> list = new LinkedList<>();
LinkedList 特有的方法

在链表头部操作:

  • void addFirst(E e):在链表的开头添加元素。
// 创建一个 LinkedList 集合
LinkedList<String> linkedList = new LinkedList<>();
// 在链表开头添加元素
linkedList.addFirst("Apple");
linkedList.addFirst("Banana");
System.out.println(linkedList);// 输出: [Banana, Apple]
  • void addLast(E e):在链表的末尾添加元素,这个方法虽然不是 LinkedList 独有的,但对于链表实现来说很有意义。
// 创建一个 LinkedList 集合
LinkedList<String> list = new LinkedList<>();
// 在末尾添加元素
list.addLast("Apple");
list.addLast("Banana");
System.out.println(list); // 输出: [Apple, Banana]
  • E getFirst():返回链表的第一个元素,但不删除。
// 创建一个 LinkedList 集合
LinkedList<String> list = new LinkedList<>(Arrays.asList("Apple", "Banana", "Mango", "Orange", "Pear","Banana"));
// 获取第一个元素
String first = list.getFirst();
System.out.println(first);// 输出: Apple
  • E getLast():返回链表的最后一个元素,但不删除。
// 创建一个 LinkedList 集合
LinkedList<String> list = new LinkedList<>(Arrays.asList("Apple", "Banana", "Mango", "Orange", "Pear","Banana"));
// 获取最后一个元素
String last = list.getLast();
System.out.println(last);// 输出: Banana
  • E removeFirst():删除并返回链表的第一个元素。
// 创建一个 LinkedList 集合
LinkedList<String> list = new LinkedList<>(Arrays.asList("Apple", "Banana", "Mango", "Orange", "Pear","Banana"));
// 删除并返回第一个元素
String removeFirst = list.removeFirst();
System.out.println(removeFirst); // 输出: Apple
System.out.println(list); // 输出: [Banana, Mango, Orange, Pear, Banana]
  • E removeLast():删除并返回链表的最后一个元素。
// 创建一个 LinkedList 集合
LinkedList<String> list = new LinkedList<>(Arrays.asList("Apple", "Banana", "Mango", "Orange", "Pear","Banana"));
// 删除并返回最后一个元素
String removeLast = list.removeLast();
System.out.println(removeLast);// 输出: Banana
System.out.println(list); // 输出: [Apple, Banana, Mango, Orange, Pear]

与 Deque 接口兼容的方法:

  • void push(E e):将元素推入此列表的开头(相当于 addFirst(e),用法完全相同)。
  • E pop():从此列表中移除并返回第一个元素(相当于 removeFirst(),用法完全相同)。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【GoWeb框架初探————Gin篇】

1. Gin 1.1 下载相应依赖 创建go项目&#xff0c;在项目下建立go.mod文件&#xff08;若有则跳过&#xff09; 命令行运行 go get github.com/gin-gonic/gin1.2 启动一个简单Web服务 package mainimport ("github.com/gin-gonic/gin""github.com/thinkerou/…

️️️Vue3+Element-Plus二次封装一个可定制化的table组件

前言 为什么需要二次封装 开发后台管理系统,会接触到很多表格和表单,一但表格表单多起来,仅仅只需要一小部分改变&#xff0c;都需要在中重写一大堆代码,许多重复逻辑,我们可以把重复逻辑抽离出来二次封装一个组件 使用,减少在开发中需要编写的代码。 为什么需要定制化 每个…

Springboot Gateway 报错Failed to resolve “bogon”的原因及解决办法

一、问题出现原因及初步分析 今天遇到一个奇怪的错误&#xff0c;一个一直正确运行的微服务后台&#xff0c;突然无法访问&#xff0c;如何重启都会报错。 想到近期有人在服务器上安装过其它服务&#xff0c;因此&#xff0c;考虑可能是配置问题&#xff0c;可配置问题修复后…

Ubuntu 传输文件

scp [选项] 源文件 目标路径 以下是一些常用的 scp 命令选项&#xff1a; -r&#xff1a;递归复制目录和子目录。 -P&#xff1a;指定远程 SSH 服务器的端口号。 -i&#xff1a;指定用于身份验证的私钥文件。 -p&#xff1a;保留源文件的时间戳、权限和所有者。 -v&#x…

从D盘调整空间增加到C盘而不丢失数据的3 种方法

越来越多的Windows 10笔记本电脑和台式机使用SSD作为系统盘&#xff0c;这对于提高计算机性能很有用&#xff0c;因为SSD的读写速度要快得多。但另一方面&#xff0c;SSD价格更高&#xff0c;因此比传统机械硬盘体积更小。当然C盘空间不足的可能性更大。在这种情况下&#xff0…

Java学习笔记零基础入门1

目录 第一章 Java概述 1.1 什么是程序 1.2 Java 技术体系平台 1.3 Java 重要特点 1.4 Java 的开发工具 4.1 工具选择 1.5 Java 运行机制及运行过程 5.1 Java 语言的特点&#xff1a;跨平台性 5.2 Java 核心机制-Java 虚拟机 [JVMjavavirtual machine] 1.6 什么是JDK&…

K8s 部署 elasticsearch-7.14.0 集群 及 kibana 客户端

一、K8s 部署 elasticsearch-7.14.0 集群 安装规划 组件replicas类型es3StatefulSetkibana1Deployment 使用 k8s 版本为&#xff1a;v1.18.0 。 本次使用 OpenEBS 来作为存储引擎&#xff0c;OpenEBS 是一个开源的、可扩展的存储平台&#xff0c;它提供了一种简单的方式来创…

HQL,SQL刷题,尚硅谷(中级)

目录 相关表结构&#xff1a; 1、order_info表 2、order_detail表 题目及思路解析&#xff1a; 第一题&#xff0c;查询各品类销售商品的种类数及销量最高的商品 第二题 查询用户的累计消费金额及VIP等级 第三题 查询首次下单后第二天连续下单的用户比率 总结归纳&#xff1a…

2024.4.18

学生管理部分 #include<myhead.h> int main(int argc, char *argv[]) {sqlite3* ppDbNULL;if(sqlite3_open("./mydb.db",&ppDb)!SQLITE_OK){printf("sqlite3_open error:%s\n",sqlite3_errmsg(ppDb));return -1;}//创建数据表char arg[128]&quo…

SQL Serve---嵌套查询

定义 嵌套查询&#xff1a;主要用于复杂的查询中。在SQL语言中&#xff0c;一个Select From Where语句称为一个查询块&#xff0c;将一个查询块嵌套在另一个查询的Where子句或Having短语中的查询称为嵌套查询。 子查询的类型 使用别名的子查询 使用IN和NOT IN的子查询 使用比较…

4.15报错记录

打开文件时出错a bytes-like object is required,notNoneType 确保E:/data/stdata/st- images-1208-json|ST-WT-1.json是一个有效的标签文件。 今天用X-anylabling更改标签目录时出现这个报错 解决方案&#xff1a;图片文件夹中创建同名的一个文件夹把json文件放进去就可以打…

Ubuntu 微调训练ChatGLM3大语言模型

Ubuntu 微调训练ChatGLM3大语言模型 LLaMA Factory 的 LoRA 微调提供了 3.7 倍的加速比&#xff0c;同时在广告文案生成任务上取得了更高的 Rouge 分数。结合 4 比特量化技术&#xff0c;LLaMA Factory 的 QLoRA 微调进一步降低了 GPU 显存消耗。 https://github.com/hiyouga…

六边形酷科技特效单页源码

源码介绍 基于canvas画布绘制多个六边形追踪鼠标&#xff0c;科技感的几何图形酷炫动画特效&#xff0c; 单页html源码&#xff0c;可以做网站动态背景&#xff0c;喜欢的朋友可以拿去 效果截图 完整源码 <!doctype html> <html> <head> <meta charset…

OpenHarmony UI开发-ohos-svg

简介 ohos-svg是一个SVG图片的解析器和渲染器&#xff0c;解析SVG图片并渲染到页面上。它支持大部分 SVG 1.1 规范&#xff0c;包括基本形状、路径、文本、样式和渐变,它能够渲染大多数标准的 SVG 图像。ohos-svg的优点是性能好、内存占用低。 效果展示 SVG图片解析并绘制: …

C++ | Leetcode C++题解之第35题搜索插入位置

题目&#xff1a; 题解&#xff1a; class Solution { public:int searchInsert(vector<int>& nums, int target) {int n nums.size();int left 0, right n - 1, ans n;while (left < right) {int mid ((right - left) >> 1) left;if (target < n…

单页面首屏优化,打包后大小减少64M,加载速度快了13.6秒

需求背景 从第三方采购的vue2 ElementUI实现的云管平台&#xff0c;乙方说2011年左右就开始有这个项目了&#xff08;那时候有Vue了吗&#xff0c;思考.jpg&#xff09;。十几年的项目&#xff0c;我何德何能可以担此责任。里面的代码经过多人多年迭代可以用惨不忍睹来形容&a…

面试题:Java中int符号数字的位运算与操作 + 原码、反码、补码之间如何进行转换

题目来源 阿里-淘天-技术1面 问题 -1和4做位运算与操作&#xff0c;结果是多少&#xff1f; 答案 正确答案 4 通过Java代码验证如下&#xff1a; 我的回答 -5&#xff0c;但是-5是错误的答案。 面试的时候&#xff0c;面试官没有告诉我对错。 为什么&#xff1f; 到底…

[生活][杂项] 上班党的注意事项

前言 目前是上班已经接近两年了&#xff0c;目前的状态是&#xff0c;一个人租了一个单间在上班。对于这种情况有以下几点需要注意。 钥匙问题&#xff0c;一定不要陷入钥匙丢失的情况&#xff01;一定不要陷入钥匙丢失的情况&#xff01;一定不要陷入钥匙丢失的情况&#xff…

CSS:filter(滤镜)属性

用途 可以用于img标签&#xff0c;div标签等 图像&#xff0c;背景&#xff0c;边框的调整 常用属性 1. 灰度 grayscale()&#xff0c;默认是0&#xff0c;100%就是黑白 2. blux 给图像设置高斯模糊的程度&#xff0c;radius值设定高斯模糊的程序&#xff0c;表示像素点…

2024年Q1季度冰箱行业线上市场销售数据分析

Q1季度冰箱线上市场表现不如预期。 根据鲸参谋数据显示&#xff0c;2024年1月至3月线上电商平台&#xff08;京东天猫淘宝&#xff09;冰箱累计销量约410万件&#xff0c;环比下降11%&#xff0c;同比下降21%&#xff1b;累计销售额约98亿元&#xff0c;环比下降31%&#xff0…
最新文章