JAVA --ArrayList与LinkedList

前言

本文分别概述ArrayList和LinkList并总结二者特点与区别。

目录

1.‌什么是ArrayList

ArrayList提供了三种构造方法:

ArrayList核心方法

2.什么是Linklist?

LinkList提供两种构造方法:

LinkList核心方法

3.ArrayList和LinkedList的区别:

底层数据结构

性能特点


1.‌什么是ArrayList

‌ArrayList是Java集合框架中的一个类,它实现了List接口,基于动态数组实现,提供了动态扩展容量的功能。

动态大小: 与 Java 中的数组不同,ArrayList 在添加或删除元素时可以动态调整大小。

泛型支持: ArrayList 支持泛型,这意味着您可以指定它将保存的元素类型。例如,您可以创建一个包含字符串、整数或自定义对象的 ArrayList。

从零开始的索引: ArrayList 中的元素按从零开始的索引存储,这意味着第一个元素位于索引 0,第二个位于索引 1,依此类推。

ArrayList提供了三种构造方法:

无参构造方法‌:创建一个初始容量为10的空列表。

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

源码: 

指定初始容量的构造方法‌:创建一个具有指定初始容量的空列表。

ArrayList<E> list = new ArrayList<>(initialCapacity);

源码: 

从集合构造(使用Collection构造方法:)‌:创建一个包含指定集合元素的列表‌

ArrayList<E> list = new ArrayList<>(Collection<? extends E> c);

Collection<? extends E> c 是一个泛型表达式,它表示一个集合,该集合包含的元素类型是 E 或者是 E 的某个子类型(或子类)。在这个表达式中,? extends E 表示任何是 E 类型或其子类型的通配符。这允许在集合中包含 E 或 E 的子类的元素。 

源码:

代码演示:

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
 
public class Demo01 {
    public static void main(String[] args) {
        // 无参构造方法
        ArrayList<String> emptyList = new ArrayList<>();
 
        // 带初始容量的构造方法
        ArrayList<Integer> intListWithCapacity = new ArrayList<>(10);
 
        // 使用Collection构造方法
        ArrayList<String> list = Arrays.asList("小新","小葵");
        ArrayList<String> arrayListFromCollection = new ArrayList<>(list);
 
        // 输出结果
        System.out.println("无参构造集合: " + emptyList);
        System.out.println("带初始容量的构造集合: " + intListWithCapacity);
        System.out.println("使用Collection构造集合: " + arrayListFromCollection);
    }
}

运行结果:

 

ArrayList核心方法

添加元素:

add(E element): 将元素添加到列表的末尾。
add(int index, E element): 在指定的索引位置插入元素。
获取元素:

get(int index): 获取指定索引位置的元素。
修改元素:

set(int index, E element): 替换指定索引位置的元素。
删除元素:

remove(Object o): 从列表中删除指定的元素。
remove(int index): 删除指定索引位置的元素。
判断是否包含元素:

contains(Object o): 判断列表是否包含指定的元素。
获取列表大小:

size(): 返回列表中的元素数。
判断列表是否为空:

isEmpty(): 如果列表不包含任何元素,则返回 true。
清空列表:

clear(): 从列表中移除所有元素。
获取元素下标:

indexOf(Object o): 返回指定元素第一次出现的索引;如果列表不包含该元素,则返回 -1。
lastIndexOf(Object o): 返回指定元素最后一次出现的索引;如果列表不包含该元素,则返回 -1。
转换为数组:

toArray(): 将列表转换为数组。
截取集合元素:
subList(int fromIndex, int toIndex): 返回列表的子列表,[ fromIndex, toIndex)。

判断内容是否相等:

equals(Object o)

代码演示:

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;

public class Demo02 {
    public static void main(String[] args) {
        ArrayList<String> list = new ArrayList<>();
        List<String> list1 = Arrays.asList("李白","高适","杜甫","杜甫","白居易","王维");
        list.addAll(list);
        System.out.println("list集合中的元素为"+list);

        //int size()
        System.out.println("集合的元素的个数为:"+list.size());
        //E get(int index)获取下标中的元素
        System.out.println("首元素为:"+list.get(0));
        System.out.println("尾元素为:"+list.get(list.size()-1));
        //int intdexOf(Object C)
        System.out.println("元素杜甫的下标位置为:"+list.indexOf("杜甫"));
        //boolean contains(Object c)
        System.out.println("元素杜甫是否存在:"+list.contains("杜甫"));
        //boolean isEmpty
        System.out.println("集合是否为空:"+list.isEmpty());
        //List<E> subList(int fromIndex,int toIndex)
        List<String> subList = list.subList(0,list.size());
        System.out.println("截取的集合元素为:"+subList);
        //boolean equals(Object o)
        System.out.println("内容是否相等"+list.equals(subList));
    }
}

运行结果:

2.什么是Linklist?

LinkList是一个双向链表,它通过节点之间的链接来存储数据。每个节点包含数据和指向前后节点的引用。这种结构使得LinkedList适合于频繁的插入和删除操作。

内部结构
LinkedList的内部结构包括节点(Node)和链表(LinkedList类)。每个节点包含数据、前一个节点的引用和后一个节点的引用。这种结构使得LinkedList既可以从头部也可以从尾部进行快速的插入和删除操作‌。

LinkList提供两种构造方法:

无参构造方法:

LinkedList<E> list = new LinkedList<>();

源码:

从集合构造(使用Collection构造方法:)‌:

LinkList<E> list = new LinkList<>(Collection<? extends E> c);

LinkList核心方法

代码示例:

public class Demo07 {
    public static void main(String[] args) {
        //创建list1
        LinkedList<String> list1 = new LinkedList<>();
        //添加元素
        list1.add("小白");
        list1.add("小葵");

        //add(int index,E element) 在此列表中的指定位置插入指定的元素。
        list1.add(0,"小新");

        ////boolean addAll(int index,Collection<?extendsE>c)添加一个单列集合,默认添加到集合的尾部,如果传入index,则放入指定位置
        List<String> c1 = Arrays.asList("风间","妮妮","阿呆");
        list1.addAll(1,c1);

        //void addFirst(E,e)添加到列表的头部
        list1.addFirst("蜘蛛侠");
        //void addLast(E e)添加到列表的尾部
        list1.addLast("黑寡妇");
        System.out.println("集合的内容为:"+list1);

        //查看
        String item1 = list1.get(0);
        System.out.println("首元素为:"+item1);
        System.out.println("首元素为:"+list1.getFirst());
        System.out.println("尾元素为:"+list1.getLast());
        System.out.println("元素个数为:"+list1.size());

        //修改set(int index,Eelement):用指定的元素替代此列表中指定位置上的元素。
        int index = list1.indexOf("小新");
        list1.set(index,"野原新之助");
        System.out.println("修改后的集合为:"+list1);

        //删除方法
        boolean b1 = list1.remove("小新");
        System.out.println("删除是否成功:"+b1);
        System.out.println("修改后的集合为:"+list1);
        String item = list1.remove(2);
        System.out.println("删除元素为:"+item);
        System.out.println("修改后的集合为:"+list1);
        System.out.println("删除的首元素为:"+list1.removeFirst());
        System.out.println("删除的尾元素为:"+list1.removeLast());
        System.out.println("默认删除首元素:"+list1.remove());



    }
}

运行结果:

3.ArrayList和LinkedList的区别:

‌ArrayList和LinkedList的主要区别在于它们的底层数据结构、性能特点以及适用场景。

图解:

底层数据结构

  • ArrayList‌:基于动态数组实现,维护一个Object类型的数组来存储元素,可以根据需要自动扩展容量。当元素数量超过当前容量时,ArrayList会进行扩容操作,通常是将现有元素复制到一个新的更大数组中‌。
  • LinkedList‌:基于双向链表实现,每个节点包含存储的元素、指向前一个节点的引用和指向下一个节点的引用。LinkedList不需要预先分配固定大小的空间,可以在链表的头部或尾部灵活地添加或删除元素‌。

性能特点

------------------------------------------------------------------------------------------------------------------------------
查询性能‌:‌ArrayList‌:通过索引直接访问元素,查询速度非常快,时间复杂度为O(1)。适合需要频繁访问特定位置数据的场景‌。
LinkedList‌:需要遍历链表来找到指定索引的元素,查询速度较慢,时间复杂度为O(n)‌。

‌添加和删除性能‌:‌ArrayList‌:在列表中间插入或删除元素时,需要移动后续的所有元素,时间复杂度为O(n)。在列表末尾插入或删除元素的时间复杂度为O(1),但扩容时需要复制元素,时间复杂度较高‌。
‌LinkedList‌:在头部或尾部添加或删除元素时,只需更改指针引用,时间复杂度为O(1)。在中间插入或删除元素时,时间复杂度为O(n),但如果已知节点位置,操作时间复杂度为O(1)‌。

适用场景
‌ArrayList‌:适合需要频繁访问特定位置数据的场景,如排行榜、购物车列表等。由于其在中间插入或删除元素的性能较差,更适合查询多、增删少的场景‌。
‌LinkedList‌:适合需要频繁在列表头部或尾部进行插入和删除操作的场景,如链表操作、队列等。由于其内部结构特点,更适合动态增删操作‌。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值