think in java interview-高级开发人员面试宝典(三)
comparable接口與comparator
兩種比較接口分析
前者應(yīng)該比較固定,和一個(gè)具體類相綁定,而后者比較靈活,它可以被用于各個(gè)需要比較功能的類使用。
一個(gè)類實(shí)現(xiàn)了 Camparable 接口表明這個(gè)類的對象之間是可以相互比較的。如果用數(shù)學(xué)語言描述的話就是這個(gè)類的對象組成的集合中存在一個(gè)全序。這樣,這個(gè)類對象組成的集合就可以使用 Sort 方法排序了。
而 Comparator 的作用有兩個(gè):
1. 如果類的設(shè)計(jì)師沒有考慮到 Compare 的問題而沒有實(shí)現(xiàn) Comparable 接口,可以通過 Comparator 來實(shí)現(xiàn)比較算法進(jìn)行排序;
2. 為了使用不同的排序標(biāo)準(zhǔn)做準(zhǔn)備,比如:升序、降序或其他什么序。
在 “集合框架” 中有兩種比較接口: Comparable 接口和 Comparator 接口。
Comparable 是通用的接口,用戶可以實(shí)現(xiàn)它來完成自己特定的比較,而 Comparator 可以看成一種算法的實(shí)現(xiàn),在需要容器集合實(shí)現(xiàn)比較功能的時(shí)候,來指定這個(gè)比較器,這可以看成一種設(shè)計(jì)模式,將算法和數(shù)據(jù)分離。
來看樣例:
PersonBean類
[java]view plaincopy
<span style="font-size:12px;">publicclass PersonBean implements Comparable<PersonBean> { ?
public PersonBean(int age, String name) { ?
this.age = age; ?
this.name = name; ?
? ?} ?
int age = 0; ?
? ?String name = ""; ?
publicint getAge() { ?
return age; ?
? ?} ?
publicvoid setAge(int age) { ?
this.age = age; ?
? ?} ?
public String getName() { ?
return name; ?
? ?} ?
publicvoid setName(String name) { ?
this.name = name; ?
? ?} ?
publicboolean equals(Object o) { ?
if (!(o instanceof PersonBean)) { ?
returnfalse; ?
? ? ? ?} ?
? ? ? ?PersonBean p = (PersonBean) o; ?
return (age == p.age) && (name.equals(p.name)); ?
? ?} ?
publicint hashCode() { ?
int result = 17; ?
? ? ? ?result = 31 * result + age; ?
? ? ? ?result = 31 * result + name.hashCode(); ?
return result; ?
? ?} ?
public String toString() { ?
return (age + "{" + name + "}"); ?
? ?} ?
publicint compareTo(PersonBean person) { ?
int cop = age - person.getAge(); ?
if (cop != 0) ?
return cop; ?
else
return name.compareTo(person.name); ?
? ?} ?
} ?
</span> ?
[java]view plaincopy
<span style="font-size:12px;">import java.util.Comparator; ?
publicclass AlphDesc implements Comparator<PersonBean> { ?
publicint compare(PersonBean personA, PersonBean personB) { ?
int cop = personA.age - personB.age; ?
if (cop != 0) ?
return cop; ?
else
return personB.getName().compareTo(personA.getName()); ?
? ?} ?
} ?
</span> ?
TestComparable類
[java]view plaincopy
<span style="font-size:12px;">import java.util.*; ?
publicclass TestComparable { ?
/**
? ? * @param args
? ? */
publicvoid compare() { ?
? ? ? ?PersonBean[] p = { new PersonBean(20, "Tom"), ?
new PersonBean(20, "Jeff"), ?
new PersonBean(30, "Mary"), ?
new PersonBean(20, "Ada"), ?
new PersonBean(40, "Walton"), ?
new PersonBean(61, "Peter"), ?
new PersonBean(20, "Bush") }; ?
? ? ? ?System.out.println("before sort:\n" + Arrays.toString(p)); ?
? ? ? ?AlphDesc desc = new AlphDesc(); ?
? ? ? ?Arrays.sort(p,desc); ?
? ? ? ?System.out.println("after sort:\n" + Arrays.toString(p)); ?
? ?} ?
publicstaticvoid main(String[] args) { ?
? ? ? ?TestComparable tc = new TestComparable(); ?
? ? ? ?tc.compare(); ?
? ?} ?
}</span> ?
每一篇不宜寫得過長,下篇繼續(xù)
轉(zhuǎn)載于:https://blog.51cto.com/longx/1351868
總結(jié)
以上是生活随笔為你收集整理的think in java interview-高级开发人员面试宝典(三)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: think in java interv
- 下一篇: 高档名片设计:12款专业的名片设计欣赏