写在前面的话:读书破万卷,编码如有神
--------------------------------------------------------------------
下文主要对java.util.LinkedList<E>的5个修改操作进行介绍,主要内容包括:
1、LinkedList常用5个修改操作介绍
参考内容:
1、JDK源码(1.7)
--------------------------------------------------------------------
1、LinkedList常用5个修改操作介绍
(1)boolean add(E e)
功能: 将指定元素插入此双端队列的尾部
示例代码:
1 import java.util.LinkedList; 2 3 public class LinkedListDemo { 4 public static void main(String[] args) { 5 /*********测试LinkedList的'boolean add()'方法的使用**********/ 6 7 //创建一个LinkedList对象 8 LinkedList<Student> linkedList = new LinkedList<Student>(); 9 10 //创建一个Student对象,并将其添加到LinkedList对象中 11 Student stu1 = new Student(1,"zhangsan",20); 12 linkedList.add(stu1); 13 System.out.println(linkedList); 14 15 //创建一个Student对象,并将其添加到LinkedList对象中 16 Student stu2 = new Student(2,"lisi",21); 17 linkedList.add(stu2); 18 System.out.println(linkedList); 19 20 //创建一个Student对象,并将其添加到LinkedList对象中 21 Student stu3 = new Student(3,"wangwu",22); 22 linkedList.add(stu3); 23 System.out.println(linkedList); 24 } 25 } 26 27 运行结果: 28 [Student [stuId=1, stuName=zhangsan, stuAge=20]] 29 [Student [stuId=1, stuName=zhangsan, stuAge=20], Student [stuId=2, stuName=lisi, stuAge=21]] 30 [Student [stuId=1, stuName=zhangsan, stuAge=20], Student [stuId=2, stuName=lisi, stuAge=21], Student [stuId=3, stuName=wangwu, stuAge=22]]
源代码如下:
1 /* 2 将指定元素插入此双端队列的尾部 3 */ 4 public boolean add(E e) { 5 //调用内部方法 6 linkLast(e); 7 return true; 8 } 9 10 /* 11 将元素e链接到此双端队列的尾部 12 */ 13 void linkLast(E e) { 14 //引用l指向此双端队列对象的尾节点 15 final Node<E> l = last; 16 //新建一个Node节点 17 final Node<E> newNode = new Node<>(l, e, null); 18 //设置此双端队列对象的last属性指向刚新建的Node节点 19 last = newNode; 20 //如果此双端队列中没有节点存在,则设置此双端队列对象的first属性也指向刚新建的Node节点,否则原来的尾节点的next属性指向刚新建的Node节点 21 if (l == null) 22 first = newNode; 23 else 24 l.next = newNode; 25 //双端队列中节点个数加1 26 size++; 27 //fast-fail机制加1 28 modCount++; 29 }
(2)boolean remove(Object o)
功能: 移除此双端队列中的元素o
示例代码:
1 import java.util.LinkedList; 2 3 public class LinkedListDemo { 4 public static void main(String[] args) { 5 /*********测试LinkedList的'boolean remove(Object o)'方法的使用**********/ 6 7 //创建一个LinkedList对象 8 LinkedList<Student> linkedList = new LinkedList<Student>(); 9 10 //创建一个Student对象,并将其添加到LinkedList对象中 11 Student stu1 = new Student(1,"zhangsan",20); 12 linkedList.add(stu1); 13 System.out.println(linkedList); 14 15 //创建一个Student对象,并将其添加到LinkedList对象中 16 Student stu2 = new Student(2,"lisi",21); 17 linkedList.add(stu2); 18 System.out.println(linkedList); 19 20 //创建一个Student对象,并将其添加到LinkedList对象中 21 Student stu3 = new Student(3,"wangwu",22); 22 linkedList.add(stu3); 23 System.out.println(linkedList); 24 25 26 System.out.println("linkedList.remove(stu2) : "+linkedList.remove(stu2)); 27 System.out.println(linkedList); 28 29 System.out.println("linkedList.remove(null) : "+linkedList.remove(null)); 30 System.out.println(linkedList); 31 } 32 } 33 34 运行结果: 35 [Student [stuId=1, stuName=zhangsan, stuAge=20]] 36 [Student [stuId=1, stuName=zhangsan, stuAge=20], Student [stuId=2, stuName=lisi, stuAge=21]] 37 [Student [stuId=1, stuName=zhangsan, stuAge=20], Student [stuId=2, stuName=lisi, stuAge=21], Student [stuId=3, stuName=wangwu, stuAge=22]] 38 linkedList.remove(stu2) : true 39 [Student [stuId=1, stuName=zhangsan, stuAge=20], Student [stuId=3, stuName=wangwu, stuAge=22]] 40 linkedList.remove(null) : false 41 [Student [stuId=1, stuName=zhangsan, stuAge=20], Student [stuId=3, stuName=wangwu, stuAge=22]]
源代码如下:
1 /* 2 从双端队列中移除对象o 3 */ 4 public boolean remove(Object o) { 5 if (o == null) { 6 //对象o为null时 7 //利用for循环双端队列,查询值为null的节点, 8 for (Node<E> x = first; x != null; x = x.next) { 9 //找到值为null的节点,调用内部方法unlink()进行删除 10 if (x.item == null) { 11 unlink(x); 12 return true; 13 } 14 } 15 } else { 16 //对象o不为null时 17 //利用for循环双端队列,查询值与o对象的值相等的节点 18 for (Node<E> x = first; x != null; x = x.next) { 19 //找到值与o对象的值相等的节点,调用内部方法unlink()进行删除 20 if (o.equals(x.item)) { 21 unlink(x); 22 return true; 23 } 24 } 25 } 26 return false; 27 } 28 29 30 /* 31 删除双端队列中 节点x 32 */ 33 E unlink(Node<E> x) { 34 // assert x != null; 35 //记录x节点的值 36 final E element = x.item; 37 //记录x节点的下一个节点 38 final Node<E> next = x.next; 39 //记录x节点的上一个节点 40 final Node<E> prev = x.prev; 41 42 if (prev == null) { 43 //如果x节点没有上一个节点,则赋值双端队列对象的first属性为next 44 first = next; 45 } else { 46 //如果x节点有上一个节点,则赋值x节点的上一个节点的next属性为next 47 prev.next = next; 48 x.prev = null; 49 } 50 51 if (next == null) { 52 //如果x节点没有下一个节点,则赋值双端队列对象的last属性为prev 53 last = prev; 54 } else { 55 //如果x节点有下一个节点,则赋值x节点的下一个节点的prev属性为prev 56 next.prev = prev; 57 x.next = null; 58 } 59 60 //设置被删除节点的值为null,方便GC 61 x.item = null; 62 //双端队列中元素个数减1 63 size--; 64 //fast-fail机制标识加1 65 modCount++; 66 return element; 67 }
(3)boolean addAll(Collection<? extends E> c)
功能: 将子集合c中的全部插入到此双端队列的尾部
示例代码:
源代码如下:
1 public boolean addAll(Collection<? extends E> c) { 2 //调用方法addAll(size, c) 3 return addAll(size, c); 4 }
(4)boolean addAll(int index, Collection<? extends E> c)
功能: 将子集合c中的全部插入到此双端队列的index开始位置
示例代码:
1 import java.util.LinkedList; 2 3 public class LinkedListDemo { 4 public static void main(String[] args) { 5 /*********测试LinkedList的'boolean addAll(int index, Collection<? extends E> c)'方法的使用**********/ 6 7 //创建一个LinkedList对象 8 LinkedList<Student> linkedList = new LinkedList<Student>(); 9 10 //创建一个Student对象,并将其添加到LinkedList对象中 11 Student stu1 = new Student(1,"zhangsan",20); 12 linkedList.add(stu1); 13 14 //创建一个Student对象,并将其添加到LinkedList对象中 15 Student stu2 = new Student(2,"lisi",21); 16 linkedList.add(stu2); 17 18 //创建一个Student对象,并将其添加到LinkedList对象中 19 Student stu3 = new Student(3,"wangwu",22); 20 linkedList.add(stu3); 21 System.out.println("linkedList:" + linkedList); 22 23 24 //创建一个LinkedList对象 25 LinkedList<Student> linkedList1 = new LinkedList<Student>(); 26 27 //创建一个Student对象,并将其添加到LinkedList对象中 28 Student stu10 = new Student(10,"zhangsan1",20); 29 linkedList1.add(stu10); 30 31 //创建一个Student对象,并将其添加到LinkedList对象中 32 Student stu20 = new Student(20,"lisi2",21); 33 linkedList1.add(stu20); 34 35 //创建一个Student对象,并将其添加到LinkedList对象中 36 Student stu30 = new Student(30,"wangwu3",22); 37 linkedList1.add(stu30); 38 System.out.println("linkedList1:" + linkedList1); 39 40 System.out.println("linkedList1.addAll(2, linkedList) =" + linkedList1.addAll(2, linkedList)); 41 System.out.println("linkedList1:" + linkedList1); 42 } 43 } 44 45 运行结果: 46 linkedList:[Student [stuId=1, stuName=zhangsan, stuAge=20], Student [stuId=2, stuName=lisi, stuAge=21], Student [stuId=3, stuName=wangwu, stuAge=22]] 47 linkedList1:[Student [stuId=10, stuName=zhangsan1, stuAge=20], Student [stuId=20, stuName=lisi2, stuAge=21], Student [stuId=30, stuName=wangwu3, stuAge=22]] 48 linkedList1.addAll(2, linkedList) =true 49 linkedList1:[Student [stuId=10, stuName=zhangsan1, stuAge=20], Student [stuId=20, stuName=lisi2, stuAge=21], Student [stuId=1, stuName=zhangsan, stuAge=20], Student [stuId=2, stuName=lisi, stuAge=21], Student [stuId=3, stuName=wangwu, stuAge=22], Student [stuId=30, stuName=wangwu3, stuAge=22]]
源代码如下:
1 /* 2 将子集合c中的全部元素插入到此双端队列的index开始的位置 3 */ 4 public boolean addAll(int index, Collection<? extends E> c) { 5 //检查插入位置index是否合法 6 checkPositionIndex(index); 7 8 //将待插入的子集合转换成Object数组 9 Object[] a = c.toArray(); 10 //记录待插入子集合中元素的个数 11 int numNew = a.length; 12 //如果待插入子集合中元素的个数为0,则直接返回 13 if (numNew == 0) 14 return false; 15 16 //引用pred指向待插入位置的前一个节点 17 //引用succ指向待插入位置的节点 18 Node<E> pred, succ; 19 if (index == size) { 20 //将子集合插入在双端队列的尾部 21 succ = null; 22 pred = last; 23 } else { 24 //不是将子集合插入在双端队列的尾部 25 //引用succ记录双端队列中index位置上的节点 26 succ = node(index); 27 //引用pred记录双端队列中index位置上的前节点 28 pred = succ.prev; 29 } 30 31 //利用for循环依次将子集合中的元素插入到此双端队列中 32 for (Object o : a) { 33 //新建一个Node节点 34 @SuppressWarnings("unchecked") E e = (E) o; 35 Node<E> newNode = new Node<>(pred, e, null); 36 if (pred == null) 37 first = newNode; 38 else 39 pred.next = newNode; 40 pred = newNode; 41 } 42 43 //重新链接节点 44 if (succ == null) { 45 last = pred; 46 } else { 47 pred.next = succ; 48 succ.prev = pred; 49 } 50 51 //双端队列中元素个数加上numNew 52 size += numNew; 53 //fast-fail机制加1 54 modCount++; 55 return true; 56 }
(5)void clear()
功能: 将此双端队列中的元素节点全部清空
示例代码:
1 import java.util.LinkedList; 2 3 public class LinkedListDemo { 4 public static void main(String[] args) { 5 /*********测试LinkedList的'void clear()'方法的使用**********/ 6 7 //创建一个LinkedList对象 8 LinkedList<Student> linkedList = new LinkedList<Student>(); 9 10 //创建一个Student对象,并将其添加到LinkedList对象中 11 Student stu1 = new Student(1,"zhangsan",20); 12 linkedList.add(stu1); 13 14 //创建一个Student对象,并将其添加到LinkedList对象中 15 Student stu2 = new Student(2,"lisi",21); 16 linkedList.add(stu2); 17 18 //创建一个Student对象,并将其添加到LinkedList对象中 19 Student stu3 = new Student(3,"wangwu",22); 20 linkedList.add(stu3); 21 System.out.println("linkedList:" + linkedList); 22 23 linkedList.clear(); 24 System.out.println("linkedList:" + linkedList); 25 } 26 } 27 28 运行结果: 29 linkedList:[Student [stuId=1, stuName=zhangsan, stuAge=20], Student [stuId=2, stuName=lisi, stuAge=21], Student [stuId=3, stuName=wangwu, stuAge=22]] 30 linkedList:[]
源代码如下:
1 /* 2 将此双端队列中的元素节点全部清空 3 */ 4 public void clear() { 5 //利用for循环从双端队列的头到尾,依次清空 6 for (Node<E> x = first; x != null; ) { 7 Node<E> next = x.next; 8 x.item = null; 9 x.next = null; 10 x.prev = null; 11 x = next; 12 } 13 //将双端队列对象的first、last属性设置为null 14 first = last = null; 15 //将双端队列对象的size设置为0 16 size = 0; 17 //fast-fail机制加1 18 modCount++; 19 }
--------------------------------------------------------------------
java.util.LinkedList<E>系列文章
java.util.LinkedList<E>(1) java.util.LinkedList<E>(2) java.util.LinkedList<E>(3)
java.util.LinkedList<E>(4) java.util.LinkedList<E>(5) java.util.LinkedList<E>(6)
java.util.LinkedList<E>(7) java.util.LinkedList<E>(8)
--------------------------------------------------------------------
相关知识
java.util.Collection<E> java.util.AbstractCollection<E> java.util.List<E>
java.util.AbstractList<E> java.util.Iterator<E> java.util.ListIterator<E>
Java中的标记接口 迭代器模式 Java中的深拷贝和浅拷贝 java.util.Arrays
java.util.Queue<E> java.util.Deque<E>