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);
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);
|
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); Collections.sort(list01); System.out.println(list01);
|
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); Collections.sort(list01, new Comparator<Integer>() { @Override public int compare(Integer o1, Integer 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[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
| Integer[] num = new Integer[]{1,2,3,4,5,6,7,8,9}; List<Integer> ans1 = Arrays.asList(num);
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) int max(Collection coll) int max(Collection coll, Comparator c) void fill(List list, Object obj) int frequency(Collection c, Object o) int indexOfSubList(List list, List target) boolean replaceAll(List list, Object oldVal, Object newVal)
|
同步控制
Collections
提供了多个synchronizedXxx()
方法·,该方法可以将指定集合包装成线程同步的集合,从而解决多线程并发访问集合时的线程安全问题。
我们知道 HashSet
,TreeSet
,ArrayList
,LinkedList
,HashMap
,TreeMap
都是线程不安全的。Collections
提供了多个静态方法可以把他们包装成线程同步的集合。
最好不要用下面这些方法,效率非常低,需要线程安全的集合类型时请考虑使用 JUC 包下的并发集合。