【第 18 个代码模型】List 集合接口(LinkedList 子类)|学习笔记

开发者学堂课程【【名师课堂】Java 高级开发【第 18 个代码模型】List 集合接口(LinkedList 子类)】学习笔记,与课程紧密联系,让用户快速学习知识。

课程地址:https://developer.aliyun.com/learning/course/372/detail/4662


【第 18 个代码模型】List 集合接口(LinkedList 子类)


LinkList 子类(5%)

1、 首先来观察一下 ArrayList 类的核心代码:

2、 LinkedList:

3、 总结:

 

在 List 接口里面还有一个令 LinkedList 子类,这个子类如果向父类接口转型的话,使用的形式和之前没有任何的区别。

如下所示

package cn.mldn.demo;

import java.util. LinkedList;

import java.util.List;

public class TestDemo {

public static void main(String[] args) throws Exception {

List<String> all= new LinkedList<String>() ;

all.add("Hello") ;

all.add("Hello") ;

all.add("World") ;

all.remove("Hello") ;

System.out.println(all);

}

}

结果出来一模一样

 

面试题:

请解释 ArrayList 与 LinkedList 区别?

首先来观察一下 ArrayList 类的核心代码

可以发现 ArrayList 里面存放的是数组,如果在实例化此类对象的时候确认传入了数组的大小,则里面保存的数组就会开辟一个定长的数组。但是如果后面再进行数据保存的时候发现数组的个数不够了,那么会进行数组的动态扩充。

所以很明显在实际的开发之中,如果要使用 ArrayList,最好的方法就是设置初始化的大小(分页程序为例,每次只会取出指定行的内容)。

构造方法:

public ArrayList() {

this.elementData = DEFAUL TCAPACITY_ EMPTY_ EL EMENTDATA;

}

常量:

privatestaticfinal Object[]DEFAULTCAPACITY_EmPTY_ELEMENTDATA={};

public class TestDemo {

public static void main(String[] args) throws Exception {

List<String>all= new ArrayList<string>(2) ;

all.add("Hello") ;

all.add("Hello") ;

all.add("World") ;

System.out.println(all);

System.out.println(Math.max(10, 20));

}

}

如果初始化的常数大于零,new Obiect 初始化常数,还入了一个大小过去,那么它的数组大小就是由外部决定,如果没有传入大小就是默认一个数组。

LinkedList:

是一个纯粹的链表实现,与之前编写的链表程序的实现完全一样(我们的性能高)

private static class Node<E> {

E item;

Node<E> next;

Node<E>prev;​​

Node (Node<E> prev, E element, Node<E> next) {

this.item = element ;

this.next = next;

this.prev = prev;

}

}

Node 前后的节点,这是一个真正的链表实现。

总结:

ArrayList 封装的是一个数组,LinkedList 封装的是一个链表实现,ArrayList 时间复杂度为 1,而 LinkedList 时间复杂度为 n。

总结:

开发之中考虑的就是 ArrayList,如果要考虑性能,一定要传入初始化大小。

上一篇:Linux&shell之高级Shell脚本编程-创建菜单


下一篇:SPRING04_核心组件接口分析Resource、具体实现类、ResourceLoader资源读取器及策略模式(下)