List接口常用方法:

    1. package com.CollectionTest;
    2. import com.codeday23.demo01.WindowTest;
    3. import org.junit.Test;
    4. import java.util.ArrayList;
    5. import java.util.Arrays;
    6. import java.util.Collection;
    7. import java.util.List;
    8. public class ClollectionTest1 {
    9. /**
    10. * Collection接口中声明的方法的测试
    11. *
    12. * 向Collection接口的实现类的对象中添加数据obj时,要求obj所在类要重写equals().
    13. *
    14. */
    15. @Test
    16. public void test1(){
    17. Collection coll = new ArrayList();
    18. coll.add(123);
    19. coll.add(456);
    20. coll.add(new String("Tom"));
    21. coll.add(false);
    22. coll.add(new Person("Jerry",20));
    23. // 判断当前集合中是否包含obj
    24. boolean contains = coll.contains(123);
    25. System.out.println(contains);
    26. System.out.println(coll.contains(new String("Tom")));
    27. System.out.println(coll.contains(new Person("Jerry",20)));// 没有重写equals方法是false
    28. //2、containsAll(Collection coll1):形参coll1中的所有元素是否都存在于当前集合中
    29. Collection coll1 = Arrays.asList(123,456);// 返回一个list
    30. System.out.println(coll.containsAll(coll1));
    31. }
    32. @Test
    33. public void test2(){
    34. // 3、remove(Object obj)
    35. Collection coll = new ArrayList();
    36. coll.add(123);
    37. coll.add(456);
    38. coll.add(new String("Tom"));
    39. coll.add(false);
    40. coll.add(new Person("Jerry",20));
    41. System.out.println(coll);
    42. coll.remove(123);
    43. System.out.println(coll);
    44. // 4、removeAll(Collection coll1):从当前集合中一处coll1中所有的元素
    45. Collection coll1 = Arrays.asList(123,456);
    46. coll.removeAll(coll1);
    47. System.out.println(coll);
    48. }
    49. @Test
    50. public void test3(){
    51. Collection coll = new ArrayList();
    52. coll.add(123);
    53. coll.add(456);
    54. coll.add(new String("Tom"));
    55. coll.add(false);
    56. coll.add(new Person("Jerry",20));
    57. // 求交集
    58. Collection coll1 = Arrays.asList(123,456,789);
    59. coll.retainAll(coll1);
    60. System.out.println(coll);
    61. }
    62. @Test
    63. public void test4(){
    64. Collection coll = new ArrayList();
    65. coll.add(123);
    66. coll.add(456);
    67. coll.add(new String("Tom"));
    68. coll.add(false);
    69. coll.add(new Person("Jerry",20));
    70. Collection coll1 = new ArrayList();
    71. coll1.add(123);
    72. coll1.add(456);
    73. coll1.add(new String("Tom"));
    74. coll1.add(false);
    75. coll1.add(new Person("Jerry",20));
    76. // equals(Object obj):对比两个集合是否一样,注意是list里面的对象是有序的,
    77. // 比较时候也会考虑这一点
    78. System.out.println(coll.equals(coll1));
    79. // 返回当前对象的hash值
    80. System.out.println(coll.hashCode());
    81. // 集合--->数组
    82. Object[] arr = coll.toArray();
    83. for (int i = 0; i < arr.length; i++) {
    84. System.out.println(arr[i]);
    85. }
    86. // 拓展:数组-->集合
    87. List<String> list = Arrays.asList(new String[]{"AA", "BB", "CC"});
    88. System.out.println(list);
    89. List<int[]> arr1 = Arrays.asList(new int[]{123, 456});// 这样写的话会被认为是一个元素
    90. List<Integer> arr2 = Arrays.asList(new Integer[]{123, 456});// 包装类会被认为是两个元素
    91. System.out.println(arr1);
    92. System.out.println(arr2);
    93. // iterator():返回Iterator接口的实例,用于遍历集合元素。
    94. }
    95. }

    迭代器:

    1. package com.CollectionTest;
    2. import org.junit.Test;
    3. import java.util.ArrayList;
    4. import java.util.Collection;
    5. import java.util.Iterator;
    6. /**
    7. * 使用Iterator迭代器遍历集合中的元素
    8. */
    9. public class IteratorTest {
    10. @Test
    11. public void test1(){
    12. Collection coll = new ArrayList();
    13. coll.add(123);
    14. coll.add(456);
    15. coll.add(new String("Tom"));
    16. coll.add(false);
    17. coll.add(new Person("Jerry",20));
    18. Iterator iterator = coll.iterator();
    19. // 遍历方式一
    20. // System.out.println(iterator.next());
    21. // System.out.println(iterator.next());
    22. // System.out.println(iterator.next());
    23. // System.out.println(iterator.next());
    24. // System.out.println(iterator.next());
    25. // 遍历方式二:
    26. // for(int i = 0;i < coll.size();i++){
    27. // System.out.println(iterator.next());
    28. // }
    29. // 遍历方式三(推荐):
    30. while(iterator.hasNext()){
    31. // 起始点是-1,下移变成0
    32. System.out.println(iterator.next());
    33. }
    34. }
    35. @Test
    36. public void test2(){
    37. Collection coll = new ArrayList();
    38. coll.add(123);
    39. coll.add(456);
    40. coll.add(new String("Tom"));
    41. coll.add(false);
    42. coll.add(new Person("Jerry",20));
    43. // 错误方式一
    44. // Iterator iterator = coll.iterator();
    45. // while ((iterator.next()) != null){
    46. // System.out.println(iterator.next());
    47. // }
    48. // 每次都要new一个匿名对象,所以会死循环并且一直是第一个
    49. while ((coll.iterator().hasNext())){
    50. System.out.println(coll.iterator().next());
    51. }
    52. }
    53. // 测试迭代器中的remove()方法
    54. @Test
    55. public void test3() {
    56. Collection coll = new ArrayList();
    57. coll.add(123);
    58. coll.add(456);
    59. coll.add(new String("Tom"));
    60. coll.add(false);
    61. coll.add(new Person("Jerry", 20));
    62. // 删除集合中"Tom"这个数组
    63. Iterator iterator = coll.iterator();
    64. while(iterator.hasNext()){
    65. Object obj = iterator.next();// 这里的object只是临时的对象,仅仅是拿来比较的
    66. if ("Tom".equals(obj)){
    67. iterator.remove();// remove()一定是迭代器获取当前的对象才可以调
    68. }
    69. }
    70. //遍历集合
    71. iterator = coll.iterator();
    72. while (iterator.hasNext()){
    73. System.out.println(iterator.next());
    74. }
    75. }
    76. }

    增强for循环:

    1. package com.CollectionTest;
    2. import org.junit.Test;
    3. import java.util.ArrayList;
    4. import java.util.Collection;
    5. /**
    6. * JDK5.0新增了foreach循环,用于遍历集合、数组
    7. */
    8. public class ForTest {
    9. @Test
    10. public void test1(){
    11. Collection coll = new ArrayList();
    12. coll.add(123);
    13. coll.add(456);
    14. coll.add(new String("Tom"));
    15. coll.add(false);
    16. coll.add(new Person("Jerry",20));
    17. // for (集合元素的类型 局部变量 :集合对象)
    18. // 内部还是迭代器
    19. for(Object obj : coll){
    20. System.out.println(obj);
    21. }
    22. }
    23. @Test
    24. public void test2(){
    25. int[] arr = new int[]{1,2,3,4,5,6};
    26. for(int i : arr){
    27. System.out.println(i);
    28. }
    29. }
    30. @Test
    31. public void test3(){
    32. String[] arr = new String[]{"MM","MM","MM"};
    33. // for (int i = 0; i < arr.length;i++) {
    34. // arr[i] = "GG";
    35. // }
    36. //
    37. // for (int i = 0; i < arr.length; i++) {
    38. // System.out.println("普通for循环:"+ arr[i]);
    39. // }
    40. for(String s : arr){
    41. s = "GG";// 这个for循环是先把对象取出来赋值给s,然后再改变s的值来实现的,
    42. // 没有赋值回去,而正常for循环是直接把字符串地址赋值给集合中的对象
    43. }
    44. for (int i = 0; i < arr.length; i++) {
    45. System.out.println("增强for循环:" + arr[i]);
    46. }
    47. }
    48. }

    注意普通for循环和增强for循环运行的差异

    /*
    List接口中三个实现类ArrayList\LinkedLiset\Vector的异同:
    ArrayList是主要实现类,线程不安全,效率高,底层使用Object[]存储
    LinkedList对频繁的插入和删除操作,使用此类比Arraylist高,底层使用双向链表存储
    Vector是古老的实现类,线程安全,效率低,底层使用Object[]

    ArrayList的源码分析:
    jdk7情况下
    ArrayList list = new ArrayList();// 底层创建长度为10的Object[]数组
    List.add(123);// elementData[0] = new Integer(123);

    list.add(11);// 如果此次的添加导致底层elementData数组容量不够,则扩容
    默认情况下扩容到原来长度的1.5倍,同时需要将原来数组中的数据赋值到新的数组中。

    结论:建议开发中使用带参构造器:ArrayList = new ArrayList(int capacity)

    jdk8情况下
    ArrayList list = new ArrayList();// 底层Object[] elementData初始化为{},
    并没有创建初始化的数组。

    list.add(123);// 第一次调用add()时,底层才创建了长度10的数组,并将数据123添加到
    elementData中
    …后续添加和扩容的操作与jdk7无异。

    小结:jdk7类似饿汉式,jdk8类似懒汉式

    LinkList源码分析:
    LinkedList list = new LinkedList();// 内部声明了first和last属性,默认值为null
    list.add(123);// 将123封装到Node中,创建了Node对象。

    其中Node定义为,体现了双向列表的说法:
    private static class Node {
    E item;
    Node next;
    Node prev;

    Node(Node prev, E element, Node next) {
    this.item = element;
    this.next = next;
    this.prev = prev;
    }
    }

    Vector源码分析:两个版本都创建了长度为10的数组,扩容时扩容为两倍

    同:都实现了List的接口,存储的特点相同:存储有序的、可重复的数据
    不同:见上
    /

    List接口方法:
    _void add(int index, Object ele)_:在index位置插入ele元素
    _boolean addAll(int index, Collection eles)_:从index位置开始将eles中 的所有元素添加进来
    _Object get(int index)_:获取指定index位置的元素
    _int indexOf(Object obj)_:返回obj在集合中首次出现的位置
    _int lastIndexOf(Object obj)_:返回obj在当前集合中末次出现的位置
    _Object remove(int index)_:移除指定index位置的元素,并返回此元素
    _Object set(int index, Object ele)_:设置指定index位置的元素为ele
    _List subList(int fromIndex, int toIndex)_:返回从fromIndex到toIndex 位置的子集合

    总结:

    • 增:add()
    • 删:remove()
    • 改:set()
    • 查:get()
    • 插:add(int index)
    • 长度:size()
    • 遍历:

    1)Iterator;
    2)增强for循环;
    3)普通的循环。