image.png
    image.png
    image.png

    1. /**
    2. * /----Collection接口:单例集合,用来储存一个一个的对象
    3. * /---List接口:存储有序的,可重复的数据:--->“动态”数组,替换原有的数组
    4. * /---ArrayList 作为List接口的主要实现类:线程不安全的,效率高:底层使用Object[] elementDate存储
    5. * /---LinkedList 对于频繁的插入,删除操作,此类效率比ArrayList效率高:底层使用双向链表存储
    6. * /---Vector 作为List接口的古老实现类:线程安全的,效率低:底层使用Object[] elementDate存储
    7. *
    8. *
    9. *
    10. * ArrayList源码分析:
    11. * jdk 7 情况下
    12. * ArrayList list = new ArrayList();底层创建了长度为10的Object[]数组elementDate
    13. * list.add(123);//elementDate[0] = new Integer(123);
    14. * ...
    15. * list.add(11);如果此次的添加导致底层elementDate数组容量不够,则扩容
    16. * 默认情况下,扩容原来的容量为1.5倍,同时需要将原有数组中的数据赋值到新的数组中
    17. *
    18. * 结论:建议开发中使用带参的构造器ArrayList list = new ArrayList(int capacity)
    19. *
    20. * jdk 8 情况下
    21. * ArrayList list = new ArrayList();//底层Object[] elementData初始化为{},并没有创建长度10的数组
    22. *
    23. * List.add(123);第一次调用add()时,底层才创建了长度10的数组,并将数据123添加到elementDate[0]
    24. * ...
    25. * 后续的添加和扩容操作与jdk 7 无异
    26. *
    27. * 小结:jdk7中的ArrayList的对象的创建类似于单例的饿汉式,
    28. * jdk8中的ArrayList的对象的创建类似于单例的懒汉式,延迟了数组的创建,节省内存。
    29. *
    30. *
    31. * LinkedList的源码的分析
    32. * LinkedList list = new LinkedList();内部声明了Node类型的first和last属性,默认值为null
    33. * List.add(123);//将123封装到Node中,创建了Node对象。
    34. *
    35. * 其中,Node定义体现了LinkedList的双向链表的说法
    36. *
    37. *
    38. * 面试题:ArrayList,LinkedList,Vector三者的异同
    39. * 同:三个类都实现了List接口,存储数据的特点相同:存储是有序的,可重复的数据
    40. * 不同:见上
    41. *
    42. * @author liweisong
    43. * @2021072021/7/615:21
    44. */
    45. public class ListTest {
    46. /*
    47. * void add(int index, Object ele):在index位置插入ele元素
    48. * boolean addAll(int index, Collection eles):从index位置开始将eles中的所有元素添加进来
    49. * Object get(int index):获取指定index位置的元素
    50. * int indexOf(Object obj):返回obj在集合中首次出现的位置
    51. * int lastIndexOf(Object obj):返回obj在当前集合中末次出现的位置
    52. * Object remove(int index):移除指定index位置的元素,并返回此元素
    53. * Object set(int index, Object ele):设置指定index位置的元素为ele
    54. * List subList(int fromIndex, int toIndex):返回从fromIndex到toIndex位置的子集合
    55. *
    56. * 总结:常用方法
    57. * 增:add(Object obj)
    58. * 删: remove(int index)/remove(Object obj)
    59. * 改: set(int index,Object ele)
    60. * 查: get(int index)
    61. * 插: add(int index, Object ele)
    62. * 长度: size()
    63. * 遍历 ①Iterator迭代器方式
    64. * ②增强for循环
    65. * ③普通的循环
    66. */
    67. @Test
    68. public void test3(){
    69. ArrayList list = new ArrayList();
    70. list.add(123);
    71. list.add(456);
    72. list.add("AA");
    73. //方式一:Iterator迭代器方式
    74. Iterator iterator = list.iterator();
    75. while (iterator.hasNext()){
    76. System.out.println(iterator.next());
    77. }
    78. System.out.println("******************************");
    79. //方式二:增强for循环
    80. for (Object obj : list){
    81. System.out.println(obj);
    82. }
    83. System.out.println("******************************");
    84. //方式三:普通for循环
    85. for (int i = 0; i < list.size(); i++) {
    86. System.out.println(list.get(i));
    87. }
    88. }
    89. @Test
    90. public void test1(){
    91. ArrayList list = new ArrayList();
    92. list.add(123);
    93. list.add(456);
    94. list.add("AA");
    95. list.add(new Person("Tom",20));
    96. list.add(456);
    97. System.out.println(list);
    98. //void add(int index, Object ele):在index位置插入ele元素
    99. list.add(0,"李伟松");
    100. System.out.println(list);
    101. //boolean addAll(int index, Collection eles):从index位置开始将eles中的所有元素添加进来
    102. List list1 = Arrays.asList(1, 2, 3);
    103. list.addAll(1,list1);
    104. System.out.println(list);
    105. //Object get(int index):获取指定index位置的元素
    106. System.out.println(list.get(5));
    107. //int indexOf(Object obj):返回obj在集合中首次出现的位置,不存在返回-1
    108. int i = list.indexOf(123);
    109. System.out.println(i);
    110. //int lastIndexOf(Object obj):返回obj在当前集合中末次出现的位置,不存在返回-1
    111. int i1 = list.lastIndexOf(456);
    112. System.out.println(i1);
    113. //Object remove(int index):移除指定index位置的元素,并返回此元素
    114. list.remove(0);
    115. System.out.println(list);
    116. //Object set(int index, Object ele):设置指定index位置的元素为ele
    117. list.set(1, 123);
    118. System.out.println(list);
    119. //List subList(int fromIndex, int toIndex):返回从fromIndex到toIndex位置左闭右开的子集合
    120. List l2 = list.subList(1, 3);
    121. System.out.println(l2);
    122. }
    123. }