IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 数据结构与算法 -> 单例集合List -> 正文阅读

[数据结构与算法]单例集合List

List

特点

有序:有序(元素存入集合的顺序和取出的顺序一致)。List 中每个元素都有索引标记。 可以根据元素的索引标记(在 List 中的位置)访问元素,从而精确控制这些元素。
可重复:List 允许加入重复的元素。更确切地讲,List 通常允许满足e1.equals(e2) 的元素重复加入容器

常用实现类

ArrayList类

特点

底层由数组实现,存储的数据具有有序性,重复性,且查询效率高,增删效率低,线程不安全,JDK1.8后使用了延迟加载,只有添加元素是才创建数组,扩容的大小为原来的1.5倍题

有序性:由于底层是由数组实现的,所以ArrayList将需要保存的数据依次保存在数组中。
重复性:可以保存重复的数据即e1.equals(e2) 的数据。
查询效率高:因为底层由数组实现并且是按顺序将数据存入数组中,所以我们可以通过数组的下标进行数据索引,而无需进行遍历查找。
增删效率低:数组的性质决定了ArrayList的增删效率低,因为数组是一串连续的内存空间进行数据保存,如果对数组中的元素进行增删操作的话,除非是数组头尾元素,否则将要对数组中某些元素的位置造成变化,增加了时间开销。

常用方法

public boolean add(E,e):
向集合当中添加元素,参数的类型和泛型保持一致,返回值代表是否成功(true、false)
public E get(int index):从集合当中获取元素,参数是索引编号,返回值就是对应位置的元素
public E remove(int index):从集合当中删除元素,参数是索引编号,返回值就是被删除的元素
public int size():获取集合的尺寸长度,返回值是集合中包含的元素个数
注意事项: *对于arraylist集合来说,add添加动作一定成功,所以返回值可用可不用 ,但对于其他集合来说,add添加动作不一定成功

代码示例
/**
 * @author jitwxs
 * @date 2022年08月15日 23:07
 */
public class Demo {

    public static void main(String[] args) {
        //新建一个ArrayList,用来存储String类型的数据
        ArrayList<String> arrayList = new ArrayList<>();
        //添加元素
        boolean csdn = arrayList.add("csdn");
        System.out.println("打印添加的元素是否成功: "+csdn);
        arrayList.add("csdn1");
        arrayList.add("csdn2");
        arrayList.add("csdn3");
        arrayList.add("csdn1");
        arrayList.add("csdn4");
        arrayList.add("csdn5");
        //通过位置获取元素
        String s0 = arrayList.get(0);
        System.out.println("ArrayList集合位置为0的元素为: "+s0);
        //通过元素,查找元素所在集合中的位置
        int csdnIndex = arrayList.indexOf("csdn");
        System.out.println("元素csdn所在位置为: "+csdnIndex);
        //查找当前元素最后出现的位置
        int csdn1 = arrayList.lastIndexOf("csdn1");
        System.out.println("元素csdn1最后所在位置为: "+csdn1);
        System.out.println("删除前的集合: "+arrayList);
        //按照元素删除集合中元素
        boolean csdn2 = arrayList.remove("csdn2");
        String remove = arrayList.remove(2);
        System.out.println("csdn2是否删除成功: "+csdn2);
        System.out.println("集合中位置为2的被删除的元素为: "+remove);
        System.out.println("删除后的集合: "+arrayList);
        //判断集合是否为空
        boolean empty = arrayList.isEmpty();
        System.out.println("当前集合是否为空:"+empty);
        //获取集合大小
        int size = arrayList.size();
        System.out.println("当前集合大小为: "+size);
        //替换集合中指定位置的元素
        System.out.println("替换前集合位置3的元素为: "+arrayList.get(3));
        String th3 = arrayList.set(3, "tihuan3");
        System.out.println(th3+"替换后的集合为:"+arrayList);
        //判断集合中是否包含某个元素
        boolean csdn5 = arrayList.contains("csdn5");
        System.out.println("当前集合是否包含元素csdn5: "+ csdn5);


    }

}

打印结果:

打印添加的元素是否成功: true
ArrayList集合位置为0的元素为: csdn
元素csdn所在位置为: 0
元素csdn1最后所在位置为: 4
删除前的集合: [csdn, csdn1, csdn2, csdn3, csdn1, csdn4, csdn5]
csdn2是否删除成功: true
集合中位置为2的被删除的元素为: csdn3
删除后的集合: [csdn, csdn1, csdn1, csdn4, csdn5]
当前集合是否为空:false
当前集合大小为: 5
替换前集合位置3的元素为: csdn4
csdn4替换后的集合为:[csdn, csdn1, csdn1, tihuan3, csdn5]
当前集合是否包含元素csdn5: true

ArrayList底层源码分析

add()方法:
在这里插入图片描述
从添加元素方法可以看出ArrayList底层由数组实现。
添加元素自动扩容源代码实现:
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
剩下的相关方法源码,小伙伴们感兴趣可以去看一下!

LinkedList类

特点

底层由双向链表实现,满足List类的有序性和可重复性,特点是查询速度慢(需要遍历查询),增删效率高(只需要修改前后两个节点),线程不安全。

有序性:LinkedList类通过链表来保证存储元素的有序性。
可重复性:并未对存储的元素做出限制,所以可以存储重复的元素。
查询速度慢:因为链表无法通过索引进行数据查询,所以需要遍历链表查询元素。
增删效率高:由于链表是通过一个个节点连接起来的,所以增删操作只需要操作前后两个节点即可。

常用方法

与ArrayList类一致。

ArrayList类与LinkedList类的区别

1、ArrayList 是基于数组实现的,LinkedList 是基于双向链表实现的,ArrayList 在新增和删除元素时,因为涉及到数组复制,所以效率比 LinkedList 低,而在遍历的时候,ArrayList 的效率要高LinkedList。
2、ArrayList 是基于动态数组实现的非线程安全的集合。当底层数组满的情况下还在继续添加的元素时,ArrayList则会执行扩容机制扩大其数组长度。ArrayList查询速度非常快,使得它在实际开发中被广泛使用。美中不足的是插入和删除元素较慢,同时它并不是线程安全的。
扩容机制:通过扩容机制判断原数组是否还有空间,若没有则重新实例化一个空间更大的新数组,把旧数组的数据拷贝到新数组中,先判断下标是否越界,再扩容。若插入的下标为i,则通过复制数组的方式将i后面的所有元素,往后移一位,新数据替换下标为i的旧元素。
LinkedList 是基于双向链表实现的非线程安全的集合,它是一个链表结构,不能像数组一样随机访问,必须是每个元素依次遍历直到找到元素为止。其结构的特殊性导致它查询数据慢。查询时先判断元素是靠近头部,还是靠近尾部,然后再查询。

Vector类(不常用)

特点

Vector 底层是用数组实现的,相关的方法都加了同步检查,因此“线程安全,效率低”。没有延时加载,一旦初始化后立即创建数组,数组长度为10,扩容大小为原来的2倍。

常用的实现List类线程安全的三种方法

1、Vector类:相关的方法都加了同步检查,因此“线程安全,效率低”。没有延时加载,一旦初始化后立即创建数组,数组长度为10,扩容大小为原来的2倍。
2、使用Collections的静态方法synchronizedList(List< T> list):使用这种方法可以获得线程安全的List容器,它和Vector的区别在于它采用了同步代码块实现线程间的同步。
3、采用CopyOnWriteArrayList容器:在写操作的时候复制数组,为了将读取的性能发挥到极致,在该类的使用过程中,读读操作和读写操作都不互斥。

  数据结构与算法 最新文章
【力扣106】 从中序与后续遍历序列构造二叉
leetcode 322 零钱兑换
哈希的应用:海量数据处理
动态规划|最短Hamilton路径
华为机试_HJ41 称砝码【中等】【menset】【
【C与数据结构】——寒假提高每日练习Day1
基础算法——堆排序
2023王道数据结构线性表--单链表课后习题部
LeetCode 之 反转链表的一部分
【题解】lintcode必刷50题<有效的括号序列
上一篇文章      下一篇文章      查看所有文章
加:2022-08-19 19:31:09  更:2022-08-19 19:33:51 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/25 21:21:45-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码