【JAVA语言-第15话】集合框架(二)——List、ArrayList、LinkedList、Vector集合

目录

List集合

1.1 概述

1.2 特点

1.3 常用方法

1.4 ArrayList集合

1.4.1 概述 

1.4.2 练习

1.5 LinkedList集合 

1.5.1 概述

1.5.2 特点

1.5.3 常用方法

1.5.4 练习

1.6 Vector类

1.6.1 概述

1.6.2 练习

1.7 List实现类的异同点


List集合

1.1 概述

        java.util.List:List是一个接口,它继承自Collection接口。常用的实现类有ArrayList和LinkedList。使用List接口的好处是可以将代码与具体的实现类解耦,从而提高代码的灵活性和可维护性。

1.2 特点

  1. 有序的集合,存储元素和取出元素的顺序是一致的(存储123,取出123)。
  2. 有索引,包含了一些带索引的方法 。
  3. 允许存储重复的元素 。

1.3 常用方法

        List接口继承Collection接口,因而Collection中常用的方法List也可使用。这里主要列举一些List个性化的方法(带索引方法的使用)。List接口不能直接创建对象,需要采用多态形式创建 其 实现类对象,才能使用。

方法:

  • void add(int index,E element):将E,添加到该集合中的index处。
  • E get(int index):返回集合中index的E。
  • E remove(int index):移除列表中index的E,返回的是被移除的E。
  • E set(int index,E element):用E替换集合中index的E,返回值是更新前的E。
  • int indexOf(E element):返回集合中E的index,没有找到返回-1。

        

说明:

        E:集合元素,集合中具体的值。

        index:指定位置,集合的索引值。

        

注意事项:操作索引的时候,一定要防止索引越界异常:

  • IndexOutOfBoundsException:索引越界异常,集合会报。
  • ArrayIndexOutOfBoundsException:数组索引越界异常。
  • StringIndexOutOfBoundsException:字符串索引越界异常。

1.4 ArrayList集合

1.4.1 概述 

        java.util.ArrayList:ArrayList是一种动态数组,它实现了List接口。ArrayList可以根据需要自动调整大小,可以存储任意类型的对象。ArrayList提供了一系列的方法,可以方便地对其中的元素进行添加、删除、查找和遍历操作。与普通的数组相比,ArrayList的大小是可变的,并且可以自动处理底层数组的扩容和缩容。使用ArrayList能够方便地操作和管理一系列对象的集合。

1.4.2 练习

源代码: 

package com.zhy.coll;import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;public class TestArrayList {public static void main(String[] args) {//创建一个集合<泛型为String类型>,多态写法,接口引用 指向 实现类对象List<String> list = new ArrayList<String>();//往集合中添加元素list.add("elememt1");list.add("elememt2");list.add("elememt3");//打印集合System.out.println("初始化集合:" + list);//1.将指定元素,添加到该集合的指定位置上list.add(1,"elementNew");System.out.println("在索引1插入元素:" + list);//2.返回集合中指定位置的元素String nameE = list.get(0);System.out.println("返回索引0的元素:" + nameE);//3.移除集合中指定位置的元素,返回的是被移除的元素String removeE = list.remove(2);System.out.println("移除索引2的元素,返回的是被移除的元素:" + removeE);//4.用指定元素替换集合中指定位置的元素,返回的是更新前的元素String beforeE = list.set(0,"elementUpdate");System.out.println("用新元素替换掉索引0的元素,返回的是更新前索引0的元素:" + beforeE);//5.返回集合中指定元素的索引,找不到返回-1int indexE = list.indexOf("elementOld");System.out.println("返回(elementOld)的索引:" + indexE);//使用迭代器遍历List集合System.out.print("使用迭代器遍历List集合:");Iterator<String> iterator = list.iterator();while(iterator.hasNext()){String tempE = iterator.next();System.out.print(tempE + " ");}}
}

输出结果:

1.5 LinkedList集合 

1.5.1 概述

        java.util.LinkedList:LinkedList实现了Java的List接口,因而可以像其他List实现类一样使用。它也实现了Deque接口,因而可以作为双端队列使用。另外,LinkedList还实现了Queue接口,因而可以作为队列使用。

1.5.2 特点

  • LinkedList是Java中的一种数据结构,它是一个双向链表,每个节点包含了数据本身以及指向前一个节点和后一个节点的引用
  • LinkedList不需要预先指定容量,可以根据需要动态地增加或减少元素。
  • LinkedList允许快速插入和删除元素,因为只需要调整节点的引用,而不需要像数组那样移动元素。
  • 访问和搜索元素的性能较差,因为需要从头或尾开始遍历链表。

1.5.3 常用方法

        使用LinkedList集合特有的方法,不能使用多态。

  • void addFirst(E e):将指定元素插入此列表的开头。
  • void addLast(E e):将指定元素添加到此列表的结尾。
  • void push(E e):将元素推入此列表所表示的堆栈。
  • E getFirst():返回此列表的第一个元素。
  • E getLast():返回此列表的最后一个元素。
  • E removeFirst():移除并返回此列表的第一个元素。
  • E removeLast():移除并返回此列表的最后一个元素。
  • E pop():从此列表所表示的堆栈出弹出一个元素。

1.5.4 练习

源代码:

package com.zhy.coll;import java.util.LinkedList;public class TestLinkedList {public static void main(String[] args) {//创建LinkedList对象LinkedList<String> linkedList = new LinkedList<>();linkedList.add("Annie");linkedList.add("Bob");linkedList.add("Tom");System.out.println("初始化LinkedList集合:" + linkedList);//返回此列表的第一个元素String fistE = linkedList.getFirst();System.out.println("列表的第一个元素为:" + fistE);//返回此列表的最后一个元素String lastE = linkedList.getLast();System.out.println("列表的最后一个元素为:" + lastE);//将指定元素插入此列表的开头linkedList.addFirst("Lisa");System.out.println("在列表开头插入元素:" + linkedList);//将指定元素添加到此列表的结尾linkedList.addLast("Carl");System.out.println("在列表末尾插入元素:" + linkedList);//移除并返回此列表的第一个元素linkedList.removeFirst();System.out.println("移除第一个元素:" + linkedList);//移除并返回此列表的最后一个元素linkedList.removeLast();System.out.println("移除最后一个元素:" + linkedList);//将元素推入此列表所表示的堆栈linkedList.push("Dick");System.out.println("在栈首添加元素:" + linkedList);//从列表所表示的堆栈出弹出一个元素linkedList.pop();System.out.println("将栈首的元素弹出:" + linkedList);//使用增强for遍历列表System.out.print("使用增强for遍历列表:");for(String e : linkedList){System.out.print(e + " ");}}
}

输出结果:

1.6 Vector类

1.6.1 概述

        Vector类是Java中提供的一种动态数组实现。它是使用数组来存储元素的,并且可以根据需要自动调整数组的大小。Vector类提供了一系列方法来操作数组,例如添加元素、获取元素、删除元素等。Vector类还具有线程安全的特性,可以在多个线程同时访问和修改数组,以确保数据的一致性和安全性。因此,Vector类常用于需要在多线程环境下操作数组的场景中

1.6.2 练习

源代码:

package com.zhy.coll;import java.util.Iterator;
import java.util.Vector;public class TestVector {public static void main(String[] args) {Vector<String> vector = new Vector<>();vector.add("element1");vector.add("element2");vector.add("element3");System.out.println("初始化集合:" + vector);vector.remove(0);System.out.println("移除第0个元素:" + vector);vector.set(0,"elementNew");System.out.println("修改第0个元素的值:" + vector);System.out.print("使用增强for遍历集合:");for (String name : vector){System.out.print(name + " ");}System.out.print("\n使用迭代器遍历集合:");Iterator<String> iterator = vector.iterator();while(iterator.hasNext()){String ele = iterator.next();System.out.print(ele + " ");}}
}

输出结果: 

1.7 List实现类的异同点

        ArrayList,LinkedList和Vector都是Java集合框架中的实现类,它们用于存储和操作集合数据。三者的异同如下:

相同点:

  • 都实现了List接口,都支持索引访问元素。
  • 都可以存储任意类型的对象。
  • 都具有动态扩容的能力。

不同点: 

  • ArrayList底层使用数组实现;LinkedList底层使用双向链表实现;Vector底层也使用数组实现。
  • ArrayList是非线程安全的;LinkedList和Vector是线程安全的。
  • ArrayList和LinkedList适用于随机访问和遍历;而Vector适用于需要线程安全性的场景。
  • ArrayList和LinkedList的插入和删除操作的性能取决于位置;ArrayList在尾部插入和删除元素效率高,而LinkedList在中间插入和删除元素效率高。
  • Vector相比ArrayList和LinkedList,性能较低,因为它需要进行同步(线程安全)操作。

        因此,选择ArrayList还是LinkedList或Vector取决于具体的需求。如果需要随机访问和遍历,且不需要线程安全,则选择ArrayList;如果需要频繁插入和删除元素,或需要线程安全,则选择LinkedList;如果需要线程安全且不考虑性能,则选择Vector

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

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

相关文章

【自动化测试】读写64位操作系统的注册表

自动化测试经常需要修改注册表 很多系统的设置&#xff08;比如&#xff1a;IE的设置&#xff09;都是存在注册表中。 桌面应用程序的设置也是存在注册表中。 所以做自动化测试的时候&#xff0c;经常需要去修改注册表 Windows注册表简介 注册表编辑器在 C:\Windows\regedit…

一篇文章带你了解C++中隐含的this指针

文章目录 一、this指针的引出二、this指针的特性【面试题】 一、this指针的引出 我们先来定义一个日期类Date&#xff0c;下面这段代码执行的结果是什么呢&#xff1f; class Date { public:void Init(int year, int month, int day){_year year;_month month;_day day;}v…

基于springboot+vue的明星周边产品销售网站(前后端分离)

博主主页&#xff1a;猫头鹰源码 博主简介&#xff1a;Java领域优质创作者、CSDN博客专家、公司架构师、全网粉丝5万、专注Java技术领域和毕业设计项目实战 主要内容&#xff1a;毕业设计(Javaweb项目|小程序等)、简历模板、学习资料、面试题库、技术咨询 文末联系获取 研究背景…

Python tkinter (6) Listbox

Python的标准Tk GUI工具包的接口 tkinter系列文章 python tkinter窗口简单实现 Python tkinter (1) —— Label标签 Python tkinter (2) —— Button标签 Python tkinter (3) —— Entry标签 Python tkinter (4) —— Text控件 GUI 目录 Listbox 创建listbox 添加元素…

AI数字人-数字人视频创作数字人直播效果媲美真人

在科技的不断革新下&#xff0c;数字人技术正日益融入到人们的生活中。近年来&#xff0c;随着AI技术的进一步发展&#xff0c;数字人视频创作领域出现了一种新的创新方式——AI数字人。数字人视频通过AI算法生成虚拟主播&#xff0c;其外貌、动作、语音等方面可与真实人类媲美…

09. Springboot集成sse服务端推流

目录 1、前言 2、什么是SSE 2.1、技术原理 2.2、SSE和WebSocket 2.2.1、SSE (Server-Sent Events) 2.2.2、WebSocket 2.2.3、选择 SSE 还是 WebSocket&#xff1f; 3、Springboot快速集成 3.1、添加依赖 3.2、创建SSE控制器 3.2.1、SSEmitter创建实例 3.2.2、SSEmi…

C++:引用

目录 概念&#xff1a; 引用的使用格式&#xff1a; 引用特性&#xff1a; 常引用 使用场景&#xff1a; 1、做参数 二级指针时的取别名 一级指针取别名 一般函数取别名 2、做返回值 函数返回值的原理&#xff1a; 引用的返回值使用&#xff1a; 引用和指针的对比&…

YOLOv8训练自己的数据集,通过LabelImg

记录下labelImg标注数据到YOLOv8训练的过程,其中容易遇到labelImg的坑 数据集处理 首先在mydata下创建4个文件夹 images文件夹下存放着所有的图片&#xff0c;包括训练集和测试集等。后续会根据代码进行划分。 json文件夹里存放的是labelImg标注的所有数据。需要注意的是&…

Ubuntu findfont: Font family ‘SimHei‘ not found.

matplotlib中文乱码显示 当我们遇到这样奇怪的问题时, 结果往往很搞笑 尝试1不行 Stopping Jupyter Installing font-manager: sudo apt install font-manager Cleaning the matplotlib cache directory: rm ~/.cache/matplotlib -fr Restarting Jupyter. 尝试2 This work fo…

Spring Boot 中的外部化配置

Spring Boot 中的外部化配置 一、配置文件基础1.配置文件格式&#xff08;1&#xff09;YAML 基本语法规则&#xff08;2&#xff09;YAML 支持三种数据结构 2.application 文件3.application.properties 配置文件4.application.yml 配置文件5.Environment6.组织多文件7.多环境…

HTTP动态代理的原理及其对网络性能的影响

HTTP动态代理是一种通过代理服务器来转发HTTP请求和响应数据的网络技术&#xff0c;它可以优化网络性能、提高网络安全性&#xff0c;并解决跨域请求的问题。本文将详细介绍HTTP动态代理的原理及其对网络性能的影响。 一、HTTP动态代理的原理 HTTP动态代理的基本原理是在客户…

微信小程序(十四)分包和分包预加载

注释很详细&#xff0c;直接上代码 上一篇 新增内容&#xff1a; 1.分包的配置 2.分包预加载的写法 先说说为什么需要分包&#xff1a; 小程序追求小而快&#xff0c;主包的大小控制是小程序上线的硬性要求&#xff0c;分包有利于小程序优化加载速度 分包的注意事项&#xff1a…

大模型+自动驾驶

论文&#xff1a;https://arxiv.org/pdf/2401.08045.pdf 大型基础模型的兴起&#xff0c;它们基于广泛的数据集进行训练&#xff0c;正在彻底改变人工智能领域的面貌。例如SAM、DALL-E2和GPT-4这样的模型通过提取复杂的模式&#xff0c;并在不同任务中有效地执行&#xff0c;从…

数字图像处理(实践篇)三十一 Raw图像数据转为RGB图像实践

目录 1 Raw图像和RGB图像 2 Raw图像的排布方式 3 方案 4 实践 5 其他 1 Raw图像和RGB图像 Raw图片是未经压缩的,没有任何数据损失,Raw图片保留了从图像传感器捕获的每个像素的原始信息,因此可以实现更高的图像质量。

用C语言实现贪吃蛇游戏!!!(破万字)

前言 大家好呀&#xff0c;我是Humble&#xff0c;不知不觉在CSND分享自己学过的C语言知识已经有三个多月了&#xff0c;从开始的C语言常见语法概念说到C语言的数据结构今天用C语言实现贪吃蛇已经有30余篇博客的内容&#xff0c;也希望这些内容可以帮助到各位正在阅读的小伙伴…

Flink实现数据写入MySQL

先准备一个文件里面数据有&#xff1a; a, 1547718199, 1000000 b, 1547718200, 1000000 c, 1547718201, 1000000 d, 1547718202, 1000000 e, 1547718203, 1000000 f, 1547718204, 1000000 g, 1547718205, 1000000 h, 1547718210, 1000000 i, 1547718210, 1000000 j, 154771821…

基于51单片机智能电子秤

实物显示效果&#xff1a; https://www.bilibili.com/video/BV1Wb4y1A7Aw/?vd_source6ff7cd03af95cd504b60511ef9373a1d 功能介绍&#xff1a; &#xff08;1&#xff09;用键盘设计单价&#xff1b; &#xff08;2&#xff09;称重后同时显示该物品的重量、单价和总额&…

记签名机制

签名过程&#xff1a; 首先将数据源通过摘要算法获取到数字摘要 对数字摘要用私钥进行加密得到签名 将原始消息 以及签名发送给消息接收方 接收方用公钥解密得到数字摘要 用同样的摘要算法将原始消息进行计算 比较得到的数字摘要与解密后的是否一致 Android学习笔记——Androi…

【精选推荐】3款强大的API渗透测试工具

1免责声明 请勿利用文章内的相关技术从事非法测试&#xff0c;由于传播、利用此文所提供的信息而造成的任何直接或者间接的后果及损失&#xff0c;均由使用者本人负责&#xff0c;作者不为此承担任何责任。工具来自网络&#xff0c;安全性自测。 2前言 给大家介绍三款优秀的…

智能GPT图书管理系统(SpringBoot2+Vue2)、接入GPT接口,支持AI智能图书馆

☀️技术栈介绍 ☃️前端主要技术栈 技术作用版本Vue提供前端交互2.6.14Vue-Router路由式编程导航3.5.1Element-UI模块组件库&#xff0c;绘制界面2.4.5Axios发送ajax请求给后端请求数据1.2.1core-js兼容性更强&#xff0c;浏览器适配3.8.3swiper轮播图插件&#xff08;快速实…