Collections

Collections类

java.utils.Collections是集合工具类,用来对集合进行操作。

常用方法

**void reverse(List list)**:反转

**void swap(List list, int i , int j)**:交换两个索引位置的元素

**void rotate(List list, int distance)**:旋转。当distance为正数时,将list后distance个元素整体移到前面。当distance为负数时,将 list的前distance个元素整体移到后面

public static < T> boolean addAll(Collection< T> c, T… elements) : 往集合中添加一些元素。可以将数组转化为list

1
2
3
4
5
6
Collections.addAll(list,"a","b","c","d","e");
System.out.println(list);//[a, b, c, d, e]

Integer[] num = new Integer[]{1,2,3,4,5,6,7,8,9};
List<Integer> ans = new ArrayList<>();
Collections.addAll(ans,num);

public static void shuffle(List<?> list) 打乱顺序: 打乱集合顺序。

1
2
Collections.shuffle(list);
System.out.println(list);//[b, d, c, a, e], [b, d, c, a, e]

public static < T> void sort(List< T> list):将集合中元素按照默认规则排序

1
2
3
4
5
6
7
ArrayList<Integer> list01 = new ArrayList<>();
list01.add(1);
list01.add(3);
list01.add(2);
System.out.println(list01);//[1, 3, 2]
Collections.sort(list01);//默认是升序
System.out.println(list01);//[1, 2, 3]

public static < T> void sort(List< T> list,Comparator<? super T> ) : 将集合中元素按照指定规则排序。

Comparator的排序规则:

o1-o2:升序

两个对象比较的结果有三种:大于,等于,小于。

  • 如果要按照升序排序,则o1 小于o2,返回(负数),相等返回0,o1大于o2返回(正数)
  • 如果要按照降序排序,则o1 小于o2,返回(正数),相等返回0,o1大于o2返回(负数)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
 ArrayList<Integer> list01 = new ArrayList<>();
list01.add(1);
list01.add(3);
list01.add(2);
System.out.println(list01);//[1, 3, 2]
Collections.sort(list01, new Comparator<Integer>() {
//重写比较的规则
@Override
public int compare(Integer o1, Integer o2) {
//return o1-o2;//升序
return o2-o1;//降序
}
});
System.out.println(list01);

集合与数组转换方法

将集合转为数组

Object[] **toArray()**:直接将 list 转换成 Object[] 类型的 数组

T[] toArray(T[] a):输出指定类型的数组,输出的数组类型与括号中参数类型一致;必须是包装类(String、Integer、Character等),不能是基本数据类型了(string、int、char)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
/ 创建一个list,并且对list赋值    
List<Integer> list = new ArrayList<>();
for (int i = 1; i < 11; i++) {
list.add(i);
}

//方法一:
Object[] ans1 = list.toArray();

//方法二:
//Integer[] ans2 = list.toArray(new Integer[list.size()]);
//toArray方法会在底层比较集合的长度跟数组的长度
//如果集合的长度大于数组的长度,会根据数据的个数重新创建数组
Integer[] ans2 = list.toArray(new Integer[0]);

List转int数组

1
int[] res = 集合名.stream().mapToInt(Integer::valueOf).toArray();

List<int[]> 转换成二维数组int[][]

1
2
3
4
5
6
7
8
9
List<int[]> list = new ArrayList<>();
Collections.addAll(list, new int[]{1,2}, new int[]{3, 4, 5});
int[][] arr = list.toArray(new int[list.size()][0]);

for(int i = 0; i < arr.length; i++){
for(int j = 0; j < arr[i].length; j++){
System.out.println(arr[i][j]);
}
}

数组转集合

int数组转集合List

1
List< Integer > list = Arrays.stream(数组名).boxed().collect(Collectors.toList());

Interger数组转换为List

1
2
Integer[] num = new Integer[]{1,2,3,4,5,6,7,8,9};
List<Integer> list = Arrays.stream(num).collect(Collectors.toList());

Arrays.asList( )

注意该方法的返回值是java.util.Arrays类中一个私有静态内部类java.util.Arrays.ArrayList,它并非java.util.ArrayList类。

java.util.Arrays.ArrayList类具有set(),get(),contains()等方法,但是不支持添加add()或删除remove()方法,调用这些方法会报错。

1
2
3
4
5
6
7
8
//因为list中是包装类。所以数组创建时也需要使用包装类
Integer[] num = new Integer[]{1,2,3,4,5,6,7,8,9};
List<Integer> ans1 = Arrays.asList(num);
//此时得到的list 不能 使用 add() 与 remove()方法;
// 解决办法:
//创建一个新的list 对象,将残缺的list加入进去
List<Integer> list = new ArrayList<>(ans1);
list.add(1);

查找,替换方法

1
2
3
4
5
6
7
8
9
10
11
12
13
int binarySearch(List list, Object key)//对List进行二分查找,返回索引,注意List必须是有序的

int max(Collection coll)//根据元素的自然顺序,返回最大的元素。 类比int min(Collection coll)

int max(Collection coll, Comparator c)//根据定制排序,返回最大元素,排序规则由Comparatator类控制。类比int min(Collection coll, Comparator c)

void fill(List list, Object obj)//用指定的元素代替指定list中的所有元素

int frequency(Collection c, Object o)//统计元素出现次数

int indexOfSubList(List list, List target)//统计target在list中第一次出现的索引,找不到则返回-1,类比int lastIndexOfSubList(List source, list target)

boolean replaceAll(List list, Object oldVal, Object newVal)//用新元素替换旧元素

同步控制

Collections 提供了多个synchronizedXxx()方法·,该方法可以将指定集合包装成线程同步的集合,从而解决多线程并发访问集合时的线程安全问题。

我们知道 HashSetTreeSetArrayList,LinkedList,HashMap,TreeMap 都是线程不安全的。Collections 提供了多个静态方法可以把他们包装成线程同步的集合。

最好不要用下面这些方法,效率非常低,需要线程安全的集合类型时请考虑使用 JUC 包下的并发集合。


Collections
http://example.com/2023/05/13/Java/Java集合/7. Collections/
作者
PALE13
发布于
2023年5月13日
许可协议