Collections常用功能
java.utils.Collections是集合工具類肪笋,用來對集合進(jìn)行操作非区。部分方法如下:
public static <T> boolean addAll(Collection<T> c, T... elements):往集合中添加一些元素粗仓。
public static void shuffle(List<?> list) 打亂順序:打亂集合順序。
public static <T> void sort(List<T> list):將集合中元素按照默認(rèn)規(guī)則排序榕暇。
public static <T> void sort(List<T> list蛆封,Comparator<? super T> ):將集合中元素按照指定規(guī)則排序。擴(kuò)展了解就行
1碎捺、Collections集合工具類的方法
addAll 路鹰、 shuffle
package listandset;
import java.util.ArrayList;
import java.util.Collections;
/**
* created by apple on 2020/6/20
*/
public class Demo01Collections {
public static void main(String[] args) {
ArrayList<String> li = new ArrayList<>();
//往集合中添加多個(gè)元素
Collections.addAll(li,"a","b","c","d","e");
System.out.println(li); //[a, b, c, d,e]
//打亂集合中的順序
Collections.shuffle(li);
System.out.println(li); //[a, b, d, e, c]
}
}
2、排序收厨,sort 默認(rèn)的和重寫的 Comparable
package listandset;
/**
* created by apple on 2020/6/20
*/
public class PersonCollections implements Comparable<PersonCollections>{
private String name;
private int age;
public PersonCollections() {
}
public PersonCollections(String name, int age) {
this.name = name;
this.age = age;
}
@Override
public String toString() {
return "PersonCollections{" +
"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;
}
//重寫排序的規(guī)則
@Override
public int compareTo(PersonCollections o) {
// return 0;//認(rèn)為元素都是相同的晋柱,
//自定義比較的規(guī)則,比較兩個(gè)人的年齡(this, 參數(shù)傳過來的Person)
return this.getAge() - o.getAge(); //年齡升序排序
}
}
測試類
package listandset;
import java.util.ArrayList;
import java.util.Collections;
/**
* created by apple on 2020/6/20
* java.util.Collections 是集合工具類诵叁,用來對集合操作
* public static<T> void sort(sort<T> list) 按默認(rèn)規(guī)則排序
*注意:
* sort(sort<T> list) 使用前提雁竞,被排序的集合里邊存儲的元素必須實(shí)現(xiàn)Comparable,重寫接口中的方法compareTo,定義排序的規(guī)則
Comparable 接口的排序規(guī)則:
自己調(diào)用(this) - 參數(shù): 升序。
*/
public class Demo02Collections {
public static void main(String[] args) {
ArrayList<Integer> list = new ArrayList<>();
Collections.addAll(list,1,5,3,9,5);
System.out.println(list);
Collections.sort(list);
//Interer 這個(gè)類黎休,自己重寫了compareTo的方法浓领,所以直接排序
System.out.println(list);
ArrayList<PersonCollections> list03 = new ArrayList<>();
list03.add(new PersonCollections("zhang",18)); //匿名對象
list03.add(new PersonCollections("lisi",20));
list03.add(new PersonCollections("wangw",19));
System.out.println(list03);//[PersonCollections{name='zhang', age=18}, PersonCollections{name='lisi', age=20}, PersonCollections{name='wangw', age=19}]
Collections.sort(list03);
System.out.println(list03);
//[PersonCollections{name='zhang', age=18}, PersonCollections{name='wangw', age=19}, PersonCollections{name='lisi', age=20}]
}
}
輸出:
[1, 5, 3, 9, 5]
[1, 3, 5, 5, 9]
[PersonCollections{name='zhang', age=18}, PersonCollections{name='lisi', age=20}, PersonCollections{name='wangw', age=19}]
[PersonCollections{name='zhang', age=18}, PersonCollections{name='wangw', age=19}, PersonCollections{name='lisi', age=20}]
3玉凯、sort排序。 Comparator接口
package listandset;
/**
* created by apple on 2020/6/20
*/
public class StudentSort {
private String name;
private int age;
public StudentSort() {
}
public StudentSort(String name, int age) {
this.name = name;
this.age = age;
}
@Override
public String toString() {
return "StudentSort{" +
"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;
}
}
測試類
package listandset;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
/**
* created by apple on 2020/6/20
* java.util.Collections 集合工具類联贩。
* public static<T> void sort(sort<T> list漫仆,Comparator<? super T>) 按指定規(guī)則排序
* Comparator 和 Comparable 區(qū)別
* Comparable :自己this和別人(參數(shù))比較,自己需要實(shí)現(xiàn)Comparable接口泪幌,重寫比較的規(guī)則compareTo 方法
* Comparator :找一個(gè)第三方的裁判盲厌,比較兩個(gè)
* Comparator排序規(guī)則:
* o1 - o2 升序,反之降序
*/
public class Demo03Sort {
public static void main(String[] args) {
ArrayList<Integer> list = new ArrayList<>();
Collections.addAll(list,1,5,3,9,5);
System.out.println(list);
Collections.sort(list, new Comparator<Integer>() { // Comparator 一個(gè)接口祸泪,使用匿名內(nèi)部類
//重寫比較的規(guī)則
@Override
public int compare(Integer o1, Integer o2) {
return o1 - o2; //升序排序
}
});
//Interer 這個(gè)類吗浩,自己重寫了compareTo的方法,所以直接排序
System.out.println(list); //[1, 3, 5, 5, 9]
ArrayList<StudentSort> st = new ArrayList<>();
st.add(new StudentSort("li",18));
st.add(new StudentSort("zhang",15));
st.add(new StudentSort("wang",19));
System.out.println(st);
Collections.sort(st, new Comparator<StudentSort>() {
@Override
public int compare(StudentSort o1, StudentSort o2) {
//按照年齡升序排序
return o1.getAge() - o2.getAge();
}
});
System.out.println(st);
}
}
》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》
Collection和Collections之間的使用與區(qū)別(順帶講解Comparable與Comparator區(qū)別)
Collection没隘,它是單列集合類的根接口懂扼,用于存儲一系列符合某種規(guī)則的元素,它主要的子接口分別是List和Set右蒲。
Collections則是集合工具類阀湿,用來對集合進(jìn)行操作」逋可以理解為服務(wù)Collection集合的工具類陷嘴,主要提供一系列靜態(tài)方法實(shí)現(xiàn)對各種集合的搜索、排序间坐、線程安全等操作
文章目錄
1.1
使用代碼如下:
package base;
import java.util.ArrayList;
import java.util.Collections;
/**
* @author duyanyan
* @date 2021/4/29 20:27
* connections 的實(shí)現(xiàn)
*/
public class CollectionsDemo {
public static void main(String[] args) {
ArrayList<Integer> list = new ArrayList<Integer>();
//原來添加寫法
//list.add(233);
//list.add(555);
//list.add(666);
//list.add(7777);
//采用工具類灾挨,完成向集合中添加元素
Collections.addAll(list,1,4,8,9,6);
System.out.println(list);
//排序
Collections.sort(list);
System.out.println(list);
}
}
結(jié)果:
[1, 4, 8, 9, 6]
[1, 4, 6, 8, 9]
代碼測試之后 ,發(fā)現(xiàn)我們的集合按照順序進(jìn)行了排列竹宋,可是這樣的順序是采用默認(rèn)的順序劳澄,如果想要指定順序那該怎么辦呢?
我們發(fā)現(xiàn)還有這個(gè)方法沒有講public static <T> void sort(List<T> list蜈七,Comparator<? super T> ):將集合中元素按照指定規(guī)則排序浴骂。接下來講解一下指定規(guī)則的排列。
1.2 Comparator比較器的使用
研究這個(gè)方法前還是先研究這個(gè)public static <T> void sort(List<T> list)方法先宪潮。
public static <T> void sort(List<T> list):將集合中元素按照默認(rèn)規(guī)則排序溯警。
使用這個(gè)方法存儲字符串類型代碼如下【注意這里是字符串類型】:
package base;
import java.util.ArrayList;
import java.util.Collections;
/**
* @author duyanyan
* @date 2021/4/29 20:32
*/
public class CollectioinsDemo1 {
public static void main(String[] args) {
ArrayList<String> list = new ArrayList<String>();
Collections.addAll(list,"小鹵蛋","小短腿","小魯班","小憨包");
Collections.sort(list);
System.out.println(list);
}
}
結(jié)果:
[小鹵蛋, 小憨包, 小短腿, 小魯班]
我們使用的是默認(rèn)的規(guī)則完成字符串的排序,那么默認(rèn)規(guī)則是怎么定義出來的呢狡相?
說到排序了梯轻,簡單的說就是兩個(gè)對象之間比較大小,那么在JAVA中提供了兩種比較實(shí)現(xiàn)的方式尽棕,
一種是比較死板的采用java.lang.Comparable接口去實(shí)現(xiàn)喳挑,
一種是比較靈活的當(dāng)我需要做排序的時(shí)候在去選擇的java.util.Comparator接口完成。
1.3 分析String源碼
那么我們采用的public static <T> void sort(List<T> list)這個(gè)方法完成的排序,實(shí)際上要求了被排序的類型需要實(shí)現(xiàn)Comparable接口完成比較的功能伊诵,在String類型上如下:
public final class String
implements java.io.Serializable, Comparable<String>, CharSequence {
/** The value is used for character storage. */
String類實(shí)現(xiàn)了這個(gè)Comparable接口(Integer也實(shí)現(xiàn)這接口)单绑,并完成了比較規(guī)則的定義,但是這樣就把這種規(guī)則寫死了曹宴,那比如我想要字符串按照第一個(gè)字符降序排列搂橙,那么這樣就要修改String的源代碼,修改源碼這件事這是不可能的了笛坦!除非你們慫恿博主跑去sun公司修改源碼区转,接著我就刪庫跑路竖般,最后絕壁是挨最毒的打…
那么這個(gè)時(shí)候我們可以使用public static <T> void sort(List<T> list吧享,Comparator<? super T> )方法靈活的完成,這個(gè)里面就涉及到了Comparator這個(gè)接口绍撞,位于位于java.util包下礁芦,排序是comparator能實(shí)現(xiàn)的功能之一,該接口代表一個(gè)比較器蜻韭,比較器具有可比性!顧名思義就是做排序的柿扣,通俗地講需要比較兩個(gè)對象誰排在前誰排在后湘捎,那么比較的方法就是compare,如下:
public int compare(String o1, String o2):比較其兩個(gè)參數(shù)的順序窄刘。
兩個(gè)對象比較的結(jié)果有三種:大于,等于舷胜,小于娩践。
如果要按照升序排序,
則o1 小于o2烹骨,返回(負(fù)數(shù))翻伺,相等返回0,o1大于o2返回(正數(shù))
如果要按照降序排序
則o1 小于o2沮焕,返回(正數(shù))吨岭,相等返回0,o1大于o2返回(負(fù)數(shù))
package base;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
/**
* @author duyanyan
* @date 2021/4/30 10:50
*/
public class CollectionsDemo2 {
public static void main(String[] args) {
ArrayList<String> list = new ArrayList<>();
list.add("cba");
list.add("aba");
list.add("sba");
list.add("nba");
//之前的排序
Collections.sort(list);
System.out.println("sort排序:" + list);
//新的排序方法峦树,按照第一個(gè)單詞的降序
Collections.sort(list, new Comparator<String>() {
@Override
public int compare(String o1, String o2) {
return o2.charAt(0) - o1.charAt(0);
}
});
System.out.println("Comparator接口排序:" + list);
}
}
結(jié)果:
sort排序:[aba, cba, nba, sba]
Comparator接口排序:[sba, nba, cba, aba]
1.4Comparable接口和Comparator接口區(qū)別
Comparable:強(qiáng)行對實(shí)現(xiàn)它的每個(gè)類的對象進(jìn)行整體排序辣辫,這種排序被稱為類的自然排序,類的compareTo方法被稱為它的自然比較方法魁巩,只能在類中實(shí)現(xiàn)compareTo()一次急灭,不能經(jīng)常修改類的代碼實(shí)現(xiàn)自己想要的排序。實(shí)現(xiàn)此接口的對象列表(和數(shù)組)可以通過Collection.sort(和Arrays.sort)進(jìn)行自動排序谷遂,對象可以用作有序映射中的鍵活有序集合中的元素葬馋,無需指定比較器
Comparator強(qiáng)行對某個(gè)對象進(jìn)行整體排序,可以將Comparator傳遞給sort方法(如Collections.sort 或 Arrays.sort),從而允許在排序順序上實(shí)現(xiàn)精確控制畴嘶。還可使用Comparator來控制某些數(shù)據(jù)結(jié)構(gòu)(如有序set無需映射)的順序蛋逾,或者為那些沒有自然順序的對象collection提供排序
總而言之
comparable是需要比較對象來實(shí)現(xiàn)接口,這樣對象調(diào)用實(shí)現(xiàn)的方法來比較窗悯。對對象的耦合度高(需要改變對象的內(nèi)部結(jié)構(gòu)区匣,破壞性大)。
comparator相當(dāng)于一通用的比較工具類接口蟀瞧。需要定制一個(gè)比較類去實(shí)現(xiàn)它沉颂,重寫里面的compare方法,方法的參數(shù)即是需要比較的對象悦污。對象不用做任何改變铸屉。解耦。