一.比較器Comparable和Comparator
上一篇部落格介紹了工具類Arrays工具類。我們可以對基本類型的數組調用Arrays.sort()函數來進行數組的排序。排序操作在日常開發中經常要使用到。那麼String類和自定義類能不能使用Arrays.sort()來進行排序呢。下面我們來試試,如下:
public class Mystring {
public static void main(String[] args) {
String []a={"早上","中午","下午","傍晚","晚上"};
Person[] b={ new Person("小白",15),new Person("小黑",19),
new Person("小紅",14),new Person("小紫",20)};
Arrays.sort(a);
for(int i=0;i<a.length;i++)
System.out.print(a[i]);
System.out.print("\r\n");
Arrays.sort(b);
for(int i=0;i<b.length;i++)
System.out.println(b[i]);
}
}
//自定義類
class Person {
public String name;
public int age;
public Person(String name,int age) {
this.name=name;
this.age=age;
複制代碼
程式運作結果:
我們發現String可以調用Arrays.sort()函數,而我們自定義的Person類報錯,看錯誤的關鍵字 Comparable
打開String源碼
由此引入比較器Comparable,我們下面利用Comparable接口來實作Person使用Arrays.sort()按年齡排序遞增排序。
Comparable接口能夠對實作它的類的對象進行排序,主要使用compareTo函數來實作排序。compareTo函數傳回int類型,分别傳回-1,0,1對應小于,等于,大于。
把代碼改為:
class Person implements Comparable<Person>{
//比較器的比較函數
/**
* 如果目前對象小于比較對象,傳回-1
* 如果目前對象等于比較對象,傳回0
* 如果目前對象大于比較對象,傳回1
*/
@Override
public int compareTo(Person o) {
//對象為空,抛出空指針異常
if(o==null)
throw new NullPointerException();
if(this.age<o.age)
return -1;
if(this.age>o.age)
return 1;
return 0;
//重寫toString方法
public String toString() {
return "Person [name=" + name + ", age=" + age + "]";
為自定義的Person實作比較器Comparable接口,即可調用Arrays.sort()進行排序。
另外還有另一種實作方法,實作Comparator接口。
Arrays.sort(b,new PersonComparator());
class Person {
class PersonComparator implements Comparator<Person>{
//比較器的比較函數
/**
* 如果目前對象小于比較對象,傳回-1
* 如果目前對象等于比較對象,傳回0
* 如果目前對象大于比較對象,傳回1
*/
public int compare(Person o1, Person o2) {
if(o1==null||o2==null)
if(o1.age<o2.age)
if(o1.age>o2.age)
二.對象的克隆Clone
将一個對象複制一份,稱作對象的克隆技術。克隆對象分為兩步。
1.實作Cloneable标記接口
Cloneable是一個标記接口,此接口沒有定義任何方法。隻是作為一個标記給虛拟機。
2.重寫Object的clone方法
//自定義類person實作Cloneable接口
class Person implements Cloneable {
//重寫Object的clone方法
protected Object clone() throws CloneNotSupportedException
{
return super.clone();
克隆的調用:
public static void main(String[] args) {
Person temp=new Person("王尼瑪",18);
try {
Person ok=(Person)temp.clone();//把Object類轉化為Person、
System.out.println(ok.name);//輸出王尼瑪
} catch (CloneNotSupportedException e) {
e.printStackTrace();
}
這樣既可以完成對一個對象的克隆,當我們要建立一系列類似的對象時,可以考慮使用克隆技術可以得到更好的性能,比你new建立好一些