java對象比較器和克隆

一.比較器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

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末因妇,一起剝皮案震驚了整個濱河市问潭,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌婚被,老刑警劉巖狡忙,帶你破解...
    沈念sama閱讀 218,036評論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異址芯,居然都是意外死亡灾茁,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,046評論 3 395
  • 文/潘曉璐 我一進店門谷炸,熙熙樓的掌柜王于貴愁眉苦臉地迎上來北专,“玉大人,你說我怎么就攤上這事旬陡⊥赝牵” “怎么了?”我有些...
    開封第一講書人閱讀 164,411評論 0 354
  • 文/不壞的土叔 我叫張陵描孟,是天一觀的道長驶睦。 經常有香客問我,道長画拾,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,622評論 1 293
  • 正文 為了忘掉前任菜职,我火速辦了婚禮青抛,結果婚禮上,老公的妹妹穿的比我還像新娘酬核。我一直安慰自己蜜另,他們只是感情好,可當我...
    茶點故事閱讀 67,661評論 6 392
  • 文/花漫 我一把揭開白布嫡意。 她就那樣靜靜地躺著举瑰,像睡著了一般。 火紅的嫁衣襯著肌膚如雪蔬螟。 梳的紋絲不亂的頭發(fā)上此迅,一...
    開封第一講書人閱讀 51,521評論 1 304
  • 那天,我揣著相機與錄音旧巾,去河邊找鬼耸序。 笑死,一個胖子當著我的面吹牛鲁猩,可吹牛的內容都是我干的坎怪。 我是一名探鬼主播,決...
    沈念sama閱讀 40,288評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼廓握,長吁一口氣:“原來是場噩夢啊……” “哼搅窿!你這毒婦竟也來了嘁酿?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 39,200評論 0 276
  • 序言:老撾萬榮一對情侶失蹤男应,失蹤者是張志新(化名)和其女友劉穎闹司,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體殉了,經...
    沈念sama閱讀 45,644評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡开仰,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 37,837評論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了薪铜。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片众弓。...
    茶點故事閱讀 39,953評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖隔箍,靈堂內的尸體忽然破棺而出谓娃,到底是詐尸還是另有隱情,我是刑警寧澤蜒滩,帶...
    沈念sama閱讀 35,673評論 5 346
  • 正文 年R本政府宣布滨达,位于F島的核電站,受9級特大地震影響俯艰,放射性物質發(fā)生泄漏捡遍。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,281評論 3 329
  • 文/蒙蒙 一竹握、第九天 我趴在偏房一處隱蔽的房頂上張望画株。 院中可真熱鬧,春花似錦啦辐、人聲如沸谓传。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,889評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽续挟。三九已至,卻和暖如春侥衬,著一層夾襖步出監(jiān)牢的瞬間诗祸,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,011評論 1 269
  • 我被黑心中介騙來泰國打工轴总, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留贬媒,地道東北人。 一個月前我還...
    沈念sama閱讀 48,119評論 3 370
  • 正文 我出身青樓肘习,卻偏偏與公主長得像际乘,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子漂佩,可洞房花燭夜當晚...
    茶點故事閱讀 44,901評論 2 355

推薦閱讀更多精彩內容

  • 1. Java基礎部分 基礎部分的順序:基本語法脖含,類相關的語法罪塔,內部類的語法,繼承相關的語法养葵,異常的語法征堪,線程的語...
    子非魚_t_閱讀 31,631評論 18 399
  • 一、 1关拒、請用Java寫一個冒泡排序方法 【參考答案】 public static void Bubble(int...
    獨云閱讀 1,375評論 0 6
  • Spring Cloud為開發(fā)人員提供了快速構建分布式系統(tǒng)中一些常見模式的工具(例如配置管理佃蚜,服務發(fā)現(xiàn),斷路器着绊,智...
    卡卡羅2017閱讀 134,657評論 18 139
  • 1 XML解析No29 【 XML:可拓展標記語言谐算,語言和HTML類似,也是一種標記語言归露。 特點:標記是自定義...
    征程_Journey閱讀 1,650評論 0 9
  • 盛夏時節(jié)洲脂,莫伊人被屋外煩躁的知了吵醒,背上汗津津的剧包,難受的很恐锦。她大二暑假從濟南回來,當初去濟南上學疆液,純粹是為了老舍...
    獄中的鳥dmf閱讀 254評論 0 0