Java程序员必备技能:Collections工具类深度解析!
在之前的文章中,我們學習了單列集合的兩大接口及其常用的實現類;在這些接口或實現類中,為我們提供了不少的實用的方法。
本篇文章我們來介紹一種java開發者為我們提供了一個工具類,讓我們更好的來使用集合
Collections 工具類
Collections 是一個操作Set,List,Map等的集合工具類
它提供了一系列靜態的方法對集合元素進行排序、查詢和修改等的操作,還提供了對集合對象設置不可變、對集合對象實現同步控制等方法。
常用功能
通過java的api文檔,可以看到Collections了很多方法,我們在此就挑選幾個常用的功能,為大家演示一下使用:
- public static void shuffle(List<?> list) 打亂順序:打亂集合順序。
- public static
void sort(List list):根據元素的自然順序 對指定列表按升序進行排序 - public static
void sort(List list,Comparator<? super T> ): 根據指定比較器產生的順序對指定列表進行排序。
直接擼代碼:
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
class Person {
private String name;
private int age;
public Person(String name, int age) {
this.name = name;
this.age = age;
}
@Override
public String toString() {
return "Person{" +
"name='" + name + '\'' +
", age=" + age +
'}';
}
}
public class Demo1Collections {
public static void main(String[] args) {
//創建一個List 集合
List<Integer> numbers = new ArrayList<>();
//在這里咱們順便使用下Collections的addAll()方法
Collections.addAll(numbers, 3,34,345,66,22,1);
System.out.println("原集合" + numbers);
//使用排序算法
Collections.sort(numbers);
System.out.println("排序之后"+numbers);
Collections.shuffle(numbers);
System.out.println("亂序之后" + numbers);
//創建一個字符串List 集合
List<String> stringDemo = new ArrayList<>();
stringDemo.add("nihao");
stringDemo.add("hello");
stringDemo.add("wolrd");
stringDemo.add("all");
System.out.println("原集合" + stringDemo);
//使用排序算法
Collections.sort(stringDemo);
System.out.println("排序之后"+stringDemo);
List<Person> people = new ArrayList<>();
people.add(new Person("秋香", 15));
people.add(new Person("石榴姐", 19));
people.add(new Person("唐伯虎", 12));
System.out.println("--" + people);
//如果Person類中,這里報錯了,為什么呢? 在這里埋個伏筆,且看下文
Collections.sort(people);
System.out.println("----" + people);
}
}
Comparable 和 Comparator
Comparable 接口實現集合排序
我們上面代碼最后一個例子,使用了我們自定義的類型,在使用排序時,給我們報錯了?這是為什么呢?整型包裝類和字符串類型,和我們的自定義類型有什么區別?
那我們通過API文檔,看看這個方法,可以看到 根據元素的自然順序 對指定列表按升序進行排序。列表中的所有元素都必須實現 Comparable 接口。此外,列表中的所有元素都必須是可相互比較的。 而Comparable 接口只有一個方法 int compareTo(T o)比較此對象與指定對象的順序。
編程學習,從云端源想開始,課程視頻、在線書籍、在線編程、一對一咨詢……你想要的全部學習資源這里都有,重點是統統免費!點這里即可查看
說的白話一些,就是我們使用自定義類型,進行集合排序的時候,需要實現這個Comparable接口,并且重寫 compareTo(T o)。
public class Person2 implements Comparable<Person2>{
private String name;
private int age;
public Person2(String name, int age) {
this.name = name;
this.age = age;
}
@Override
public String toString() {
return "Person2{" +
"name='" + name + '\'' +
", age=" + age +
'}';
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
@Override
public int compareTo(Person2 o) {
//重寫方法如何寫呢?
// return 0; //默認元素都是相同的
//自定義規則 我們通過person 的年齡進行比較 this 代表本身,而 o 代表傳參的person對象
//這里的比較規則
// ==》 升序 自己 - 別人
// ==》 降序 別人 - 自己
// return this.getAge() - o.getAge(); //升
return o.getAge() - this.getAge(); //降
}
}
public class Demo2Comparable {
public static void main(String[] args) {
List<Person2> people2 = new ArrayList<>();
people2.add(new Person2("秋香", 15));
people2.add(new Person2("石榴姐", 19));
people2.add(new Person2("唐伯虎", 12));
System.out.println("--" + people2);
//這里報錯了,為什么呢?
Collections.sort(people2);
System.out.println("----" + people2);
}
}
Comparator 實現排序
使用Comparable 接口實現排序,是一種比較死板的方式,我們每次都要讓自定義類去實現這個接口,那如果我們的自定義類只是偶爾才會去做排序,這種實現方式,不就很麻煩嗎!所以工具類還為我們提供了一種靈活的排序方式,當我需要做排序的時候,去選擇調用該方法實現
public static <T> void sort(List<T> list, Comparator<? super T> c)
根據指定比較器產生的順序對指定列表進行排序。我們通過案例來看看該方法的使用
public class Person {
private String name;
private int age;
public Person(String name, int age) {
this.name = name;
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
@Override
public String toString() {
return "Person{" +
"name='" + name + '\'' +
", age=" + age +
'}';
}
}
public class Demo3Comparator {
public static void main(String[] args) {
List<Person> people = new ArrayList<>();
people.add(new Person("秋香", 15));
people.add(new Person("石榴姐", 19));
people.add(new Person("唐伯虎", 12));
System.out.println("--" + people);
//第二個參數 采用匿名內部類的方式傳參 - 可以復習之前有關內部類的使用
Collections.sort(people, new Comparator<Person>() {
@Override
public int compare(Person o1, Person o2) {
//這里怎么用呢 自定義按年齡排序
// return 0;
// return o1.getAge() - o2.getAge(); //升序
return o2.getAge() - o1.getAge(); //降序
//結論: 前者 -后者 升序 反之,降序
//這種方式 我們優先使用
}
});
System.out.println("排序后----" + people);
}
}
Comparable 和 Comparator
Comparable: 強行對實現它的每個類的對象進行整體排序。這種排序被稱為類的自然排序,類的compareTo方法被稱為它的自然比較方法。只能在類中實現compareTo()一次,不能經常修改類的代碼實現自己想要的排序。實現此接口的對象列表(和數組)可以通過Collections.sort(和Arrays.sort)進行自動排序,對象可以用作有序映射中的鍵或有序集合中的元素,無需指定比較器。
Comparator: 強行對某個對象進行整體排序。可以將Comparator 傳遞給sort方法(如Collections.sort或 Arrays.sort),從而允許在排序順序上實現精確控制。還可以使用Comparator來控制某些數據結構(如有序set或有序映射)的順序,或者為那些沒有自然順序的對象collection提供排序。
小結
Collections 是 Java 中用于操作集合的工具類,它提供了一系列靜態方法來對集合進行排序、查找、遍歷等操作。在 Java 中,Map 是一種特殊的集合,用于存儲鍵值對數據。雖然 Collections 類的部分方法可以直接操作 Map 的鍵或值的集合視圖,但并不能直接對整個 Map 進行操作。
Collections 類提供了一些靜態方法來對 Map 的鍵或值集合視圖進行操作,比如排序、查找最大值、查找最小值等。例如,Collections.sort 方法可以對 List 類型的集合進行排序,而 List 類型的 map.keySet() 和 map.values() 返回的集合都可以使用這個方法進行排序。同樣地,Collections.max 和 Collections.min 也可以用于獲取集合中的最大值和最小值。
另外,對于整個 Map 的操作,可以直接使用 Map 接口提供的方法進行操作,比如 put、get、remove 等。如果需要對整個 Map 進行操作,一般直接調用 Map 接口提供的方法會更加方便和直觀。
總之,Collections 類主要用于操作集合類(比如 List、Set),而對于 Map 類型的操作,一般直接使用 Map 接口提供的方法即可。
還是老生常談,熟能生巧!多練!happy ending!!
總結
以上是生活随笔為你收集整理的Java程序员必备技能:Collections工具类深度解析!的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 梦见吃冰激凌什么兆头
- 下一篇: 梦见大货车是什么意思