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使用 & 删除小明