一. 概述
- Collections类是Java提供的一个操作Set、List、Map等集合的工具类
- Collections 类提供了许多操作集合的静态方法,借助这些静态方法可以实现对集合元素的排序、查找替换和线程安全化等操作
- Collections类中的方法都是静态的
- Collections类中没有构造函数,不能进行实例化
二. 常用方法
1. 排序
/*1. 根据元素的自然顺序对指定List集合的元素按升序进行排序:
List集合中所有元素必须实现Comparable接口;
此方法只适用于List集合
*/
static <T extends Comparable<? super T>> void sort(List<T> list);
/*2. 根据指定比较器的顺序对List集合元素进行排序:
此方法只适用于List集合
*/
static <T> void sort(List<T> list,Comparator<? super T> c);
例子:
import java.util.*;
//字符串长度比较器
class StrLenComparator implements Comparator<String>{
public int compare(String o1, String o2) {
if(o1.length()>o2.length())
return 1;
if(o1.length()<o2.length())
return -1;
return o1.compareTo(o2);
}
}
class CollectionsDemo{
public static void main(String[] args) {
List<String> list=new ArrayList<String>();
list.add("abcd");
list.add("aaa");
list.add("z");
list.add("kkkk");
list.add("qq");
//重复的,list集合可重复
list.add("z");
System.out.println("未进行排序的List集合:"+list);
Collections.sort(list);
System.out.println("按元素自然顺序排序的List集合:"+list);
Collections.sort(list,new StrLenComparator());
System.out.println("按字符串长度比较器进行排序的List集合:"+list);
}
}
运行结果是:
2. 查找最值
/*1. 根据元素的自然顺序,返回集合中的最大元素:
集合中所有元素必须实现Comparable接口;
此方法只适用于Collection集合
*/
static <T exntends Object & Comparable<? super T>> T max(Collection<? extends T> coll);
/*2. 根据指定比较器的顺序,返回集合中的最大元素:
此方法只适用于Collection集合
*/
static <T> T max(Collection<? entends T> coll,Comparator<? super T> comp);
/*3. 根据元素的自然顺序,返回集合中的最小元素:
集合中所有元素必须实现Comparable接口;
此方法只适用于Collection集合
*/
static <T exntends Object & Comparable<? super T>> T min(Collection<? extends T> coll);
/*4. 根据指定比较器的顺序,返回集合中的最小元素:
此方法只适用于Collection集合
*/
static <T> T min(Collection<? entends T> coll,Comparator<? super T> comp);
例子:
import java.util.*;
//字符串长度比较器
class StrLenComparator implements Comparator<String>{
public int compare(String o1, String o2) {
if(o1.length()>o2.length())
return 1;
if(o1.length()<o2.length())
return -1;
return o1.compareTo(o2);
}
}
class CollectionsDemo{
public static void main(String[] args) {
List<String> list=new ArrayList<String>();
list.add("abcd");
list.add("aaa");
list.add("z");
list.add("kkkk");
list.add("qq");
//重复的,list集合可重复
list.add("z");
System.out.println("List集合:"+list);
String max1=Collections.max(list);
System.out.println("按元素自然顺序排序,最大值是:"+max1);
String max2=Collections.max(list,new StrLenComparator());
System.out.println("按字符串长度比较器排序,最大值是:"+max2);
String min1=Collections.min(list);
System.out.println("按元素自然顺序排序,最小值是:"+min1);
String min2=Collections.min(list,new StrLenComparator());
System.out.println("按字符串长度比较器排序,最小值是:"+min2);
}
}
运行结果是:
3. 二分搜索法
/*1. 使用二分搜索法搜索指定的List集合,以获得指定对象在List集合中的索引:
要使该方法可以正常工作,List集合中的元素要先按自然顺序升序排列;
此方法只适用于List集合
*/
static <T> int binarySearch(List<? entends Comparable<? super T>> list,T key);
/*2. 使用二分搜索法搜索指定的List集合,以获得指定对象在List集合中的索引:
要使该方法可以正常工作,List集合中的元素要先按指定比较器进行升序排列;
此方法只适用于List集合
*/
static <T> int binarySearch(List<? extends T> list,T key,Comparator<? super T> c);
例子:
import java.util.*;
//字符串长度比较器
class StrLenComparator implements Comparator<String>{
public int compare(String o1, String o2) {
if(o1.length()>o2.length())
return 1;
if(o1.length()<o2.length())
return -1;
return o1.compareTo(o2);
}
}
class CollectionsDemo{
public static void main(String[] args) {
List<String> list=new ArrayList<String>();
list.add("abcd");
list.add("aaa");
list.add("z");
list.add("kkkk");
list.add("qq");
//重复的,list集合可重复
list.add("z");
System.out.println("List集合:"+list);
int index=Collections.binarySearch(list,"kkkk");
System.out.println("List集合未进行排序,搜索到kkkk的索引是:"+index);
//list集合中的元素按照自然顺序升序
Collections.sort(list);
System.out.println("按元素自然顺序排序的List集合:"+list);
int index1=Collections.binarySearch(list,"kkkk");
System.out.println("List集合先按自然顺序升序排列,搜索到kkkk的索引是:"+index1);
//查找的元素不存在
int index2=Collections.binarySearch(list,"kkk");
System.out.println("搜索的元素kkk在List集合中不存在,返回的索引是:"+index2);
//list集合中的元素按照字符串长度比较器顺序升序
Collections.sort(list,new StrLenComparator());
System.out.println("按字符串长度比较器进行排序的List集合:"+list);
int index3=Collections.binarySearch(list,"aaa",new StrLenComparator());
System.out.println("List集合先按比较器顺序升序排列,搜索到aaa的索引是:"+index3);
}
}
运行结果是:
4. 替换
/*1. 使用指定元素obj替换指定List集合中的所有元素:
此方法只适用于List集合
*/
static <T> void fill(List<? super T> list,T obj);
/*2. 使用一个新值newVal代替List集合中的所有旧值oldVal:
此方法只适用于List集合;
此方法是按着元素替换,List集合中的set(int index,E element)是按着脚标替换
*/
static <T> boolean replaceAll(List<T> list,T odlVal,T newVal);
例子:
import java.util.*;
class CollectionsDemo{
public static void main(String[] args) {
List<String> list1=new ArrayList<String>();
list1.add("abcd");
list1.add("aaa");
System.out.println("list1集合:"+list1);
Collections.fill(list1,"pp");
System.out.println("使用fill方法替换后的list1集合:"+list1);
List<String> list2=new ArrayList<String>();
list2.add("ksk");
list2.add("hjj");
list2.add("weu");
list2.add("lkaf");
//底层使用fill方法,将list2集合中的部分元素替换成指定元素
fillSome(list2,1,2,"pp");
System.out.println("底层使用fill方法替换部分元素后的list2集合:"+list2);
Collections.replaceAll(list2,"ksk","aaa");
System.out.println("使用replaceAll方法替换后的list2集合:"+list2);
}
//将list集合中部分元素替换成指定元素
public static void fillSome(List<String> list,int startIndex,int endIndex,String newVal){
//定义一个新集合
List<String> li=new ArrayList<String>();
for(int x=startIndex,y=startIndex;y<endIndex+1;y++){
//将需要替换的元素添加到新集合中
li.add(list.get(x));
//移除原集合中需要替换的元素
list.remove(x);
}
//新集合中的元素替换成指定元素newVal
Collections.fill(li,newVal);
//将替换后的新元素添加到原集合中
list.addAll(startIndex,li);
}
}
运行结果是:
5. 反转
/*1. 反转指定列表中元素的顺序:
此方法只适用于List集合
*/
static void reverse(List<?> list);
/*2. 返回1个比较器,它对实现Comparable接口的对象集合施加了按自然排序反序的排列
*/
static <T> Comparator<T> reverseOrder();
/*3. 返回1个比较器,它对按指定比较器排序的对象集合施加了按该比较器排序反序的排列
*/
static <T> Comparator<T> reverseOrder(Comparator<T> cmp);
例子:
import java.util.*;
//字符串长度比较器
class StrLenComparator implements Comparator<String>{
public int compare(String o1, String o2) {
if(o1.length()>o2.length())
return 1;
if(o1.length()<o2.length())
return -1;
return o1.compareTo(o2);
}
}
class CollectionsDemo{
public static void main(String[] args) {
List<String> list=new ArrayList<String>();
list.add("abcd");
list.add("aaa");
list.add("zz");
list.add("kkkk");
System.out.println("list1集合:"+list);
//将list进行反转
Collections.reverse(list);
System.out.println("使用reverse方法进行反转后的list集合:"+list);
//将list按照自然排序反序进行排列
Collections.sort(list,Collections.reverseOrder());
System.out.println("使用按自然排序反序的比较器,进行排列后的list集合:"+list);
//将list按照字符串比较器排序反序进行排列
Collections.sort(list,Collections.reverseOrder(new StrLenComparator()));
System.out.println("使用按字符串长度排序反序的比较器,进行排列后的list集合:"+list);
}
}
运行结果是:
6. 洗牌方法
/*将当前集合内的数据进行随机排序:
此方法只适用于List集合
*/
static void shuffle(List<?> list);
例子:
import java.util.*;
class CollectionsDemo{
public static void main(String[] args) {
List<String> list=new ArrayList<String>();
list.add("abcd");
list.add("aaa");
list.add("zz");
list.add("kksskk");
list.add("qq");
list.add("z");
System.out.println("list集合:"+list);
Collections.shuffle(list);
System.out.println("第一次洗牌后的list集合:"+list);
Collections.shuffle(list);
System.out.println("第二次洗牌后的list集合:"+list);
}
}
运行结果是:
7. 交换
/*交换列表中指定位置的元素:
此方法只适用于List集合
*/
static void swap(List<?> list,int i,int j);
例子:
import java.util.*;
class CollectionsDemo{
public static void main(String[] args) {
List<String> list=new ArrayList<String>();
list.add("abcd");
list.add("aaa");
list.add("zz");
list.add("kksskk");
System.out.println("list集合:"+list);
Collections.swap(list,1,2);
System.out.println("交换位置后的list集合:"+list);
}
}
运行结果是: