Java集合体系详解:数据结构ArrayList详解

177 阅读1分钟

数组列表

  • 基于数组实现的容量大小可动态变化的数据结构
  • 可以将很多数组操作的细节封装起来
  • 可以动态扩容,弥补数组固定长度的不足

image.png

ArrayList概述

  • ArrayList可理解为动态可变数组,与Java中的数组相比,最大的区别是数组列表的容量能动态增长
  • 特点:查询效率高,增加删除效率低
  • ArrayListList接口的可变数组实现,实现了List接口
  • ArrayList是线程不安全的
  • Vector类是上古时代的ArrayList,现在已经不推荐使用

ArrayList

  • 如何构造一个ArrayList
    // 如何构造声明ArrayList
    // (1) 不带类型的
    ArrayList list = new ArrayList();

    // (2) 带类型声明 <>里面全部要引用类型 (基本类型要转化成包装类)
    ArrayList<Integer> integerArrayList = new ArrayList<Integer>();

    // (3) 推荐写法
    List<Integer> integerList = new ArrayList<>();
    List<String> stringList = new ArrayList<>();
    List<User> users = new ArrayList<>();
  • 【重要】size/isEmpty/contains方法
    System.out.println("Size: " + integerList2.size());
    System.out.println("Is empty: " + integerList2.isEmpty());
    System.out.println("contains abc: " + integerList2.contains("abc"));
    System.out.println("contains abc: " + integerList2.contains(1));
  • indexOf/lastIndexOf方法
    // indexOf/lastIndexOf
    // indexOf 返回该值在ArrayList出现的第一个index
    System.out.println("Index of 2 in integer list 2: " + integerList2.indexOf(2));
    System.out.println("Index of 3 in integer list 2: " + integerList2.indexOf(3));
    System.out.println("Index of abc in integer list 2: " + integerList2.indexOf("abc"));
    // lastIndexOf 返回该值在ArrayList出现的最后一个index
    System.out.println("Index of 2 in integer list 2: " + integerList2.lastIndexOf(2));
    System.out.println("Index of 3 in integer list 2: " + integerList2.lastIndexOf(3));
    System.out.println("Index of abc in integer list 2: " + integerList2.lastIndexOf("abc"));
  • toArray方法
    // toArray方法,无法确定类型
    Object[] arrays = integerList2.toArray();

    // 可以用foreach将单个元素转为int类型
    for (Object array : arrays) {
        int number = (int) array;
        System.out.println("number in arrays: " + number);
    }

    // 如果new Integer[][]里的数小于integerList2的size,就会将ints的size扩成integerList2的size并拷贝integerList2的元素
    // 如果new Integer[][]里的数大于integerList2的size,就会将ints的size扩成10并拷贝integerList2的元素
    Integer[] ints = integerList2.toArray(new Integer[0]);
    for (int number : ints) {
        System.out.println("int number: " + number);
    }
  • 【重要】get/set/add/remove方法
    // get/add/remove/set
    // get(index) - array[index]
    System.out.println("Element in index 0 :" + integerList2.get(0));

    // 遍历
    for (Integer num : integerList2) {
        System.out.println("Get number: " + num);
    }

    // lambda 遍历
    integerList2.forEach(System.out::println);

    // set(index, value) - array[index] = value
    System.out.println("Index 2 Element before setting: " + integerList2.get(2));
    integerList2.set(2, 20);
    System.out.println("Index 2 Element after setting: " + integerList2.get(2));

    // add(value) 加到最后
    integerList2.add(7);
    System.out.println("Index 5 Element after adding: " + integerList2.get(5));
    // add(index, value) 插入到index,其他后面元素往后移
    integerList2.add(2, 100);
    System.out.println("Index 2 Element after setting: " + integerList2.get(2));
    integerList2.forEach(System.out::println);

    // remove(index)
    Integer toRemove = integerList2.remove(3);
    System.out.println("Remove index 3: " + toRemove);
    // remove(value) value 以对象形式删除
    Boolean isRemove = integerList2.remove(new Integer(2));
    System.out.println("Remove first value 2: " + isRemove);
    integerList2.forEach(System.out::println);
  • clear方法
    // clear
    System.out.println("Size: " + integerList2.size());
    integerList2.clear();
    System.out.println("Size after method clear(): " + integerList2.size());
  • removeAll/retainAll/addAll方法
    List<String> stringList = new ArrayList<>();
    stringList.add("a");
    stringList.add("b");
    stringList.add("A");
    List<String> stringList1 = new ArrayList<>();
    stringList1.add("a");
    stringList1.add("A");
    stringList1.add("z");
    // addAll/removeAll/retainAll

    // containsAll - AbstractCollection实现,并不是在ArrayList里实现
    boolean containsAllResult = stringList.containsAll(stringList1);
    System.out.println("Result of method containsAll: " + containsAllResult);

    // addAll - 加到ArrayList最后
    stringList.addAll(stringList1);
    for (String str : stringList) {
        System.out.println("String Element: " + str);
    }

    // addAll - 加到index位置,后面的元素往后移
    stringList.addAll(1, stringList1);
    for (int i = 0; i < stringList.size(); i++) {
        System.out.println("index: " + i + " String: " + stringList.get(i));
    }

    // removeAll
    Collection stringList3 = new ArrayList<>();
    stringList3.add("a");
    stringList3.add("a"); // 对结果没影响
    stringList3.add("Y");
    stringList3.add("A");
    boolean removeAllResult = stringList.removeAll(stringList3);
    System.out.println("Result of method removeAll: " + removeAllResult);
    for (int i = 0; i < stringList.size(); i++) {
        System.out.println("removeAll Index: " + i + " Element: " + stringList.get(i));
    }

    // retainAll - 类似于交集操作,返回相同的部分
    List<String> stringList4 = new ArrayList<>();
    stringList4.add("a");
    stringList4.add("b");
    stringList4.add("A");
    List<String> stringList5 = new ArrayList<>();
    stringList5.add("a");
    stringList5.add("a");
    stringList5.add("A");
    stringList5.add("z");

    boolean retainAllResult = stringList4.retainAll(stringList5);
    System.out.println("Result of method retainAll: " + retainAllResult);
    for (int i = 0; i < stringList4.size(); i++) {
        System.out.println("retainAll index: " + i + "Element: " + stringList4.get(i));
    }