Java LinkedList类详解

简介: Java LinkedList类详解

什么是LinkedList

LinkList的底层是双向链表结构,由于链表没有将元素存储在连续的空间中,元素存储在单独的节点中,然后通过引用将结点连接起来了,因此在任意位置插入或者删除元素时,不需要搬移元素,效率比较高

在集合框架中,LinkedList也实现了List接口。

说明:

1.LinkedList实现了List接口

2.LinkedList的底层实现了双向链表

3.LinkedList没有实现RandomAccess接口,因此LinkedList不支持随机访问

4.LinkedList的任意位置插入和删除元素时效率比较高,时间复杂度为O(1)

5.LinkedList比较适合任意位置的插入场景

LinkedList的使用

LinkedList的构造

方法 解释
LinkedList() 无参构造
public LinkedList(Collection<? extends E> c)

使用其它集合容器中元素构造List

举个例子:

import java.util.ArrayList;
import java.util.LinkedList;
import java.util.List;
 
public class Test {
    public static void main(String[] args) {
        //构造一个空的LinkedList
        List<Integer> list1 = new LinkedList<>();
        
        //构建一个ArrayList数组,并添加元素
        List<String> list2 = new ArrayList<>();
        list2.add("JavaSE");
        list2.add("JavaWeb");
        list2.add("JavaEE");
        //使用ArrayList构造LinkedList
        List<String> list3 = new LinkedList<>(list2);
    }
}

LinkedList的其他常用方法的介绍

方法 解释
boolean add(E e) 尾插元素e
void add(int index, E element) 将e插入index的位置
boolean addAll(Collection<? extends E> c) 尾插c中的元素
E remove(int index) 删除index位置的元素
boolean remove(Object o) 删除遇到的第一个o
E get(int index) 获取下标index位置的元素
E set(int index, E element) 将下标为index位置元素设置为element
void clear() 清空
boolean contains(Object o) 判断o是否在线性表中
int indexOf(Object o) 返回第一个o所在的下标
int lastIndexOf(Object o) 从后向前找第一个o的位置,返回其下标
List<E> subList(int fromIndex, int toIndex) 截取部分list
import java.util.LinkedList;
import java.util.List;
 
public class Test {
    public static void main(String[] args) {
        LinkedList<Integer> list = new LinkedList<>();
        list.add(1);//add(elem)表示尾插
        list.add(2);
        list.add(3);
        list.add(4);
        list.add(5);
        list.add(6);
        list.add(7);
        System.out.println(list.size());//7
        System.out.println(list);//1 2 3 4 5 6 7
 
        //在起始位置插入零
        list.add(0, 0);//add(elem):在index位置插入elem
        System.out.println(list);//0 1 2 3 4 5 6 7
 
        list.remove();//remove():删除第一个元素,内部调用的是removeFirst()
        list.removeFirst();//removeFirst():删除第一个元素
        list.removeLast();//removeLast():删除最后一个元素
        list.remove(1);//remove(index):删除index位置的元素
        System.out.println(list);//2 4 5 6
 
        
        //contains(elem):检测elem元素是否存在,如果存在返回true,否则返回false
        if(!list.contains(1)) {
            list.add(0, 1);
        }
        list.add(1);
        System.out.println(list);//1 2 4 5 6 1
        System.out.println(list.indexOf(1));//indexOf(elem):从前往后找到第一个elem的位置
        //0
        System.out.println(list.lastIndexOf(1));//lastIndexOf(elem):从后向前找第一个1的位置
        //5
        int elem = list.get(0);
        list.set(0, 100);//将index位置的元素设置为elem
        System.out.println(list);//100 2 4 5 6 1
        //subList(from, to):用list中的(from, to)之间的元素构造一个新的LinkedList返回
        List<Integer> copy = list.subList(0,3);
        System.out.println(list);
        System.out.println(copy);//100 2 4:注意java中是左闭右开的,所以不包含序号为三的结点
        list.clear();//将list中的元素清空
        System.out.println(list.size());//0
    }
}

LinkedList的遍历

import java.util.LinkedList;
import java.util.ListIterator;
 
public class Test {
    public static void main(String[] args) {
        LinkedList<Integer> list = new LinkedList<>();
        list.add(1);
        list.add(2);
        list.add(3);
        list.add(4);
        list.add(5);
        list.add(6);
        list.add(7);
        System.out.println(list.size());
        //foreach遍历
        for(int e : list) {
            System.out.print(e + " ");
        }
        System.out.println();
        //使用迭代器进行遍历-正向遍历
        ListIterator<Integer> it = list.listIterator();
        while(it.hasNext()) {
            System.out.print(it.next() + " ");
        }
        System.out.println();
        //使用反向迭代器-反向遍历
        ListIterator<Integer> rit = list.listIterator(list.size());
        while(rit.hasPrevious()) {
            System.out.print(rit.previous() + " ");
        }
        System.out.println();
    }
}

补充:迭代器的是使用

import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
 
public class IteratorTest {
    public static void main(String[] args) {
        List<String> list = new ArrayList<>();
        //添加元素到集合中
        Iterator<String> iterator = list.listIterator();
 
        while(iterator.hasNext()) {
            String element = iterator.next();
            //处理元素
        }
        iterator.remove();
    }
}

使用流程

1.获取集合的迭代器对象:通过调用集合的iterator方法获取迭代器对象。例如,对于ArrayList集合,可以使用iterator()方法获取迭代器对象。

2.遍历集合元素:通过使用迭代器的hasNext()和next()方法来遍历集合中的元素。hasNext()方法用于检查是否还有下一个元素,next()方法用于获取下一个元素的值。

ArrayList和LinkedList的区别

不同点 ArrayList LinkedList
存储空间上 物理上一定连续 逻辑上连续,但物理上不一定连续
随机访问 支持O(1) 不支持O(N)
头插 需要搬移元素,效率低O(N) 只需修改引用的指向,时间复杂度为O(1)
插入 空间不够时需要扩容 没有容量的概念
应用场景 元素高效存储+频繁访问 任意位置插入和删除频繁
相关文章
|
3天前
|
存储 Java 容器
Java一分钟之-高级集合框架:LinkedList与TreeSet
【5月更文挑战第17天】这篇博客对比了Java集合框架中的LinkedList和TreeSet。LinkedList是双向链表,适合中间插入删除,但遍历效率低且占用空间大;TreeSet基于红黑树,保证元素有序且不重复,插入删除速度较LinkedList慢但查找快。选择时需根据操作需求和性能考虑。
12 2
|
5天前
|
Java 编译器 ice
【Java开发指南 | 第十五篇】Java Character 类、String 类
【Java开发指南 | 第十五篇】Java Character 类、String 类
24 1
|
3天前
|
自然语言处理 Java API
Java 8的Stream API和Optional类:概念与实战应用
【5月更文挑战第17天】Java 8引入了许多重要的新特性,其中Stream API和Optional类是最引人注目的两个。这些特性不仅简化了集合操作,还提供了更好的方式来处理可能为空的情况,从而提高了代码的健壮性和可读性。
26 7
|
5天前
|
Java
【Java开发指南 | 第十四篇】Java Number类及Math类
【Java开发指南 | 第十四篇】Java Number类及Math类
16 1
|
1天前
|
安全 Java 容器
Java一分钟之-并发编程:线程安全的集合类
【5月更文挑战第19天】Java提供线程安全集合类以解决并发环境中的数据一致性问题。例如,Vector是线程安全但效率低;可以使用Collections.synchronizedXxx将ArrayList或HashMap同步;ConcurrentHashMap是高效线程安全的映射;CopyOnWriteArrayList和CopyOnWriteArraySet适合读多写少场景;LinkedBlockingQueue是生产者-消费者模型中的线程安全队列。注意,过度同步可能影响性能,应尽量减少共享状态并利用并发工具类。
15 2
|
2天前
|
存储 Java 容器
Java LinkedList
5月更文挑战第12天
|
3天前
|
设计模式 算法 Java
Java的前景如何,好不好自学?,万字Java技术类校招面试题汇总
Java的前景如何,好不好自学?,万字Java技术类校招面试题汇总
|
5天前
|
安全 Java 开发者
Java一分钟之-文件与目录操作:Path与Files类
【5月更文挑战第13天】Java 7 引入`java.nio.file`包,`Path`和`Files`类提供文件和目录操作。`Path`表示路径,不可变。`Files`包含静态方法,支持创建、删除、读写文件和目录。常见问题包括:忽略异常处理、路径解析错误和权限问题。在使用时,注意异常处理、正确格式化路径和考虑权限,以保证代码稳定和安全。结合具体需求,这些方法将使文件操作更高效。
11 2
|
5天前
|
安全 Java 开发者
Java一分钟之-Optional类:优雅处理null值
【5月更文挑战第13天】Java 8的`Optional`类旨在减少`NullPointerException`,提供优雅的空值处理。本文介绍`Optional`的基本用法、创建、常见操作,以及如何避免错误,如直接调用`get()`、误用`if (optional != null)`检查和过度使用`Optional`。正确使用`Optional`能提高代码可读性和健壮性,建议结合实际场景灵活应用。
22 3
|
5天前
|
存储 Java 索引
【Java开发指南 | 第十六篇】Java数组及Arrays类
【Java开发指南 | 第十六篇】Java数组及Arrays类
10 3