一.比較器Comparable和Comparator
上一篇博客介紹了工具類Arrays工具類。我們可以對基本類型的數(shù)組調用Arrays.sort()函數(shù)來進行數(shù)組的排序真朗。排序操作在日常開發(fā)中經常要使用到雌团。那么String類和自定義類能不能使用Arrays.sort()來進行排序呢燃领。下面我們來試試,如下:
Java代碼
publicclassMystring {
publicstaticvoidmain(String[] args) {
String []a={"早上","中午","下午","傍晚","晚上"};
Person[] b={newPerson("小白",15),newPerson("小黑",19),
newPerson("小紅",14),newPerson("小紫",20)};
Arrays.sort(a);
for(inti=0;i
System.out.print(a[i]);
System.out.print("\r\n");
Arrays.sort(b);
for(inti=0;i
System.out.println(b[i]);
}
}
//自定義類
classPerson {
publicString name;
publicintage;
publicPerson(String name,intage) {
this.name=name;
this.age=age;
}
}
程序運行結果:
我們發(fā)現(xiàn)String可以調用Arrays.sort()函數(shù)锦援,而我們自定義的Person類報錯猛蔽,看錯誤的關鍵字Comparable
打開String源碼
由此引入比較器Comparable,我們下面利用Comparable接口來實現(xiàn)Person使用Arrays.sort()按年齡排序遞增排序灵寺。
Comparable接口能夠對實現(xiàn)它的類的對象進行排序曼库,主要使用compareTo函數(shù)來實現(xiàn)排序。compareTo函數(shù)返回int類型略板,分別返回-1,0,1對應小于毁枯,等于,大于叮称。
把代碼改為:
Java代碼
publicclassMystring {
publicstaticvoidmain(String[] args) {
String []a={"早上","中午","下午","傍晚","晚上"};
Person[] b={newPerson("小白",15),newPerson("小黑",19),
newPerson("小紅",14),newPerson("小紫",20)};
Arrays.sort(a);
for(inti=0;i
System.out.print(a[i]);
System.out.print("\r\n");
Arrays.sort(b);
for(inti=0;i
System.out.println(b[i]);
}
}
//自定義類
classPersonimplementsComparable{
publicString name;
publicintage;
publicPerson(String name,intage) {
this.name=name;
this.age=age;
}
//比較器的比較函數(shù)
/**
* 如果當前對象小于比較對象种玛,返回-1
* 如果當前對象等于比較對象,返回0
* 如果當前對象大于比較對象瓤檐,返回1
*/
@Override
publicintcompareTo(Person o) {
//對象為空赂韵,拋出空指針異常
if(o==null)
thrownewNullPointerException();
if(this.age
return-1;
if(this.age>o.age)
return1;
return0;
}
//重寫toString方法
@Override
publicString toString() {
return"Person [name="+ name +", age="+ age +"]";
}
}
運行結果:
為自定義的Person實現(xiàn)比較器Comparable接口,即可調用Arrays.sort()進行排序挠蛉。
另外還有另一種實現(xiàn)方法祭示,實現(xiàn)Comparator接口。
Java代碼
publicclassMystring {
publicstaticvoidmain(String[] args) {
String []a={"早上","中午","下午","傍晚","晚上"};
Person[] b={newPerson("小白",15),newPerson("小黑",19),
newPerson("小紅",14),newPerson("小紫",20)};
Arrays.sort(a);
for(inti=0;i
System.out.print(a[i]);
System.out.print("\r\n");
Arrays.sort(b,newPersonComparator());
for(inti=0;i
System.out.println(b[i]);
}
}
//自定義類
classPerson {
publicString name;
publicintage;
publicPerson(String name,intage) {
this.name=name;
this.age=age;
}
@Override
publicString toString() {
return"Person [name="+ name +", age="+ age +"]";
}
}
classPersonComparatorimplementsComparator{
//比較器的比較函數(shù)
/**
* 如果當前對象小于比較對象谴古,返回-1
* 如果當前對象等于比較對象质涛,返回0
* 如果當前對象大于比較對象,返回1
*/
@Override
publicintcompare(Person o1, Person o2) {
//對象為空掰担,拋出空指針異常
if(o1==null||o2==null)
thrownewNullPointerException();
if(o1.age
return-1;
if(o1.age>o2.age)
return1;
return0;
}
}
二.對象的克隆Clone
將一個對象復制一份蹂窖,稱作對象的克隆技術《鞯校克隆對象分為兩步瞬测。
1.實現(xiàn)Cloneable標記接口
Cloneable是一個標記接口,此接口沒有定義任何方法纠炮。只是作為一個標記給虛擬機月趟。
2.重寫Object的clone方法
Java代碼
//自定義類person實現(xiàn)Cloneable接口
classPersonimplementsCloneable {
publicString name;
publicintage;
publicPerson(String name,intage) {
this.name=name;
this.age=age;
}
//重寫Object的clone方法
@Override
protectedObject clone()throwsCloneNotSupportedException
{
returnsuper.clone();
}
}
克隆的調用:
Java代碼
publicstaticvoidmain(String[] args) {
Person temp=newPerson("王尼瑪",18);
try{
Person ok=(Person)temp.clone();//把Object類轉化為Person、
System.out.println(ok.name);//輸出王尼瑪
}catch(CloneNotSupportedException e) {
e.printStackTrace();
}
}
這樣既可以完成對一個對象的克隆恢口,當我們要創(chuàng)建一系列類似的對象時孝宗,可以考慮使用克隆技術可以得到更好的性能,比你new創(chuàng)建好一些耕肩。
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?技術分享:www.kaige123.com