一、LinkedList实现类
1.概念:Linked意为链表
2.常用方法
1)增:addFirst(E e)、addLast(E e) offer(E e)
offerFirst(E e)、offerLast(E e)
2)删:poll()、pollLast() JDK1.6才有,相比remove提高了代码的健壮性
removeFirst()、removeLast() //remove一般不使用,因为对于空的集合,删除会报错NoSuchElementException,这是JDK1.0就有的老方法
3)改:
4)查:elelment()
getFirst()、getLast()
indexOf(Object o)、LastIndexOf(Object o)
peek()、peekFirst()、peekLast()
5)判断:继承Collection和List
代码应用
package com.rzd.no03collection;
import java.util.Iterator;
import java.util.LinkedList;
public class Demo11 {
public static void main(String[] args) {
//先创建一个LinkedList对象,点进LinkedList源码可以看到这是一个泛型类,所以我们可以给它任意定义一个泛型
LinkedList<String> list = new LinkedList();
//常用方法
System.out.println("增:");
/*1.增:addFirst(E e)、addLast(E e)
offer(E e)、offerFirst(E e)、offerLast(E e)
*/
list.add("aa");
list.add("bb");
list.add("cc");
list.add("bb"); //LinkedList可以添加重复数据
System.out.println(list); //[aa, bb, cc, bb]
//在集合头添加元素:addFirst(E e)、offerFirst(E e)
list.addFirst("first");
System.out.println(list); //[first, aa, bb, cc, bb]
list.offerFirst("offirst"); //[offirst, first, aa, bb, cc, bb, last]
//在集合尾添加元素:addLast(E e)、offer(E e)、offerLast(E e)
list.addLast("last");
System.out.println(list); //[offirst, first, aa, bb, cc, bb, last]
list.offer("off");
System.out.println(list); //[offirst, first, aa, bb, cc, bb, last, off]
list.offerLast("oflast");
System.out.println(list); //[offirst, first, aa, bb, cc, bb, last, off, oflast]
System.out.println("删:");
/*2.删:poll()、pollLast() JDK1.6才有,相比remove提高了代码的健壮性
removeFirst()、removeLast() //remove一般不使用,因为对于空的集合,删除会报错NoSuchElementException,这是JDK1.0就有的老方法
*/
//删除头:poll()、list.pollFirst();
list.poll(); //删除了offirst
System.out.println(list); //[first, aa, bb, cc, bb, last, off, oflast]
System.out.println(list.poll()); //可以返回被删除的元素 first
list.pollFirst();
System.out.println(list); //[bb, cc, bb, last, off, oflast]
list.removeFirst();
System.out.println(list); //[cc, bb, last, off, oflast]
//删除尾:
list.pollLast();
System.out.println(list); //[cc, bb, last, off]
//list.clear(); //清空集合
System.out.println("查:");
/*3.查:elelment()
getFirst()、getLast()
indexOf(Object o)、LastIndexOf(Object o)
peek()、peekFirst()、peekLast()
*/
//遍历LinkedList
//1.普通for循环
for (int i = 0; i < list.size(); i++) {
System.out.println(list.get(i));
}
//2.增强for循环
for (String s:list){
System.out.println(s);
}
//iteractor
Iterator<String> it = list.iterator();
while (it.hasNext()){
System.out.println(it.next());
}
//iteractor的for循环写法,节省内存,因为it1在for循环结束后就自动销毁了,而上面的it要整个方法结束才会结束
for (Iterator<String> it1 = list.iterator();it.hasNext();){
System.out.println(it.next());
}
System.out.println("判断:");
//4.判断
}
}
这里需要注意的是,对于遍历,之前我们写的
Iterator<String> it = list.iterator(); while (it.hasNext()){ System.out.println(it.next()); }
可以有更节省内存的写法,源码中会使用这种写法:
for (Iterator<String> it1 = list.iterator();it.hasNext();){
System.out.println(it.next());
}
二、LinkedList源码分析
1.简要底层原理图
2.源码分析
1)泛型类,E具体的类型在实例化时才会确定
2)size是集合中元素的数量
3)first、last是链表的首节点和尾节点
并且类中有一个内部类Node,定义了一个节点中3个属性item:当前元素内容、next:下一个元素的地址、prev:上一个元素的地址
4)空构造器
5)add()方法,这里的E在实例化的时候确定,并且这个方法添加成功会返回boolean型结果true
linklast()是真正执行添加操作的方法
下面依次添加add(111)、add(222)、add(333)
后面依次类推,代码解析如下
void linkLast(E e) {
final Node<E> l = last; //将链表中的last元素给l,如果是第一个元素,则last=l=null
final Node<E> newNode = new Node<>(l, e, null); //将元素封装为一个Node对象
last = newNode;//将链表中的last节点指向新创建的Node对象,因为这个新创建的肯定是最后一个节点
if (l == null)
first = newNode; //如果是第一个元素,那么链表中的first就指向新创建的这个节点
else
l.next = newNode;//如果不是第一个元素,那么将l的next指向为新创建的这个节点的地址,也就是将上一个元素的next指向了下一个节点的地址
size++; //结合中元素数量+1
modCount++;
}
6)size()方法获得集合中元素数量
7)通过索引得到元素
解析如下
上述源码需要用到的代码
import java.util.LinkedList;
public class Demo12 {
public static void main(String[] args) {
//先创建一个LinkedList对象,点进LinkedList源码可以看到这是一个泛型类,所以我们可以给它任意定义一个泛型
LinkedList<Integer> list = new LinkedList();
list.add(111);
list.add(222);
list.add(333);
list.add(444);
list.add(555);
list.add(666);
System.out.println(list);
list.get(2);
}
}