Java集合框架 List接口实现类--LinkedList类的使用 & 源码分析 & LinkedList与ArrayList类的区别

Posted Z && Y

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Java集合框架 List接口实现类--LinkedList类的使用 & 源码分析 & LinkedList与ArrayList类的区别相关的知识,希望对你有一定的参考价值。

List接口实现类:


1. LinkedList类的使用

package list;

import java.util.Iterator;
import java.util.LinkedList;
import java.util.ListIterator;

/**
 * LinkedList的用法
 * 存储结构:双向链表
 * 1.添加元素
 * 2.删除元素
 * 3.遍历
 * 4.判断
 */
public class Demo6 {
    public static void main(String[] args) {
        LinkedList<Student> linkedList = new LinkedList<Student>();
        Student s1 = new Student("小明", 20);
        Student s2 = new Student("小李", 21);
        Student s3 = new Student("小周", 22);
        Student s4 = new Student("小徐", 21);
        Student s5 = new Student("小邓", 22);
        //1.添加元素
        linkedList.add(s1);
        linkedList.add(s2);
        linkedList.add(s3);
        linkedList.add(s4);
        linkedList.add(s5);
        System.out.println("元素个数:" + linkedList.size());
        System.out.println("元素内容:" + linkedList.toString() + "\\n");
        //2.删除元素

        linkedList.remove(s1);
        System.out.println("删除s1后:" + linkedList.toString());
        linkedList.remove(2);
        System.out.println("删除下标为2的元素后:" + linkedList.toString() + "\\n");

        //3.遍历

        //3.1 使用for
        System.out.println("----------使用for循环遍历----------");
        for (int i = 0; i < linkedList.size(); ++i) {
            System.out.println(linkedList.get(i));
        }
        System.out.println();
        //3.2 使用增强for
        System.out.println("----------使用增强for循环遍历----------");
        for (Student student : linkedList) {
            System.out.print(student.toString() + "\\t");
        }
        System.out.println();
        //3.3 使用迭代器
        System.out.println("----------使用迭代器遍历----------");
        Iterator iterator = linkedList.iterator();
        while (iterator.hasNext()) {
            Student student = (Student) iterator.next();
            System.out.print(student.toString() + "\\t");
        }
        System.out.println();
        //3.4 使用列表迭代器
        System.out.println("----------使用列表迭代器遍历----------");
        ListIterator listIterator = linkedList.listIterator();
        while (listIterator.hasNext()) {
            System.out.print(listIterator.next() + "\\t");
        }
        System.out.println("\\n");
        //4. 判断
        System.out.println("集合是否包含s1:" + linkedList.contains(s1));
        System.out.println("集合是否为空:" + linkedList.isEmpty());
        System.out.println("s3的下标为: " + linkedList.indexOf(s3));
    }
}

class Student {
    private String name;
    private int age;

    public Student(String name, int age) {
        this.name = name;
        this.age = age;
    }

    @Override
    public String toString() {
        return "Student{" +
                "name='" + name + '\\'' +
                ", age=" + age +
                '}';
    }
}


2. LinkedList类源码分析

LinkedList首先有三个属性:

  • 链表大小:transient int size = 0;
  • (指向)第一个结点/头结点: transient Node first;
  • (指向)最后一个结点/尾结点:transient Node last;

关于Node类型我们再进入到类里看看:

  • 首先item存放的是实际数据;next指向下一个结点而prev指向上一个结点。

构造方法

  • Node带参构造方法的三个参数分别是前一个结点、存储的数据、后一个结点,调用这个构造方法时将它们赋值给当前对象。

LinkedList是如何添加元素的呢?先看看add方法:

public boolean add(E e) {
    linkLast(e);
    return true;
}

进入到linkLast方法:

void linkLast(E e) {
    final Node<E> l = last;
    final Node<E> newNode = new Node<>(l, e, null);
    last = newNode;
    if (l == null)
        first = newNode;
    else
        l.next = newNode;
    size++;
    modCount++;
}

3. LinkedList与ArrayList类的区别

  • ArrayList(内部数组实现):必须开辟连续空间,查询快,增删慢。
  • LinkedList(内部双向链表实现):无需开辟连续空间,查询慢,增删快。



以上是关于Java集合框架 List接口实现类--LinkedList类的使用 & 源码分析 & LinkedList与ArrayList类的区别的主要内容,如果未能解决你的问题,请参考以下文章

Java集合框架 List接口实现类--ArrayList使用 & 删除小明

Java里的集合--主要区别

java常见面试题

Java集合框架 List接口实现类--Vector的使用(了解即可)

集合框架学习之List接口

Java知识33 集合框架 List接口 Map 和set多测师