Java容器_Arrays和Collections(3)

Arrays

Arrays 提供了处理数组的常用方法,例如打印、排序、二分查找等

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
public class Test {
  public static void main(String[] args) {
    int[] arr = {33, 22, 11, 44, 66, 55};
    System.out.println(Arrays.toString(arr)); //[33, 22, 11, 44, 66, 55]
    Arrays.sort(arr);
    System.out.println(Arrays.toString(arr)); //[11, 22, 33, 44, 55, 66]
    //二分搜索之前要先排序
    //搜索的值存在,返回对应索引,索引从0开始
    System.out.println(Arrays.binarySearch(arr, 33)); //2
    //搜索的值不存在,返回插入点+1的负数,索引从1开始
    System.out.println(Arrays.binarySearch(arr, 88)); //-7,即-(6+1)
  }
}

可以通过 Arrays 的 asList 方法将数组转换为 List

1
2
3
public static <T> List<T> asList(T... a) {
  return new ArrayList<>(a);
}

asList 方法的参数为泛型的可变参数,不能传入基本类型数组,需要传入对应包装类的数组

1
2
3
4
5
6
7
public class Test {
  public static void main(String[] args) {
    Integer[] arr = {1, 2, 3};
    ArrayList<Integer> list = new ArrayList<>(Arrays.asList(arr));
    System.out.println(list);
  }
}

注意,和 java.util.ArrayList 不同,asList 方法转换数组生成的 ArrayList 定义在 Arrays 里面,但没有重写抽象类 AbstractList 中定义的的 add、remove 方法,所以不能进行增删操作,所以才需要通过 new ArrayList() 再包一层,否则会报异常 UnsupportedOperationException

1
2
3
public class Arrays {
  private static class ArrayList<E> extends AbstractList<E>
}
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
public class Test {
  public static void main(String[] args) {
    String[] s = {"a", "b", "c"};
    List<String> list = Arrays.asList(s);
    System.out.println(list); //[a, b, c]
    //list.add("d");
    //list.remove(0);
    System.out.println(list.get(0)); //a
  }
}

相反的,可以通过 List 的 toArray 方法将 List 转换成数组

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
public class Test {
  public static void main(String[] args) {
    ArrayList<String> list = new ArrayList<>();
    list.add("a");
    list.add("b");
    list.add("c");
    //toArray方法返回的数组中元素的类型是Object
    //不能直接对数组进行转型,会报异常ClassCastException
    //[Ljava.lang.Object cannot be cast to [Ljava.lang.String
    //String[] arr = (String[]) list.toArray();
    Object[] arr = list.toArray();
    for (int i = 0; i < arr.length; i++) {
      String s = (String) arr[i];
      System.out.print(s); //abc
    }
  }
}

Collections

常用的有 sort、binarySearch、max、min、reverse、shuffle 方法

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
public class Test {
  public static void main(String[] args) {
    ArrayList<String> list = new ArrayList<>();
    list.add("d");
    list.add("a");
    list.add("b");
    list.add("a");
    //排序
    Collections.sort(list);
    System.out.println(list); //[a, a, b, d]
    //二分搜索之前要先排序
    //搜索的值存在,返回对应索引,索引从0开始
    System.out.println(Collections.binarySearch(list, "b")); //2
    //搜索的值不存在,返回插入点+1的负数,索引从1开始
    System.out.println(Collections.binarySearch(list, "c")); //-4
    //最值
    System.out.println(Collections.max(list)); //d
    System.out.println(Collections.min(list)); //a
    //翻转
    Collections.reverse(list);
    System.out.println(list); //[d, b, a, a]
    //随机置换
    Collections.shuffle(list);
    System.out.println(list);//[b, a, a, d]
  }
}

Collections 也提供了 addAll 方法来将数组转换为 List

1
2
3
4
5
6
7
8
public class Test {
  public static void main(String[] args) {
    Integer[] arr = {1, 2, 3};
    ArrayList<Integer> list = new ArrayList<>(arr.length);
    Collections.addAll(list, arr);
    System.out.println(list); //[1, 2, 3]
  }
}

以上内容是玉山整理的笔记,如有错误还请指出