开发者学堂课程【【名师课堂】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,最好的方法就是设置初始化的大小(分页程序为例,每次只会取出指定行的内容)。
构造方法:
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 初始化常数,还入了一个大小过去,那么它的数组大小就是由外部决定,如果没有传入大小就是默认一个数组。
是一个纯粹的链表实现,与之前编写的链表程序的实现完全一样(我们的性能高)
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,如果要考虑性能,一定要传入初始化大小。