0


Java中list详解

Java中list的详解

一、list

(1)List 是接口,继承至Collection接口(Collection接口下还有个Queue接口,有PriorityQueue类);

(2)List下有ArrayList,Vector,LinkedList

注意:Queue接口与List同一级别,都是继承了Collection接口。LinkedList既可以实现Queue接口,也可以实现List接口.Queue接口窄化了对LinkedList的方法的访问权限(即在方法中的参数类型如果是Queue时,就完全只能访问Queue接口所定义的方法 了,而不能直接访问 LinkedList的非Queue的方法)。

二、list详解

1)ArrayList

ArrayList的实现原理

  1. /*
  2. ArrayList继承AbstractList类,
  3. 实现了List和RandomAccess,Cloneable, Serializable接口,
  4. 底层是基于动态的数组。
  5. 底层使用数组实现,默认初始容量为10.
  6. 当超出后,会自动扩容为原来的1.5倍,即自动扩容机制。
  7. List list = Collections.synchronizedList(new ArrayList(...))
  8. //即可线程安全。
  9. // 利用ArrayList类实例化List集合
  10. List<String> list = new ArrayList<String>();
  11. */import java.util.*;publicclassArrayListExamples{publicstaticvoidmain(String args[]){// 创建一个空的数组链表对象list,list用来存放String类型的数据
  12. ArrayList<String> list =newArrayList<String>();// 增加元素到list对象中
  13. list.add("Item1");
  14. list.add("Item2");
  15. list.add(2,"Item3");// 此条语句将会把“Item3”字符串增加到list的第3个位置。
  16. list.add("Item4");// 显示数组链表中的内容
  17. System.out.println("The arraylist contains the following elements: "+ list);// 检查元素的位置int pos = list.indexOf("Item2");
  18. System.out.println("The index of Item2 is: "+ pos);// 检查数组链表是否为空boolean check = list.isEmpty();
  19. System.out.println("Checking if the arraylist is empty: "+ check);// 获取链表的大小int size = list.size();
  20. System.out.println("The size of the list is: "+ size);// 检查数组链表中是否包含某元素boolean element = list.contains("Item5");
  21. System.out.println("Checking if the arraylist contains the object Item5: "+ element);// 获取指定位置上的元素
  22. String item = list.get(0);
  23. System.out.println("The item is the index 0 is: "+ item);// 遍历arraylist中的元素// 第1种方法: 循环使用元素的索引和链表的大小
  24. System.out.println("Retrieving items with loop using index and size list");for(int i =0; i < list.size(); i++){
  25. System.out.println("Index: "+ i +" - Item: "+ list.get(i));}// 第2种方法:使用foreach循环
  26. System.out.println("Retrieving items using foreach loop");for(String str : list){
  27. System.out.println("Item is: "+ str);}// 第三种方法:使用迭代器// hasNext(): 返回true表示链表链表中还有元素// next(): 返回下一个元素
  28. System.out.println("Retrieving items using iterator");for(Iterator<String> it = list.iterator(); it.hasNext();){
  29. System.out.println("Item is: "+ it.next());}// 替换元素
  30. list.set(1,"NewItem");
  31. System.out.println("The arraylist after the replacement is: "+ list);// 移除元素// 移除第0个位置上的元素
  32. list.remove(0);// 移除第一次找到的 "Item3"元素
  33. list.remove("Item3");
  34. System.out.println("The final contents of the arraylist are: "+ list);// 转换 ArrayList 为 Array
  35. String[] simpleArray = list.toArray(newString[list.size()]);
  36. System.out
  37. .println("The array created after the conversion of our arraylist is: "+ Arrays.toString(simpleArray));}}

ArrayList的优缺点

优点:底层数据结构是数组,查询快,增删慢。

缺点: 线程不安全,效率高

2)LinkedList

LinkedList的实现原理

  1. /*
  2. LinkedList继承AbstractList类,
  3. 实现了List,Serializable,Queue接口,
  4. LinkedList是通过双向链表去实现的,
  5. 既然是链表实现那么它的随机访问效率比ArrayList要低,
  6. 顺序访问的效率要比较的高。
  7. 每个节点都有一个前驱(之前前面节点的指针)
  8. 一个后继(指向后面节点的指针)。
  9. // 利用LinkedList类实例化List集合
  10. List<String> list = new LinkedList<String>();
  11. */import java.util.List;import java.util.Iterator;import java.util.LinkedList;import java.util.NoSuchElementException;/*
  12. * @desc LinkedList测试程序。
  13. *
  14. * @author skywang
  15. * @email kuiwu-wang@163.com
  16. */publicclassLinkedListTest{publicstaticvoidmain(String[] args){// 测试LinkedList的APItestLinkedListAPIs();// 将LinkedList当作 LIFO(后进先出)的堆栈useLinkedListAsLIFO();// 将LinkedList当作 FIFO(先进先出)的队列useLinkedListAsFIFO();}/*
  17. * 测试LinkedList中部分API
  18. */privatestaticvoidtestLinkedListAPIs(){
  19. String val = null;//LinkedList llist;//llist.offer("10");// 新建一个LinkedList
  20. LinkedList llist =newLinkedList();//---- 添加操作 ----// 依次添加1,2,3
  21. llist.add("1");
  22. llist.add("2");
  23. llist.add("3");// 将“4”添加到第一个位置
  24. llist.add(1,"4");
  25. System.out.println("\nTest \"addFirst(), removeFirst(), getFirst()\"");// (01) 将“10”添加到第一个位置。 失败的话,抛出异常!
  26. llist.addFirst("10");
  27. System.out.println("llist:"+llist);// (02) 将第一个元素删除。 失败的话,抛出异常!
  28. System.out.println("llist.removeFirst():"+llist.removeFirst());
  29. System.out.println("llist:"+llist);// (03) 获取第一个元素。 失败的话,抛出异常!
  30. System.out.println("llist.getFirst():"+llist.getFirst());
  31. System.out.println("\nTest \"offerFirst(), pollFirst(), peekFirst()\"");// (01) 将“10”添加到第一个位置。 返回true。
  32. llist.offerFirst("10");
  33. System.out.println("llist:"+llist);// (02) 将第一个元素删除。 失败的话,返回null。
  34. System.out.println("llist.pollFirst():"+llist.pollFirst());
  35. System.out.println("llist:"+llist);// (03) 获取第一个元素。 失败的话,返回null。
  36. System.out.println("llist.peekFirst():"+llist.peekFirst());
  37. System.out.println("\nTest \"addLast(), removeLast(), getLast()\"");// (01) 将“20”添加到最后一个位置。 失败的话,抛出异常!
  38. llist.addLast("20");
  39. System.out.println("llist:"+llist);// (02) 将最后一个元素删除。 失败的话,抛出异常!
  40. System.out.println("llist.removeLast():"+llist.removeLast());
  41. System.out.println("llist:"+llist);// (03) 获取最后一个元素。 失败的话,抛出异常!
  42. System.out.println("llist.getLast():"+llist.getLast());
  43. System.out.println("\nTest \"offerLast(), pollLast(), peekLast()\"");// (01) 将“20”添加到第一个位置。 返回true。
  44. llist.offerLast("20");
  45. System.out.println("llist:"+llist);// (02) 将第一个元素删除。 失败的话,返回null。
  46. System.out.println("llist.pollLast():"+llist.pollLast());
  47. System.out.println("llist:"+llist);// (03) 获取第一个元素。 失败的话,返回null。
  48. System.out.println("llist.peekLast():"+llist.peekLast());// 将第3个元素设置300。不建议在LinkedList中使用此操作,因为效率低!
  49. llist.set(2,"300");// 获取第3个元素。不建议在LinkedList中使用此操作,因为效率低!
  50. System.out.println("\nget(3):"+llist.get(2));// ---- toArray(T[] a) ----// 将LinkedList转行为数组
  51. String[] arr =(String[])llist.toArray(newString[0]);for(String str:arr)
  52. System.out.println("str:"+str);// 输出大小
  53. System.out.println("size:"+llist.size());// 清空LinkedList
  54. llist.clear();// 判断LinkedList是否为空
  55. System.out.println("isEmpty():"+llist.isEmpty()+"\n");}/**
  56. * 将LinkedList当作 LIFO(后进先出)的堆栈
  57. */privatestaticvoiduseLinkedListAsLIFO(){
  58. System.out.println("\nuseLinkedListAsLIFO");// 新建一个LinkedList
  59. LinkedList stack =newLinkedList();// 将1,2,3,4添加到堆栈中
  60. stack.push("1");
  61. stack.push("2");
  62. stack.push("3");
  63. stack.push("4");// 打印“栈”
  64. System.out.println("stack:"+stack);// 删除“栈顶元素”
  65. System.out.println("stack.pop():"+stack.pop());// 取出“栈顶元素”
  66. System.out.println("stack.peek():"+stack.peek());// 打印“栈”
  67. System.out.println("stack:"+stack);}/**
  68. * 将LinkedList当作 FIFO(先进先出)的队列
  69. */privatestaticvoiduseLinkedListAsFIFO(){
  70. System.out.println("\nuseLinkedListAsFIFO");// 新建一个LinkedList
  71. LinkedList queue =newLinkedList();// 将10,20,30,40添加到队列。每次都是插入到末尾
  72. queue.add("10");
  73. queue.add("20");
  74. queue.add("30");
  75. queue.add("40");// 打印“队列”
  76. System.out.println("queue:"+queue);// 删除(队列的第一个元素)
  77. System.out.println("queue.remove():"+queue.remove());// 读取(队列的第一个元素)
  78. System.out.println("queue.element():"+queue.element());// 打印“队列”
  79. System.out.println("queue:"+queue);}}

LinkedList的优缺点

优点:底层数据结构是链表,查询慢,增删快。

缺点: 线程不安全,效率高

3)Vector

Vector的实现原理

在ArrayList中每个方法中添加了synchronized关键字来保证同步。

  1. //例子:import java.util.Vector;import java.lang.*;import java.util.Enumeration;publicclassVectorApp{publicstaticvoidmain(String args[]){
  2. Vector v1 =newVector();
  3. Integer integer1=newInteger(1);//加入为字符串对象
  4. v1.addElement("one");//加入的为integer的对象
  5. v1.addElement(integer1);
  6. v1.addElement(integer1);
  7. v1.addElement("two");
  8. v1.addElement(newInteger(2));
  9. v1.addElement(integer1);
  10. v1.addElement(integer1);//转为字符串并打印
  11. System.out.println("The Vector v1 is:\n\t"+v1);//向指定位置插入新对象
  12. v1.insertElementAt("three",2);
  13. v1.insertElementAt(newFloat(3.9),3);
  14. System.out.println("The Vector v1(used method
  15. insertElementAt()is:\n\t)"+v1);//将指定位置的对象设置为新的对象//指定位置后的对象依次往后顺延
  16. v1.setElementAt("four",2);
  17. System.out.println("The vector v1 cused method setElmentAt()is:\n\t"+v1);
  18. v1.removeElement(integer1);//从向量对象v1中删除对象integer1//由于存在多个integer1,所以从头开始。//找删除找到的第一个integer1.
  19. Enumeration enum= v1.elements();
  20. System.out.println("The vector v1 (used method removeElememt()is");while(enum.hasMoreElements())
  21. System.out.println(enum.nextElement()+"");
  22. System.out.println();//使用枚举类(Enumeration)的方法取得向量对象的每个元素。
  23. System.out.println("The position of Object1(top-to-botton):"+v1.indexOf(integer1));
  24. System.out.println("The position of Object1(tottom-to-top):"+v1.lastIndexOf(integer1));//按不同的方向查找对象integer1所处的位置
  25. v1.setSize(4);
  26. System.out.println("The new Vector(resized the vector)is:"+v1);//重新设置v1的大小,多余的元素被抛弃}}

Vector的优缺点

优点:底层数据结构是数组,查询快,增删慢。

缺点:线程安全,效率低

4)三种list的使用

对数组查询次数多:ArrayList

对数组修改次数多:LinkedList

数组需要更加安全:Vector

数组不需要更加安全:ArrayList或者LinkedList

当需要使用list时,对使用具体哪个list不确定:ArrayList

总结: ArrayList是基于动态的数组的数据结构 LinkedList是基于链表的数据结构

标签: java

本文转载自: https://blog.csdn.net/qq_52340851/article/details/111183551
版权归原作者 一个刚刚入水的小学员 所有, 如有侵权,请联系我们删除。

“Java中list详解”的评论:

还没有评论