都是包含靜態(tài)方法的工具類
Collections類
排序操作
void reverse(List list):反轉(zhuǎn)
void shuffle(List list):隨機(jī)排序
void swap(List list, int i , int j)):交換兩個索引位置的元素
void rotate(List list, int distance)):旋轉(zhuǎn)。當(dāng)distance為正數(shù)時,將list后distance個元素整體移到前面。當(dāng)distance為負(fù)數(shù)時杖们,將 list的前distance個元素整體移到后面枣购。
public static <T extends Comparable<? super T>> void sort(List<T> list)
public static <T> void sort(List<T> list,Comparator<? super T> c)
使用List
時想根據(jù)List
中存儲對象的某一字段進(jìn)行排序潭陪,那么我們要用到Collections.sort
方法對list
排序,用Collections.sort
方法對list
排序有兩種方法:
- 第一種是
list
中的對象實現(xiàn)Comparable
接口赵讯; - 第二種方法是根據(jù)
Collections.sort
重載方法來實現(xiàn)栏赴。
public class SortTest {
public static void main(String[] args) {
List<String> listS = new ArrayList<String>();
List<Employer1> list1 = new ArrayList<Employer1>();
List<Employer2> list2 = new ArrayList<Employer2>();
List<Employer3> list3 = new ArrayList<Employer3>();
//一.將String類型的變量插入到listS中并排序
//listS中的對象String 本身含有compareTo方法蘑斧,所以可以直接調(diào)用sort方法,按自然順序排序须眷,即升序排序
listS.add("5");
listS.add("2");
listS.add("9");
Collections.sort(listS);
//二.將Employer1類的對象插入到list1中并排序
//將已創(chuàng)建的實現(xiàn)了Comparator接口的比較類MyCompare傳入Collections的sort方法中即可實現(xiàn)依照MyCompare類中的比較規(guī)則竖瘾。
Employer1 a1 = new Employer1();
Employer1 b1 = new Employer1();
Employer1 c1 = new Employer1();
a1.setName("a1"); a1.setAge(44);
b1.setName("b1"); b1.setAge(55);
c1.setName("b1"); c1.setAge(33);
list1.add(a1);
list1.add(b1);
list1.add(c1);
//Collections類的sort方法要求傳入的第二個參數(shù)是一個已實現(xiàn)Comparator接口的比較器
Collections.sort(list1, new MyCompare());
//三.將Employer2類的對象插入到list2中并排序
//其實原理和上面的二類似,只是沒有單獨創(chuàng)建MyCompare類花颗,而是用匿名內(nèi)部類來實現(xiàn)Comparator接口里面的具體比較准浴。
Employer2 a2 = new Employer2();
Employer2 b2 = new Employer2();
Employer2 c2 = new Employer2();
a2.setName("a2"); a2.setAge(66);
b2.setName("b2"); b2.setAge(33);
c2.setName("b2"); c2.setAge(22);
list2.add(a2);
list2.add(b2);
list2.add(c2);
//Collections類的sort方法要求傳入的第二個參數(shù)是一個已實現(xiàn)Comparator接口的比較器
Collections.sort(list2,new Comparator<Employer2>(){
@Override
public int compare(Employer2 a2, Employer2 b2) {
return a2.getOrder().compareTo(b2.getOrder());
}
});
//四.將Employer3類的對象插入到list3中并排序
//被排序的類Employer3實現(xiàn)了Comparable接口,在類Employer3中通過重載compareTo方法來實現(xiàn)具體的比較。
Employer3 a3 = new Employer3();
Employer3 b3 = new Employer3();
Employer3 c3 = new Employer3();
a3.setName("a3"); a3.setAge(77);
b3.setName("b3"); b3.setAge(55);
c3.setName("b3"); c3.setAge(99);
list3.add(a3);
list3.add(b3);
list3.add(c3);
Collections.sort(list3);
//Collections類的sort方法要求傳入的List中的對象是已實現(xiàn)Comparable接口的對象
System.out.println(listS);
System.out.println(list1);
System.out.println(list3);
System.out.println(list2);
}
}
class Employer1{
private String name;
private Integer age;
public void setName(String name) {
this.name = name;
}
public Integer getAge() {
return age;
}
public void setAge(Integer age) {
this.age = age;
}
@Override//重載了Object類里的toString方法捎稚,使之可以按照我們要求的格式打印
public String toString() {
return "name is "+name+" age is "+ age;
}
}
class MyCompare implements Comparator<Employer1> {
@Override//重載了Comparator接口里面的compare方法實現(xiàn)具體的比較
public int compare(Employer1 o1, Employer1 o2) {
return o1.getAge().compareTo(o2.getAge());
}
}
class Employer2{
private String name;
private Integer age;
public void setName(String name) {
this.name = name;
}
public Integer getOrder() {
return age;
}
public void setAge(Integer age) {
this.age = age;
}
@Override//重載了Object類里的toString方法,使之可以按照我們要求的格式打印
public String toString() {
return "name is "+name+" age is "+age;
}
}
class Employer3 implements Comparable<Employer3>{
private String name;
private Integer age;
public void setName(String name) {
this.name = name;
}
public Integer getAge() {
return age;
}
public void setAge(Integer age) {
this.age = age;
}
@Override//重載了Object類里的toString方法求橄,使之可以按照我們要求的格式打印
public String toString() {
return "name is "+name+" age is "+age;
}
@Override//重載了Comparable接口里的compareTo方法來實現(xiàn)具體的比較
public int compareTo(Employer3 a) {
return this.age.compareTo(a.getAge());
}
}
compareble接口
Arrays.sort()
方法可對任何實現(xiàn)compareble
接口的對象數(shù)組排序, 像Integer
,String
,這兩種引用類型都實現(xiàn)了compareble
接口今野,所以這兩種類型的數(shù)組都可直接使用Arrays.sort()
進(jìn)行排序
該接口對實現(xiàn)它的每個類的對象強加一個整體排序。這個排序被稱為類的自然排序 罐农,類的
compareTo
方法被稱為其自然比較方法 条霜。
compareTo()
由上面的程序我們可以看出,無論是實現(xiàn)了Comparable
接口的方法還是實現(xiàn)了Comparato
r接口的方法涵亏,最終比較的返回值都是通過compareTo
方法實現(xiàn)的宰睡,故就把compareTo
方法單獨拿出來做個小結(jié)。
compareTo()的返回值是整型气筋,它是先比較對應(yīng)字符的大小(ASCII碼順序)拆内,如果第一個字符和參數(shù)的第一個字符不等,結(jié)束比較宠默,返回他們之間的差值麸恍,如果第一個字符和參數(shù)的第一個字符相等,則以第二個字符和參數(shù)的第二個字符做比較,以此類推抹沪,直至比較的字符或被比較的字符有一方全比較完刻肄,這時就比較字符的長度。例如:
String s1 = "abc";
String s2 = "abcd";
String s3 = "abcdfg";
String s4 = "1bcdfg";
String s5 = "cdfg";
System.out.println( s1.compareTo(s2) ); // -1 (前面相等,s1長度小1)
System.out.println( s1.compareTo(s3) ); // -3 (前面相等,s1長度小3)
System.out.println( s1.compareTo(s4) ); // 48 ("a"的ASCII碼是97,"1"的的ASCII碼是49,所以返回48)
System.out.println( s1.compareTo(s5) ); // -2 ("a"的ASCII碼是97,"c"的ASCII碼是99,所以返回-2)
查找融欧,替換操作
int binarySearch(List list, Object key):對List進(jìn)行二分查找敏弃,返回索引,注意List必須是有序的
int max(Collection coll):根據(jù)元素的自然順序噪馏,返回最大的元素麦到。 類比int min(Collection coll)
int max(Collection coll, Comparator c):根據(jù)定制排序,返回最大元素逝薪,排序規(guī)則由Comparatator類控制隅要。類比int min(Collection coll, Comparator c)
void fill(List list, Object obj):用元素obj填充list中所有元素
int frequency(Collection c, Object o):統(tǒng)計元素出現(xiàn)次數(shù)
int indexOfSubList(List list, List target):統(tǒng)計targe在list中第一次出現(xiàn)的索引,找不到則返回-1董济,類比int lastIndexOfSubList(List source, list target).
boolean replaceAll(List list, Object oldVal, Object newVal):用新元素替換舊元素步清。
同步控制
Collections中幾乎對每個集合都定義了同步控制方法,例如 SynchronizedList(), SynchronizedSet()等方法虏肾,來將集合包裝成線程安全的集合廓啊。
List list = Collections. synchronizedList(new ArrayList());
Set set = Collections. synchronizedSet(new HashSet());
Map map = Collections. synchronizedMap(new HashMap());
Arrays類
該類包含用于操作數(shù)組的各種方法(如排序和搜索)。 該類還包含一個靜態(tài)工廠封豪,可以將數(shù)組視為
List
谴轮。
asList(T... a)
由給定的數(shù)組a,返回一個固定大小的List對象吹埠。在這里第步,著重解釋一下前面這句話的深層含義,我們可以看Arrays類的源碼缘琅,來幫助我們理解粘都。