Collections 工具类
针对 List 集合的方法
排序 sort
如果集合元素为基本数据类型,采用快排;对于集合元素为引用类型,采用归并排序。
//对指定 List 集合的元素按照自然排序
void sort(List<?> list);
//对 List 集合元素根据 Comparator 进行排序
void sort(List<T> list, Comparator<? super T> c);
public static void main(String[] args) {
List<Integer> nums = Arrays.asList(10,-5,20,0).stream().collect(Collectors.toList());
System.out.println(nums); //[10, -5, 20, 0]
//自然排序
Collections.sort(nums);
System.out.println(nums); //[-5, 0, 10, 20]
//自定义排序,降序排列
Collections.sort(nums, (o1, o2) -> o1 < o2 ? 1 : (o1 == o2 ? 0 : -1));
System.out.println(nums); //[20, 10, 0, -5]
}
二分查找 binarySearch
//List 必须是有序的,且按照自然顺序排序
int binarySearch(List<? extends Comparable<? super T>> list, T key);
//List 必须有序,且根据 Comparator 排序
int binarySearch(List<? extends T> list, T key, Comparator<? super T> c);
public static void main(String[] args) {
List<Integer> nums = Arrays.asList(10,-5,20,0).stream().collect(Collectors.toList());
//自然排序
Collections.sort(nums);
System.out.println(nums); //[-5, 0, 10, 20]
//找到元素,直接返回索引
System.out.println(Collections.binarySearch(nums, 10)); //2
//未找到元素,返回 -(最后一次查找位置 + 1)
//最后一次查找位置是元素 10 位置(就是插入位置),索引为 2 ,所以返回 -3
System.out.println(Collections.binarySearch(nums, 1)); //-3
//自定义排序,降序排列
Comparator<Integer> c = (o1, o2) -> o1 < o2 ? 1 : (o1 == o2 ? 0 : -1);
Collections.sort(nums, c);
System.out.println(nums); //[20, 10, 0, -5]
System.out.println(Collections.binarySearch(nums, 10, c)); //1
System.out.println(Collections.binarySearch(nums, 1, c)); //-3
}
反转 reverse
//将 list 集合中元素反转
void reverse(List<?> list);
public static void main(String[] args) {
List<Integer> nums = Arrays.asList(10,-5,20,0).stream().collect(Collectors.toList());
System.out.println(nums); //[10, -5, 20, 0]
//列表反转
Collections.reverse(nums);
System.out.println(nums); //[0, 20, -5, 10]
}
打乱顺序 shuffle
//按照系统自动生成的随机数对 List 顺序打乱(洗牌操作)
void shuffle(List<?> list);
//按照指定的随机数将 List 顺序打乱
void shuffle(List<?> list, Random rnd);
public static void main(String[] args) {
List<Integer> nums = Arrays.asList(10,-5,20,0).stream().collect(Collectors.toList());
System.out.println(nums); //[10, -5, 20, 0]
Collections.shuffle(nums);
System.out.println(nums); //[10, 0, 20, -5]
Collections.shuffle(nums, new Random());
System.out.println(nums); //[0, -5, 10, 20]
}
交换顺序 swap
//将指定 List 集合中的 i 处元素和 j 处元素进行交换
void swap(List<?> list, int i, int j);
public static void main(String[] args) {
List<Integer> nums = Arrays.asList(10,-5,20,0).stream().collect(Collectors.toList());
System.out.println(nums); //[10, -5, 20, 0]
//交换索引 1 和 2 位置的元素
Collections.swap(nums, 1, 2);
System.out.println(nums); //[10, 20, -5, 0]
}
移位 rotate
//当 distance 为正数时,循环右移
//当 distance 为负数时,循环左移
void rotate(List<?> list, int distance);
public static void main(String[] args) {
List<Integer> nums = Arrays.asList(10,-5,20,0).stream().collect(Collectors.toList());
System.out.println(nums); //[10, -5, 20, 0]
//循环右移
Collections.rotate(nums, 1);
System.out.println(nums); //[0, 10, -5, 20]
//循环左移
Collections.rotate(nums, -1);
System.out.println(nums); //[10, -5, 20, 0]
}
填充 fill
//将 list 中的全部元素填充为 obj
void fill(List<? super T> list, T obj);
public static void main(String[] args) {
List<Integer> nums = Arrays.asList(10,-5,20,0).stream().collect(Collectors.toList());
System.out.println(nums); //[10, -5, 20, 0]
Collections.fill(nums, -1);
System.out.println(nums); //[-1, -1, -1, -1]
}
查找子集位置 indexOfSubList/lastIndexOfSubList
//返回指定源列表中第一次出现指定目标列表的起始位置;如果没有出现这样的列表,则返回 -1。
int indexOfSubList(List<?> source, List<?> target);
//返回指定源列表中最后一次出现指定目标列表的起始位置;如果没有出现这样的列表,则返回 -1。
int lastIndexOfSubList(List<?> source, List<?> target);
public static void main(String[] args) {
List<Integer> nums = Arrays.asList(1,2,2,3,3).stream().collect(Collectors.toList());
System.out.println(nums); //[1, 2, 2, 3, 3]
List subList = Arrays.asList(2);
System.out.println(Collections.indexOfSubList(nums, subList)); //1
System.out.println(Collections.lastIndexOfSubList(nums, subList)); //2
}
替换 replaceAll
//使用一个新值替换 List 对象的所有旧值 oldVal。
boolean replaceAll(List<T> list, T oldVal, T newVal);
public static void main(String[] args) {
List<Integer> nums = Arrays.asList(1,2,2,3,3).stream().collect(Collectors.toList());
System.out.println(nums); //[1, 2, 2, 3, 3]
Collections.replaceAll(nums, 2 ,4);
System.out.println(nums); //[1, 4, 4, 3, 3]
}
针对 Collection 集合的方法
求极值 min/max
//自然排序中的最小值和最大值
T min(Collection<? extends T> coll);
T max(Collection<? extends T> coll);
//自定义排序中的最小值和最大值
T min(Collection<? extends T> coll, Comparator<? super T> comp);
T max(Collection<? extends T> coll, Comparator<? super T> comp);
public static void main(String[] args) {
List<Integer> nums = Arrays.asList(10,-5,20,0).stream().collect(Collectors.toList());
System.out.println(Collections.max(nums)); //20
System.out.println(Collections.min(nums)); //-5
//自定义大小
Comparator<Integer> c = (o1, o2) -> o1 < o2 ? 1 : (o1 == o2 ? 0 : -1);
System.out.println(Collections.max(nums, c)); //-5
System.out.println(Collections.min(nums, c)); //20
}
求频率 frequency
//返回指定 collection 中等于指定对象的出现次数。
int frequency(Collection<?> c, Object o);
public static void main(String[] args) {
List<Integer> nums = Arrays.asList(10,-5,-5,0).stream().collect(Collectors.toList());
System.out.println(Collections.frequency(nums, -5)); //2
}
线程同步控制
HashSet,TreeSet,arrayList,LinkedList,HashMap,TreeMap 等集合都是线程不安全的。如果有多个线程访问它们,而且有超过一个的线程试图修改它们,则存在线程安全的问题。Collections 提供了多个静态方法可以把他们包装成线程同步的集合。
//返回指定 collection 支持的同步(线程安全的)collection。
Collection<T> synchronizedCollection(Collection<T> c);
//返回指定列表支持的同步(线程安全的)列表。
List<T> synchronizedList(List<T> list);
//返回由指定映射支持的同步(线程安全的)映射。
Map<K,V> synchronizedMap(Map<K,V> m);
//返回指定 set 支持的同步(线程安全的)set。
Set<T> synchronizedSet(Set<T> s);
public static void main(String[] args) {
//直接将新创建的集合对象传给synchronizedXxx方法
//下面程序创建了4个线程安全的集合对象
Collection c = Collections.synchronizedCollection(new ArrayList());
List list = Collections.synchronizedList(new ArrayList());
Set s = Collections.synchronizedSet(new HashSet());
Map m = Collections.synchronizedMap(new HashMap());
}
设置不可变集合
Collections 提供了上述三种方法来返回一个不可变的集合。上述三类方法的参数是原有的集合对象,返回值是该集合的 "只读" 版本。
//返回一个空的、不可变的集合对象。
Set<T> emptySet()
List<T> emptyList();
Map<K,V> emptyMap();
//返回一个只包含指定对象(只有一个或一个元素)的不可变的集合对象,
Set<T> singleton(T o)
List<T> singletonList(T o);
Map<K,V> singletonMap(K key, V value);
//返回指定集合对象的不可变视图,此处的集合可以是:List,Set,Map。
Set<T> unmodifiableSet(Set<? extends T> s);
List<T> unmodifiableList(List<? extends T> list);
Map<K,V> unmodifiableMap(Map<? extends K, ? extends V> m);
public static void main(String[] args) {
//创建一个空的、不可改变的List对象
List<String> unmodifiableList = Collections.emptyList();
//创建一个只有一个元素,且不可改变的Set对象
Set unmodifiableSet = Collections.singleton("疯狂Java讲义");
//创建一个普通的Map对象
Map scores = new HashMap();
scores.put("语文" , 80);
scores.put("Java" , 82);
//返回普通Map对象对应的不可变版本
Map unmodifiableMap = Collections.unmodifiableMap(scores);
//下面任意一行代码都将引发UnsupportedOperationException异常
unmodifiableList.add("测试元素");
unmodifiableSet.add("测试元素");
unmodifiableMap.put("语文",90);
}
Collections 工具类的更多相关文章
- JAVA Collections工具类sort()排序方法
主要分析内容: 一.Collections工具类两种sort()方法 二.示例 一.Collections工具类两种sort()方法 格式一: public static <T extends ...
- Map集合、HashMap集合、LinkedHashMap集合、Hashtable集合、Collections工具类和模拟斗地主洗牌和发牌
1.Map集合概述和特点 * A:Map接口概述 * 查看API可以知道: * 将键映射到值的对象 * 一个映射不能包含重复的键 * 每个键最多 ...
- Arrays工具类和Collections工具类
集合知识点总结 Arrays工具类 .binarySearch() .sort() .fill() //填充 int[] array = new int[10]; Arrays.fill(array, ...
- day07(Set接口,HashSet类,hashcoad(),Collections工具类,Map集合)
Set接口 set接口的实现类特点 1.无序(取出来的顺序和存进去的数据的顺序不一致) 2.唯一(数据不能存相同的) 底层是用Map集合写的 HashSet类 实现了 set接口 唯一 ...
- 34、Collections工具类简介
Collections工具类简介 就像数组中的Arrays工具类一样,在集合里面也有跟Arrays类似的工具类Collections package com.sutaoyu.Collections; ...
- TreeMap和TreeSet在排序时如何比较元素?Collections工具类中的sort()方法如何比较元素?
TreeSet要求存放的对象所属的类必须实现Comparable接口,该接口提供了比较元素的compareTo()方法,当插入元素时会回调该方法比较元素的大小.TreeMap要求存放的键值对映射的键必 ...
- Java:集合,Collections工具类用法
Collections工具类提供了大量针对Collection/Map的操作,总体可分为四类,都为静态(static)方法: 1. 排序操作(主要针对List接口相关) reverse(List li ...
- Java精选笔记_集合概述(Collection接口、Collections工具类、Arrays工具类)
集合概述 集合有时又称为容器,简单地说,它是一个对象,能将具有相同性质的多个元素汇聚成一个整体.集合被用于存储.获取.操纵和传输聚合的数据. 使用集合的技巧 看到Array就是数组结构,有角标,查询速 ...
- [19/03/27-星期三] 容器_Iterator(迭代器)之遍历容器元素(List/Set/Map)&Collections工具类
一.概念 迭代器为我们提供了统一的遍历容器的方式 /* *迭代器遍历 * */ package cn.sxt.collection; import java.security.KeyStore.Ent ...
- Java集合框架:Collections工具类
java.util.Collections工具类提供非常多实用的方法.使得程序员操作集合类的时候更加的方便easy,这些方法都是静态的. 整个Collections工具类源代码几乎相同有4000行.我 ...
随机推荐
- Mysql错误:#1054 - Unknown column 'id' in 'field list' 解决办法
第一次用mysql,在插入数据时,竟然报这样的错误, #1054 - Unknown column 'id' in 'field list'
- oracle sum()聚合函数
原文链接:https://blog.csdn.net/cizatu5130/article/details/100291347 oracle sum()聚合函数 2016-05-13 20:08:00 ...
- 洛谷P4136 谁能赢呢? 题解 博弈论
题目链接:https://www.luogu.org/problem/P4136 找规律 首先这道题目我没有什么思路,所以一开始想到的是通过搜索来枚举 \(n\) 比较小的时候的情况. 所以我开搜索枚 ...
- 【原生JS】进阶最后一个编程篇(与之前的选项卡不同的做法)
完成效果图: <!DOCTYPE html> <html> <head lang="en"> <meta charset="UT ...
- python命令之m参数
在命令行中使用python时,python支持在其后面添加可选参数. python命令的可选参数有很多,例如:使用可选参数h可以查询python的帮助信息: 可选参数m 下面我们来说说python命令 ...
- Linux中ifcfg-eth0配置参数说明
ifcfg-eth0在/etc/sysconfig/network-scripts下, 其配置如下: DEVICE=物理设备名IPADDR=IP地址NETMASK=掩码值NETWORK=网络地址BRO ...
- Vue导航栏在特定的页面不显示~
最近写vue项目遇到一些问题,我把导航栏组件放在了app.vue中,让他在每个页面都能显示了,但遇到了一个问题,在登录以及注册页面导航栏是不合理不允许存在的 解决方法: 公共模块的内容可以放在App. ...
- C# AddRange 添加位置
有没人想知道, AddRange 添加位置 是哪? 是添加到数组的开始,还是数组的末尾? 假如有一个 代码,看起来是下面的,很简单,把一个 list b 放进list a List<int> ...
- C# 使用汇编
本文告诉大家如何在 C# 里面使用汇编代码 请看 C#嵌入x86汇编--一个GPIO接口的实现 - 云+社区 - 腾讯云 C# inline-asm / 嵌入x86汇编 - 苏璃 - CSDN博客 通 ...
- Javascript中数组方法reduce的妙用之处
Javascript数组方法中,相比map.filter.forEach等常用的迭代方法,reduce常常被我们所忽略,今天一起来探究一下reduce在我们实战开发当中,能有哪些妙用之处,下面从red ...