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、解释
-
此列表内的所有元素都必须可使用指定比较器 相互比较(也就是说,对于列表中的任意
e1
和e2
元素,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接口的意义是为各种具体的集合提供了最大化的统一操作方式。