A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© First 中级黑马   /  2013-5-28 19:30  /  2069 人查看  /  13 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 First 于 2013-5-29 18:09 编辑
  1. import java.util.Comparator;
  2. import java.util.Iterator;
  3. import java.util.TreeSet;


  4. /*
  5. 练习:按字符串长度排序。
  6. */

  7. class Demo{
  8. public static void main(String [] args){
  9. TreeSet ts = new TreeSet(new StringLengthComparator());

  10. ts.add("a");
  11. ts.add("adf");
  12. ts.add("aa");
  13. ts.add("aaa");
  14. ts.add("aadf");
  15. ts.add("addf");


  16. Iterator it = ts.iterator();
  17. while(it.hasNext()){
  18. String s = (String) it.next();
  19. System.out.println(s.length()+"\t"+s);
  20. }
  21. }

  22. public static void sop(Object obj){
  23. System.out.println(obj);
  24. }
  25. }


  26. class StringLengthComparator implements Comparator{

  27. @Override
  28. public int compare(Object o1, Object o2) {
  29. // TODO Auto-generated method stub
  30. String s1 = (String) o1;
  31. String s2 = (String) o2;

  32. int num = s1.length()-s2.length();

  33. if(num == 0)
  34. return s1.compareTo(s2);
  35. return num;
  36. }

  37. }
复制代码
问题:StringLengthComparator 实现了 Comparator接口,可是Comparator接口有 compare 和 equals 两个方法,为何上面的代码只实现了一个方法也能够通过编译,还能正常运行?

评分

参与人数 1技术分 +1 收起 理由
袁梦希 + 1 很给力!

查看全部评分

13 个回复

倒序浏览
因为string类型已经实现了Comparable<String>  已经有一个自然排序了!!可以查看API文档


public final class Stringextends Objectimplements Serializable, Comparable<String>, CharSequence

评分

参与人数 1技术分 +1 收起 理由
袁梦希 + 1 突破40

查看全部评分

回复 使用道具 举报

equals方法是Object的方法,Comparator是Object的子类,equals方法在Object类中不是抽象方法。
所以,如果子类不覆盖父类方法,则使用父类的方法。所以上面的例子可以通过编译。

评分

参与人数 1技术分 +1 收起 理由
袁梦希 + 1 很给力!

查看全部评分

回复 使用道具 举报
兄弟这是Comparetor的API里的内容,实现Comparetor接口equals方法可以不重写。

equals
boolean equals(Object obj)指示某个其他对象是否“等于”此 Comparator。此方法必须遵守 Object.equals(Object) 的常规协定。此外,仅当 指定的对象也是一个 Comparator,并且强行实施与此 Comparator 相同的排序时,此方法才返回 true。因此,comp1.equals(comp2) 意味着对于每个对象引用 o1 和 o2 而言,都存在 sgn(comp1.compare(o1, o2))==sgn(comp2.compare(o1, o2))。
注意,不 重写 Object.equals(Object) 方法总是 安全的。然而,在某些情况下,重写此方法可以允许程序确定两个不同的 Comparator 是否强行实施了相同的排序,从而提高性能。


覆盖:
类 Object 中的 equals
参数:
obj - 要进行比较的引用对象。
返回:
仅当指定的对象也是一个 Comparator,并且强行实施与此 Comparator 相同的排序时才返回 true。
另请参见:
Object.equals(Object), Object.hashCode()

--------------------------------------------------------------------------------

评分

参与人数 1技术分 +1 收起 理由
袁梦希 + 1 很给力!

查看全部评分

回复 使用道具 举报
student 发表于 2013-5-28 19:51
equals方法是Object的方法,Comparator是Object的子类,equals方法在Object类中不是抽象方法。
所以,如果 ...

接口中不是只能有抽象方法吗?
那么 Comparator 中的 equals 不是应该是抽象的吗?
回复 使用道具 举报
小羽天空 发表于 2013-5-28 20:00
兄弟这是Comparetor的API里的内容,实现Comparetor接口equals方法可以不重写。

equals

为何不用重写呢? Comparator 是 interface 啊??
回复 使用道具 举报
First 发表于 2013-5-28 20:14
接口中不是只能有抽象方法吗?
那么 Comparator 中的 equals 不是应该是抽象的吗? ...

Comparator 中的 equals是继承object的,equals在object中不是抽象的,是事实存在的方法。
后面的类实现借口comparator,但是也继承了object,所有的类都是从object继承过来的,java中只有object是没有父类的,所以其他所有的类都可以直接使用object的方法

评分

参与人数 1技术分 +1 收起 理由
袁梦希 + 1 很给力!

查看全部评分

回复 使用道具 举报
First 发表于 2013-5-28 20:19
为何不用重写呢? Comparator 是 interface 啊??

Comparator 中的 equals是继承object的且在object中的equals不是抽象的,就可以直接调用object的equals,,。对于继承你应该知道的吧。所以就可以不用在Comparator中重写了。
回复 使用道具 举报
如果要实现一个接口的话,必须实现这个接口中的所有的抽象方法。
回复 使用道具 举报
小羽天空 发表于 2013-5-28 20:00
兄弟这是Comparetor的API里的内容,实现Comparetor接口equals方法可以不重写。

equals

非常好
回复 使用道具 举报
First 发表于 2013-5-28 20:14
接口中不是只能有抽象方法吗?
那么 Comparator 中的 equals 不是应该是抽象的吗? ...

我看了源代码,发现Comparator的equals方法并不是抽象的,该方法如下:
boolean equals(Object obj);
只有方法声明,没有方法体。我又开始疑惑了。
回复 使用道具 举报
如果问题已解决,请及时修改分类,否则继续提问,谢谢合作!
回复 使用道具 举报
First 中级黑马 2013-5-29 18:09:16
13#
小羽天空 发表于 2013-5-28 22:26
Comparator 中的 equals是继承object的且在object中的equals不是抽象的,就可以直接调用object的equals, ...

不用覆盖 equals 方法,api 还要把它标记出来,这样是不是有点 多此一举了???
回复 使用道具 举报
First 发表于 2013-5-29 18:09
不用覆盖 equals 方法,api 还要把它标记出来,这样是不是有点 多此一举了??? ...

你可以重写啊,你compare方法是根据你的equals方法来判断的,你重写了,他的返回也不一样了
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马