当前位置:   article > 正文

JAVA ArrayList,Vector,LinkedList详解(韩顺平)_java linklist vector

java linklist vector

目录

一.ArrayList

1.ArrayList的注意事项

2.ArrayList的底层源码分析

3.代码案例

二.Vector

1.Vector基本介绍

2.源码分析

3.Vector和ArrayList比较

三.LinkedList

1.LinkedList的基本介绍

 2.LinkedList的底层操作

 3.LinkedList的增删改查

4.ArrayList和LinkedList的区别


一.ArrayList

1.ArrayList的注意事项

2.ArrayList的底层源码分析

 

 

3.代码案例

  1. //注意,注意,注意,Idea 默认情况下,Debug 显示的数据是简化后的,如果希望看到完整的数据
  2. //需要做设置.
  3. //使用无参构造器创建ArrayList对象
  4. //ArrayList list = new ArrayList();
  5. ArrayList list = new ArrayList();
  6. //使用for给list集合添加 1-10数据
  7. for (int i = 1; i <= 10; i++) {
  8. list.add(i);
  9. }
  10. //使用for给list集合添加 11-15数据
  11. for (int i = 11; i <= 15; i++) {
  12. list.add(i);
  13. }
  14. list.add(100);
  15. list.add(200);
  16. list.add(null);

二.Vector

1.Vector基本介绍

因为Vector类的操作方法带有synchronized,每一步都要保持线程同步,所以运行速度和ArrayList相比较慢

2.源码分析

  1. //无参构造器
  2. //有参数的构造
  3. Vector vector = new Vector(8);
  4. for (int i = 0; i < 10; i++) {
  5. vector.add(i);
  6. }
  7. vector.add(100);
  8. System.out.println("vector=" + vector);
  9. //1. new Vector() 底层
  10. /*
  11. public Vector() {
  12. this(10);
  13. }
  14. 补充:如果是 Vector vector = new Vector(8);
  15. 走的方法:
  16. public Vector(int initialCapacity) {
  17. this(initialCapacity, 0);
  18. }
  19. 2. vector.add(i)
  20. 2.1 //下面这个方法就添加数据到vector集合
  21. public synchronized boolean add(E e) {
  22. modCount++;
  23. ensureCapacityHelper(elementCount + 1);
  24. elementData[elementCount++] = e;
  25. return true;
  26. }
  27. 2.2 //确定是否需要扩容 条件 : minCapacity - elementData.length>0
  28. private void ensureCapacityHelper(int minCapacity) {
  29. // overflow-conscious code
  30. if (minCapacity - elementData.length > 0)
  31. grow(minCapacity);
  32. }
  33. 2.3 //如果 需要的数组大小 不够用,就扩容 , 扩容的算法
  34. //newCapacity = oldCapacity + ((capacityIncrement > 0) ?
  35. // capacityIncrement : oldCapacity);
  36. //就是扩容两倍.
  37. private void grow(int minCapacity) {
  38. // overflow-conscious code
  39. int oldCapacity = elementData.length;
  40. int newCapacity = oldCapacity + ((capacityIncrement > 0) ?
  41. capacityIncrement : oldCapacity);
  42. if (newCapacity - minCapacity < 0)
  43. newCapacity = minCapacity;
  44. if (newCapacity - MAX_ARRAY_SIZE > 0)
  45. newCapacity = hugeCapacity(minCapacity);
  46. elementData = Arrays.copyOf(elementData, newCapacity);
  47. }
  48. */

3.Vector和ArrayList比较

三.LinkedList

1.LinkedList的基本介绍

 2.LinkedList的底层操作

代码案例

  1. //定义一个Node 类,Node 对象 表示双向链表的一个结点
  2. class Node {
  3. public Object item; //真正存放数据
  4. public Node next; //指向后一个结点
  5. public Node pre; //指向前一个结点
  6. public Node(Object name) {
  7. this.item = name;
  8. }
  9. public String toString() {
  10. return "Node name=" + item;
  11. }
  12. }
  13. //模拟一个简单的双向链表
  14. Node jack = new Node("jack");
  15. Node tom = new Node("tom");
  16. Node hsp = new Node("老韩");
  17. //连接三个结点,形成双向链表
  18. //jack -> tom -> hsp
  19. jack.next = tom;
  20. tom.next = hsp;
  21. //hsp -> tom -> jack
  22. hsp.pre = tom;
  23. tom.pre = jack;
  24. Node first = jack;//first引用指向jack,就是双向链表的头结点
  25. Node last = hsp; //last引用指向hsp,就是双向链表的尾结点
  26. //演示,从头到尾进行遍历
  27. System.out.println("===从头到尾进行遍历===");
  28. while (true) {
  29. if(first == null) {
  30. break;
  31. }
  32. //输出first 信息
  33. System.out.println(first);
  34. first = first.next;
  35. }
  36. //演示,从尾到头的遍历
  37. System.out.println("====从尾到头的遍历====");
  38. while (true) {
  39. if(last == null) {
  40. break;
  41. }
  42. //输出last 信息
  43. System.out.println(last);
  44. last = last.pre;
  45. }
  46. //演示链表的添加对象/数据,是多么的方便
  47. //要求,是在 tom --------- 老韩直接,插入一个对象 smith
  48. //1. 先创建一个 Node 结点,name 就是 smith
  49. Node smith = new Node("smith");
  50. //下面就把 smith 加入到双向链表了
  51. smith.next = hsp;
  52. smith.pre = tom;
  53. hsp.pre = smith;
  54. tom.next = smith;
  55. //first 再次指向jack
  56. first = jack;//first引用指向jack,就是双向链表的头结点
  57. System.out.println("===从头到尾进行遍历===");
  58. while (true) {
  59. if(first == null) {
  60. break;
  61. }
  62. //输出first 信息
  63. System.out.println(first);
  64. first = first.next;
  65. }
  66. last = hsp; //last 重新指向最后一个结点
  67. //演示,从尾到头的遍历
  68. System.out.println("====从尾到头的遍历====");
  69. while (true) {
  70. if(last == null) {
  71. break;
  72. }
  73. //输出last 信息
  74. System.out.println(last);
  75. last = last.pre;
  76. }

 3.LinkedList的增删改查

  1. LinkedList linkedList = new LinkedList();
  2. linkedList.add(1);
  3. linkedList.add(2);
  4. linkedList.add(3);
  5. System.out.println("linkedList=" + linkedList);
  6. //演示一个删除结点的
  7. linkedList.remove(); // 这里默认删除的是第一个结点
  8. //linkedList.remove(2);
  9. System.out.println("linkedList=" + linkedList);
  10. //修改某个结点对象
  11. linkedList.set(1, 999);
  12. System.out.println("linkedList=" + linkedList);
  13. //得到某个结点对象
  14. //get(1) 是得到双向链表的第二个对象
  15. Object o = linkedList.get(1);
  16. System.out.println(o);//999
  17. //因为LinkedList 是 实现了List接口, 遍历方式
  18. System.out.println("===LinkeList遍历迭代器====");
  19. Iterator iterator = linkedList.iterator();
  20. while (iterator.hasNext()) {
  21. Object next = iterator.next();
  22. System.out.println("next=" + next);
  23. }
  24. System.out.println("===LinkeList遍历增强for====");
  25. for (Object o1 : linkedList) {
  26. System.out.println("o1=" + o1);
  27. }
  28. System.out.println("===LinkeList遍历普通for====");
  29. for (int i = 0; i < linkedList.size(); i++) {
  30. System.out.println(linkedList.get(i));
  31. }
  32. //老韩源码阅读.
  33. /* 1. LinkedList linkedList = new LinkedList();
  34. public LinkedList() {}
  35. 2. 这时 linkeList 的属性 first = null last = null
  36. 3. 执行 添加
  37. public boolean add(E e) {
  38. linkLast(e);
  39. return true;
  40. }
  41. 4.将新的结点,加入到双向链表的最后
  42. void linkLast(E e) {
  43. final Node<E> l = last;
  44. final Node<E> newNode = new Node<>(l, e, null);
  45. last = newNode;
  46. if (l == null)
  47. first = newNode;
  48. else
  49. l.next = newNode;
  50. size++;
  51. modCount++;
  52. }
  53. */
  54. /*
  55. 老韩读源码 linkedList.remove(); // 这里默认删除的是第一个结点
  56. 1. 执行 removeFirst
  57. public E remove() {
  58. return removeFirst();
  59. }
  60. 2. 执行
  61. public E removeFirst() {
  62. final Node<E> f = first;
  63. if (f == null)
  64. throw new NoSuchElementException();
  65. return unlinkFirst(f);
  66. }
  67. 3. 执行 unlinkFirst, 将 f 指向的双向链表的第一个结点拿掉
  68. private E unlinkFirst(Node<E> f) {
  69. // assert f == first && f != null;
  70. final E element = f.item;
  71. final Node<E> next = f.next;
  72. f.item = null;
  73. f.next = null; // help GC
  74. first = next;
  75. if (next == null)
  76. last = null;
  77. else
  78. next.prev = null;
  79. size--;
  80. modCount++;
  81. return element;
  82. }
  83. */

4.ArrayList和LinkedList的区别

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/AllinToyou/article/detail/321974
推荐阅读
相关标签
  

闽ICP备14008679号