zoukankan      html  css  js  c++  java
  • 内功心法 -- java.util.LinkedList<E> (3)

    写在前面的话:读书破万卷,编码如有神
    --------------------------------------------------------------------
    下文主要对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>

     

  • 相关阅读:
    ELF静态链接
    linux
    百度图表插件
    秀米(图文编辑)
    Html 助手
    在型原型工具
    AnalyticDB
    H5 (webApi) 接口帮助文档
    H5 拖拽读取文件和文件夹
    mongodb int字段的一个小坑
  • 原文地址:https://www.cnblogs.com/xinhuaxuan/p/6385676.html
Copyright © 2011-2022 走看看