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

Java集合框架--LIST,ArrayList,LinkedList

List

Java集合框架中的List是一个有序且允许元素重复的集合接口 。它位于java.util包下, 继承自Collection接口。List集合中的元素按照插入的顺序进行排序, 并且可以通过索引来访问元素, 索引从0开始。List允许我们存储元素的集合,‌并且可以包含重复的元素,‌这些元素是有序的。‌下面是一些正确使用Java集合框架中List接口的基本指导原则:‌

1. 创建List实例

Java提供了多种List的实现,‌如ArrayList、‌LinkedListVector等。‌每种实现都有其特点和适用场景。‌

List<String> list = new ArrayList<>(); // 使用ArrayList
// 或者
List<String> linkedList = new LinkedList<>(); // 使用LinkedList

2. 添加元素

List提供了多种添加元素的方法,‌包括add(E element)  、‌add(int index, E element)等。‌

list.add("Hello");
list.add(1, "World"); // 在索引1处插入"World"

3. 访问元素

可以通过索引访问List中的元素,‌使用get(int index)方法。‌

String element = list.get(0); // 获取索引为0的元素

4. 移除元素

可以使用remove(int index)remove(Object o)方法来移除元素。‌

list.remove(0); // 移除索引为0的元素
list.remove("Hello"); // 移除第一个"Hello"元素(‌如果存在)‌

5. 遍历List

遍历List可以使用传统的for循环、‌增强的for循环(‌也称为"for-each"循环)‌或Java 8引入的forEach方法结合Lambda表达式。‌

‌传统的for循环‌:‌

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

‌增强的for循环‌:‌

for (String item : list) {System.out.println(item);
}

‌Java 8的forEach和Lambda表达式‌:‌

list.forEach(item -> System.out.println(item));

6. 排序和搜索

List可以转换为数组,‌使用方法。‌对于排序,‌如果List的元素实现了接口,‌可以使用方法进行排序。‌对于搜索,‌可以使用或方法查找元素的索引。‌

7. 注意事项

在多线程环境下,‌如果多个线程同时访问同一个List实例,‌并且至少有一个线程在结构上修改了列表,‌那么必须外部同步这个List。‌是同步的,‌但通常性能不如,‌因此在单线程环境下推荐使用。‌对于大量随机访问和添加/删除操作较少的场景,‌是较好的选择。‌如果频繁地在列表的开头或中间进行添加/删除操作,‌那么可能更合适。‌

ArrayList

在Java中,‌是一个非常常用的集合类,‌它实现了接口,‌并提供了基于动态数组的实现。‌以下是正确使用的一些基本指导原则:‌

1. 创建ArrayList实例

首先,‌你需要创建一个ArrayList的实例。‌你可以指定元素的类型,‌这样可以在编译时期就进行类型检查。‌

ArrayList<String> list = new ArrayList<>();

这里,‌我们创建了一个存储String类型元素的ArrayList。‌

2. 添加元素

ArrayList提供了多种添加元素的方法,‌最常用的有add(E element)add(int index, E element)。‌

使用add(E element)在列表的末尾添加元素。‌

list.add("Hello");
list.add("World");

使用add(int index, E element)在指定索引处添加元素,‌注意索引从0开始,‌且索引值不能超出当前列表的范围。‌

list.add(1, "Java"); // 列表现在变为["Hello", "Java", "World"]

3. 访问元素

你可以通过索引来访问ArrayList中的元素,‌使用get(int index)方法。‌

String firstElement = list.get(0); // 获取第一个元素

4. 移除元素

ArrayList提供了remove(int index)remove(Object o)方法来移除元素。‌ 

使用remove(int index)移除指定索引处的元素。‌

list.remove(1); // 移除索引为1的元素,‌列表现在变为["Hello", "World"]

使用remove(Object o)移除列表中第一个出现的指定元素。‌

list.remove("Hello"); // 移除"Hello",‌如果列表中存在

5. 遍历ArrayList

遍历ArrayList可以使用传统的for循环、‌增强的for循环(‌也称为"for-each"循环)‌或Java 8引入的forEach方法结合Lambda表达式。‌

传统的for循环 :

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

增强的for循环 :

for (String item : list) {System.out.println(item);
}

Java 8的forEach和Lambda表达式 :

list.forEach(item -> System.out.println(item));

6. 注意事项

  1. ArrayList在添加或删除元素时,‌如果数组需要扩容,‌则可能会涉及到数组复制,‌这会影响性能。‌因此,‌在知道ArrayList大概的元素数量时,‌可以使用的构造器指定初始容量。‌
  2. ArrayList不是线程安全的。‌如果你需要在多线程环境下使用,‌可以考虑使用Vector(‌但通常不推荐,‌因为它比ArrayList更慢)‌,‌或者使用Collections.synchronizedListArrayList包装成线程安全的列表,‌或者使用​​​​​​​java.util.concurrent包下的并发集合类。‌​​​​​​​​​​​​​​

LinkedList

LinkedList是Java集合框架中一个非常有用的类,‌它实现了接口和接口,‌提供了基于链表的数据结构。‌与不同,‌在添加或删除元素时不需要移动其他元素,‌因此这些操作在上通常更高效。‌但是,‌由于内部是通过节点(‌Node)‌来存储元素的,‌随机访问元素(‌通过索引访问)‌可能会比较慢。‌以下是一些使用的正确方法:‌

1. 创建LinkedList实例

你可以像创建其他集合一样创建LinkedList的实例,‌指定元素的类型。‌

LinkedList<String> linkedList = new LinkedList<>();

2. 添加元素

LinkedList提供了多种添加元素的方法,‌包括在列表末尾添加、‌在列表开头添加以及在指定位置添加。‌

在列表末尾添加元素:‌

linkedList.add("Hello");

在列表开头添加元素(‌这是LinkedList特有的高效操作)‌:‌

linkedList.addFirst("First");

// 或者

linkedList.add(0, "First"); // 这在ArrayList中效率较低,‌但在LinkedList中效率较高

在指定位置添加元素(‌注意,‌这可能会比ArrayList慢,‌因为LinkedList需要遍历到该位置)‌:‌

linkedList.add(2, "Middle");

3. 访问元素

虽然支持LinkedList通过索引访问元素,‌但这不是它最擅长的操作。‌如果你需要频繁地通过索引访问元素,‌那么ArrayList可能是更好的选择。‌

String element = linkedList.get(0); // 获取第一个元素

4. 移除元素

LinkedList提供了多种移除元素的方法,‌包括移除第一个元素、‌最后一个元素、‌指定位置的元素或指定的对象。‌

移除并返回列表的第一个元素:‌

String firstElement = linkedList.removeFirst();

// 或者

String firstElementByIndex = linkedList.remove(0);

移除并返回列表的最后一个元素:‌

String lastElement = linkedList.removeLast();

移除指定位置的元素:‌

linkedList.remove(1); // 移除索引为1的元素

5. 遍历LinkedList

遍历LinkedList可以使用传统的for循环、‌增强的for循环或Java 8引入的​​​​​​​forEach方法结合Lambda表达式。‌由于​​​​​​​LinkedList实现了接口​​​​​​​List,‌这些遍历方法都适用。‌

增强的for循环 :

for (String item : linkedList) {System.out.println(item);
}

Java 8的forEach和Lambda表达式 :

linkedList.forEach(item -> System.out.println(item));

6. 注意事项

  1. LinkedList不是线程安全的。‌如果多个线程同时访问一个实例,‌并且至少有一个线程从结构上修改了LinkedList列表,‌那么它必须保持外部同步。‌
  2. 尽管在LinkedList添加和删除元素时通常比​​​​​​​ArrayList更高效,‌但​​​​​​​在随机访问元素时可能较慢。‌因此,‌在选择使用LinkedList还是ArrayList时,‌应考虑你的具体需求。‌

相关文章:

  • 笔记-系统规划与管理师-案例题-2022年-IT服务部署实施
  • 第三十一章:docker如何部署Nexus
  • 搭建Windows环境下的Redis服务与TinyRDM客户端
  • libcurl 库curl_easy_setopt()函数CURLOPT_WRITEDATA和CURLOPT_BUFFERSIZE选项
  • git 落后主分支提交
  • 2.2 python基础知识复习——python面向对象的原理和代码详解
  • web 3D可视化技术
  • 【TB作品】TM1637芯片数码管,PIC16单片机驱动显示,Proteus仿真
  • leetcode860:柠檬水找零
  • 基于51单片机设计的简易直流电机调测速系统(可用在普中开发板)——程序源码设计文档演示视频等(文末工程资料下载)
  • .NET_WebForm_layui控件使用及与webform联合使用
  • Nginx: 配置项之http模块connection和request的用法以及limit_conn和limit_req模块
  • vscode 阅读linux内核(vscode+clangd)
  • mybatisplus 通过xml 定义接口
  • 2024河南萌新联赛第五场 C小美想收集(并查集拓展域,2-sat)
  • #Java异常处理
  • [ 一起学React系列 -- 8 ] React中的文件上传
  • 【162天】黑马程序员27天视频学习笔记【Day02-上】
  • const let
  • docker-consul
  • Go 语言编译器的 //go: 详解
  • hadoop入门学习教程--DKHadoop完整安装步骤
  • Java方法详解
  • java取消线程实例
  • nginx 配置多 域名 + 多 https
  • 成为一名优秀的Developer的书单
  • 前端相关框架总和
  • 微服务入门【系列视频课程】
  • 微信小程序开发问题汇总
  • 新手搭建网站的主要流程
  • 一个普通的 5 年iOS开发者的自我总结,以及5年开发经历和感想!
  • 一起来学SpringBoot | 第三篇:SpringBoot日志配置
  • 找一份好的前端工作,起点很重要
  • hi-nginx-1.3.4编译安装
  • Semaphore
  • 阿里云重庆大学大数据训练营落地分享
  • ​直流电和交流电有什么区别为什么这个时候又要变成直流电呢?交流转换到直流(整流器)直流变交流(逆变器)​
  • (+3)1.3敏捷宣言与敏捷过程的特点
  • (2024,LoRA,全量微调,低秩,强正则化,缓解遗忘,多样性)LoRA 学习更少,遗忘更少
  • (C语言)求出1,2,5三个数不同个数组合为100的组合个数
  • (c语言版)滑动窗口 给定一个字符串,只包含字母和数字,按要求找出字符串中的最长(连续)子串的长度
  • (env: Windows,mp,1.06.2308310; lib: 3.2.4) uniapp微信小程序
  • (编程语言界的丐帮 C#).NET MD5 HASH 哈希 加密 与JAVA 互通
  • (二十三)Flask之高频面试点
  • (简单有案例)前端实现主题切换、动态换肤的两种简单方式
  • (剑指Offer)面试题41:和为s的连续正数序列
  • (论文阅读31/100)Stacked hourglass networks for human pose estimation
  • (三)elasticsearch 源码之启动流程分析
  • (转)为C# Windows服务添加安装程序
  • .NET Core 和 .NET Framework 中的 MEF2
  • .NET Framework Client Profile - a Subset of the .NET Framework Redistribution
  • .Net IE10 _doPostBack 未定义
  • .Net Redis的秒杀Dome和异步执行
  • .NET/C#⾯试题汇总系列:⾯向对象
  • .Net多线程Threading相关详解