java.lang和java.util_java.lang.Comparable 和 java.util.Comparator的區別

一,概述

Comparable和Comparator都是用來實現集合中元素的比較,排序的。

可比較的是在集合內部定義的方法實現的排序,位於java.lang下

。Comparator是在集合外部實現的排序,位於java。 UTIL下,

可比是一個對象本身就已經支持自比較所需要實現的接口,如字符串,整數自己就實現了媲美接口,可完成比較大小操作。自定義類要在加入列表容器中后能夠排序,也可以實現Comparable接口,在用集合類的排序方法排序時若不指定Comparator,那就以自然順序排序。所謂自然順序就是實現Comparable接口設置的排序方式。Comparator

是一個專用的比較器,當這個對象不支持自比較或者自比較函數不能滿足要求時,可寫一個比較器來完成兩個對象之間大小的比較.Comparator體現了一種策略模式(策略設計模式),就是不改變對象自身,而用一個策略對象(策略對象)來改變的行為。

總而言之可比是自已完成比較,比較器是外部程序實現比較。

二,例子

①Comparator的絕對值比較器

公共類AbsComparator 實現比較器

{

public int compare(Object o1,Object o2)

{

int ovalue1 = Math.abs(((Integer)o1).intValue());

int ovalue2 = Math.abs(((Integer) o2).intValue());

return (ovalue1 > ovalue2) ? 1 : (ovalue1 == ovalue2 ? 0 : -1);

}

}

import java.util.Arrays;

import java.util.Random;

public class AbsComparatorTest

{

public static void main(String[] args)

{

// 使用方法1

Random rn = new Random();

Integer[] integerArray = new Integer[20];

for (int i = 0; i < integerArray.length; i++)

{

integerArray[i] = new Integer(rn.nextInt(100) * (rn.nextBoolean() ? 1 : -1));

}

System.out.println("用Integer內置方法排序:");

Arrays.sort(integerArray);

System.out.println(Arrays.asList(integerArray));

System.out.println("用AbsComparator排序:");

Arrays.sort(integerArray, new AbsComparator());

System.out.println(Arrays.asList(integerArray));

// 使用方法2

System.out.println("用AbsComparator比較-100和10的絕對值大小結果是:");

AbsComparator absComparator = new AbsComparator();

int result = absComparator.compare(new Integer(-100), new Integer(10));

System.out.println(result);

}

}

若不是調用sort方法,相要直接比較兩個對象的大小,Comparator定義了倆個方法,分別是int compare(T o1,T o2)和boolean equals(Object   obj)。有時在實現Comparator接口時,並沒有實現equals方法,可程序並沒有報錯,原因是實現該接口的類也是Object類的子類,而Object類已經實現了equals方法。

②comparable和comparator綜合例子

// 實現Comparable接口

public class Person implements Comparable

{

private int num;

private String name;

private int age;

public Person(int num, String name, int age)

{

super();

this.num = num;

this.name = name;

this.age = age;

}

public int compareTo(Object o)

{

return this.age - ((Person) o).getAge();

}

public int getNum()

{

return num;

}

public void setNum(int num)

{

this.num = num;

}

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;

}

}

// 實現Comparator接口

public class PersonComparator implements Comparator

{

@Override

public int compare(Object o1, Object o2)

{

int num1 = ((Person) o1).getNum();

int num2 = ((Person) o2).getNum();

return num1 > num2 ? 1 : (num1 == num2 ? 0 : -1);

}

}

// 測試

public class PersonTest

{

public static void main(String[] args)

{

Person p1 = new Person(1, "xy1", 22);

Person p2 = new Person(2, "xy1", 21);

System.out.println("實現Comparable接口方法結果(按年齡比較):"); // 結果為1

System.out.println(p1.compareTo(p2));

System.out.println("實現Comparator接口方法結果(按學號比較):"); // 結果為-1

PersonComparator pc = new PersonComparator();

System.out.println(pc.compare(p1, p2));

// 也可用聲明一個Person[] ps,通過Array.sort(ps)進行排序

}

}

三、Comparable和Comparator區別比較

Comparable是排序接口,若一個類實現了Comparable接口,就意味着“該類支持排序”。而Comparator是比較器,我們若需要控制某個類的次序,可以建立一個“該類的比較器”來進行排序。

Comparable相當於“內部比較器”,而Comparator相當於“外部比較器”。

兩種方法各有優劣, 用Comparable 簡單, 只要實現Comparable 接口的對象直接就成為一個可以比較的對象,但是需要修改源代碼。 用Comparator 的好處是不需要修改源代碼, 而是另外實現一個比較器, 當某個自定義的對象需要作比較的時候,把比較器和對象一起傳遞過去就可以比大小了, 並且在Comparator 里面用戶可以自己實現復雜的可以通用的邏輯,使其可以匹配一些比較簡單的對象,那樣就可以節省很多重復勞動了。

原帖地址:http://ctzlylc.blog.163.com/blog/static/61967136201165981283/

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值