目前,我们学习了ArrayList的基本操作和相关方法的练习,这篇,来学习LinkedList,主要是学习LinkedList的相对于ArrayList来说,特有的方法。我们知道,ArrayList底层是基于数组实现,而LinkedList底层是基于链表实现。本篇学习链表的一些特有方法,基本上都和头结点和尾节点操作有关。
1.addFirst()和addLast()
在集合中,按照命名规范,add开头都表示新增元素,addFirst()和addLast()表示在链表的开头和结尾插入元素,下面写一个测试类代码来实现。
package list;
import java.util.LinkedList;
public class Demo6_List {
@SuppressWarnings({"rawtypes", "unchecked" })
public static void main(String[] args) {
LinkedListlist = newLinkedList();
//当前list是空集合,执行addFirst看看有什么效果
list.addFirst("a");
list.addFirst("b");
list.addFirst("c");
System.out.println(list);
System.out.println("---------------");
//当前集合是[c, b, a],下面执行addLast方法
list.addLast("x");
list.addLast("y");
list.addLast("z");
System.out.println(list);
}
}
运行输出:
[c, b, a]
---------------
[c, b, a, x, y, z]
2.getFist()和getLast()
然后,看看查询首尾节点元素的方法。
package list;
import java.util.LinkedList;
public class Demo6_List {
@SuppressWarnings({"rawtypes", "unchecked" })
public static void main(String[] args) {
LinkedListlist= newLinkedList();
list.add("a");
list.add("b");
list.add("c");
list.add("d");
list.add("e");
list.add("f");
//查询头结点元素
Objectobj= list.getFirst();
System.out.println(obj);
//查询尾节点元素
Objectobj1= list.getLast();
System.out.println(obj1);
}
}
输出:
a
f
3.removeFirst() 和removeLast()
连接了新增和查找之后,再看看删除首尾节点元素的方法。
package list;
import java.util.LinkedList;
public class Demo6_List {
@SuppressWarnings({"rawtypes", "unchecked" })
public static void main(String[] args) {
LinkedListlist = newLinkedList();
list.add("a");
list.add("b");
list.add("c");
list.add("d");
list.add("e");
list.add("f");
//删除头结点元素
list.removeFirst();
//删除尾节点元素
list.removeLast();
System.out.println(list);
}
}
输出:[b, c, d, e]
4.get(int index)
根据索引查询节点元素的方法。这个在ArrayList和LinkedList都有这个方法,在根据索引查找元素的时候使用。
package list;
import java.util.LinkedList;
public class Demo6_List {
@SuppressWarnings({ "rawtypes", "unchecked" })
public static void main(String[] args) {
LinkedList list = new LinkedList();
list.add("a");
list.add("b");
list.add("c");
list.add("d");
list.add("e");
list.add("f");
//返回指定索引的元素
Object obj = list.get(2);
System.out.println(obj);
//Object obj1 = list.get(6); //索引越界异常
//System.out.println(obj1);
}
}
输出:C
这里了解下LinkedList中根据索引查找方法底层代码是如何实现。
Node<E> node(int index) {
// assert isElementIndex(index);
if (index < (size >> 1)) {
Node<E> x = first;
for (int i = 0; i < index; i++)
x = x.next;
return x;
} else {
Node<E> x = last;
for (int i = size - 1; i > index; i--)
x = x.prev;
return x;
}
上面的代码,第一个分支判断是,如果索引小于集合size除以2,说明要查找元素在前一半,那么就执行第一个链表的节点开始循环一次去查找,就是从头一直查找对比,直到找到index上的元素。第二个分支是,index在集合后半部分,那么就从尾部节点往前开始循环查找。