Collections类

Java基础类之Collections工具类

一、介绍Collections类

java.util.Collections 类是Java 提供的一个操作 Set、List 和 Map 等集合的工具类,服务于Collection框架,不能实例化。

Collections 类提供了许多操作集合的静态方法,我们借助这些静态方法可以实现集合元素的排序、查找替换和复制等操作。

二、Collections的静态方法

1、两种排序方式(sort)

1、实现了Comparable接口的sort()
1.1、分析
  • 根据元素的 自然顺序 对指定列表按升序进行排序。列表中的所有元素都必须实现 Comparable 接口。

  • 方法:

public static <T extends Comparable<? super T>> void sort(List<T> list)
    
    **参数:**     
		`list` - 要排序的列表。
  • 具有稳定性:不会因调用 sort 方法而对相等的元素进行重新排序。
  • 使用场景
    • 该方法中的泛型都是Comparable接口的子类,即只有是Comparable接口子类类型的数据,才能进行比较排序。如果其他类型的数据要进行比较排序,必须继承Comparable接口并覆写equals()和compareTo()方法。其中如String类、Integer类都是Comparable接口子类,可以进行排序,而基本类型不能进行sort排序。比较项在类内指定。
1.2、分析Comparable接口

此接口中只有一个方法:

public int compareTo(T o);
  • 此接口强行对实现它的每个类的对象进行整体排序。这种排序被称为类的自然排序,类的 compareTo 方法被称为它的自然比较方法
  • 实现此接口的对象列表(和数组)可以通过 Collections.sort(和 Arrays.sort)进行自动排序。
1.3、案例(这里是默认的sort排序方法)
import java.util.ArrayList;
import java.util.Collections;
import java.util.Iterator;
import java.util.List;

public class Demo01 {

	public static void main(String[] args) {
//		String str = "acbACB25186";
        //1、创建list容器
		List<String> list = new ArrayList<String>();
        //2、添加元素进去
		list.add("24");
		list.add("A");
		list.add("H");
		list.add("c");
		list.add("1");
		list.add("Km");
		System.out.println("测试str是否添加到list容器中?");
		for (String string : list) {
			System.out.println(string);
		}
		System.out.println("str已添加到list容器中!");
        //3、调用排序方法
		Collections.sort(list);
		for (String s : list) {
			System.out.print(s+"->");
		}
		
	}

}
1.4、实现Comparable接口进行自定义排序

重写 int compareTo(Object o) 方法。

public class StudentDTO implements Comparable
{
 private String name;
 private int age;
public String getName()
{
 return name;
}
public void setName(String name)
{
  this.name = name;
}
public ObjType getType()
{
 return type;
}
public void setAge(int age)
{
  this.age= age;
}
@Override
public int compareTo(Object o)
{
  StudentDTO sdto = (StudentDTO)o;
  int otherAge = sdto.getAge();
  // note: enum-type's comparation depend on types' list order of enum method
  // so, if compared property is enum-type ,then its comparationfollow ObjEnum.objType order
  return this.age.compareTo(otherAge);
}
}
   主方法:   
public static void main(String[] args)
{
  List<StudentDTO> studentList = new ArrayList();
  StudentDTO s1 = new StudentDTO ();
  s.setName("yuanyuan");
  s.setAge(22);
  studentList.add(s1);
     StudentDTO s1 = new StudentDTO ();
     s.setName("lily");
     s.setAge(23);
     studentList.add(s2);
     Collections.sort(studentList); //按照age升序 22,23,
     Collections.reverse(studentList); //按照age降序 23,22 
}
2、根据指定的比较器(Comparator)产生的顺序排序
2.1、方法
public static <T> void sort(List<T> list,
                            Comparator<? super T> c)
    
     **参数:**     
		`list` - 要排序的列表。     
		 `c` - 确定列表顺序的比较器。 `null` 值指示应该使用元素的 *自然顺序*

场景:

指定比较方式Comparator<? super T> c,即c必须实现Comparator<? super T>接口,覆写compareTo()方法指定比较项目。比较项在类外指定,比较灵活 。

2.2、解释
  • 此列表内的所有元素都必须可使用指定比较器 相互比较(也就是说,对于列表中的任意 e1e2 元素, c.compare(e1, e2) 不得抛出 ClassCastException)。

  • 稳定性:不会因调用 sort 而对相等的元素进行重新排序。

2.3、案例(默认排序方法)

2.4、实现Comparator接口自定义排序

重写int compare(Object o1, Object o2)方法。

public class StudentDTO implements Comparable
{
  private String name;
  private int age;
  public String getName()
  {
   return name;
  }
  public void setName(String name)
 {
   this.name = name;
  }
  public ObjType getType()
  {
   return type;
  }
  public void setAge(int age)
  {
   this.age= age;
  }
} 
   比较器类:
class MyCompartor implements Comparator
{
  @Override
  public int compare(Object o1, Object o2)
 {
   StudentDTO sdto1= (StudentDTO )o1;
   StudentDTO sdto2= (StudentDTO )o2;
   return sdto1.getAge.compareTo(stdo2.getAge())
 }
}
   主方法:
public static void main(String[] args)
{
  List<StudentDTO> studentList = new ArrayList();
  StudentDTO s1 = new StudentDTO ();
  s.setName("yuanyuan");
  s.setAge(22);
  studentList.add(s1);
  StudentDTO s1 = new StudentDTO ();
  s.setName("lily");
  s.setAge(23);
  studentList.add(s2);
  MyComparetor mc = new MyComparetor();
  Collections.sort(studentList,mc);  //按照age升序 22,23,
  Collections.reverse(studentList,mc); //按照age降序 23,22 
}

sort()方法可看一看:https://www.jb51.net/article/116323.htm

数组的排序方法:

String[] names = {"王林", "杨宝", "李镇", "刘迪", "刘波"}; 
Arrays.sort(names, com.ibm.icu.text.Collator.getInstance(com.ibm.icu.util.ULocale.SIMPLIFIED_CHINESE));//升序; 
System.out.println(Arrays.toString(names));  

2、反转方法(reverse)

2.1、reverse方法
public static void reverse(List<?> list)

    参数:
        list - 元素要被反转的列表。 
2.2、解释
反转指定列表中元素的顺序。
此方法以线性时间运行。
2.3、案例
Collections.reverse(list);
		for (String s : list) {
			System.out.print(s+"=>");
		}

三、Collections和Collection的区别

java.util.Collections 是一个包装。它包含有各种有关集合操作的静态多态方法。此类不能实例化,就像一个工具类,服务于Java的Collection框架。

java.util.Collection 是一个集合接口。它提供了对集合对象进行基本操作的通用接口方法。Collection接口在Java 类库中有很多具体的实现。Collection接口的意义是为各种具体的集合提供了最大化的统一操作方式。

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值