黑马程序员技术交流社区
标题: 集合里面关于比较器的一个小问题 [打印本页]
作者: dhysh5512176 时间: 2014-11-27 12:50
标题: 集合里面关于比较器的一个小问题
在TreeSet
这个类中,当我们生成了一系列的String类型的对象,如下代码:- public static void main(String[] args) {
- TreeSet ts = new TreeSet();
- ts.add("asdf");
- ts.add("ssss2");
- ts.add("1sd");
- ts.add("sdfa23fasfd");
- ts.add("s");
- ts.add("slijwld");
- ts.add("slds");
- Iterator it = ts.iterator();
- while(it.hasNext()){
- System.out.println(it.next());
- }
- }
复制代码他会自动给我们进行排序,它调用的是String类里面的compareTo()方法,会按照字母字典的顺序进行自然排序,那如果我们需要按照字母的长度进行排序,我们一般会去重写一个比较器,例如:
TreeSet ts = new TreeSet(new ComparatorByLenth());
然后我们调用这个比较器就可以了。
可是,我想问的是,我们为什么不可以直接重写String类里面的compareTo()方法,我们既然可以重写Object类里面的方法,为什么不能重写String类里面的方法?
毕大大给的解释是因为String类已经被SUN公司写死了,所以我们不能,那Object类里面的为什么我们可以呢?
作者: 尚勇勇 时间: 2014-11-27 12:50
这个原因是代码的扩展性问题,在CompareTo()方法中写了一种比较的方式,如果重写则会修改源代码,修改源代码对于程序员来说,相当于灾难性的事情,但是你重写一个比较器,就不用修改原先的CompareTo()方法
作者: as604049322 时间: 2014-11-27 12:57
:funk:表示没看太懂。。。我基础还是差,继续看视频去了。
作者: dhysh5512176 时间: 2014-11-27 13:01
难道是我说的太模糊了?没事 加油 其实我也是新手,只是有问题 所以才提出来,共勉:D
作者: 雨过山更翠 时间: 2014-11-27 20:16
很深奥的问题呀,表示i'm too weak.
作者: RINGARES 时间: 2014-11-27 22:18
public final class String
因为String类是final修饰的,不可以被继承,也就不能重写它的compareTo()方法,所以只有用比较器了
作者: yy505032788 时间: 2014-11-29 22:55
也是新手,过来露脸的
作者: ppzx002 时间: 2014-11-30 08:28
新手过来学习下!!!!!
作者: jdedffjef83j 时间: 2014-11-30 20:31
唉,好难啊
作者: yuanlingqi 时间: 2014-11-30 21:53
可是,我想问的是,我们为什么不可以直接重写String类里面的compareTo()方法,我们既然可以重写Object类里面的方法,为什么不能重写String类里面的方法?
毕大大给的解释是因为String类已经被SUN公司写死了,所以我们不能,那Object类里面的为什么我们可以呢?
你能提出这种问题,说明你的基础实在是太差,你对java里基础包和java类的设计缺乏了解,建议你先熟悉一下jdk的api文档,看java的基础包里到底有些什么,常用类之间的继承和接口之间的关系是怎么样的。下面我来回答一下你的问题。
首先为什么不能重写String类?你看看api里的说明
[size=-1]java.lang
Class Stringjava.lang.Object
java.lang.StringAll Implemented Interfaces:Serializable, CharSequence, Comparable<String>
public final class Stringextends Objectimplements Serializable, Comparable<String>, CharSequence
看到了吗?String类继承了Object类,并实现了3个接口,而且String类前面有个final的修饰符,final修饰的类是不可能被修改和继承的,这个是基本常识,如果连这个都不能理解,那就没办法了,你只能自己去多啃下java的基本语法。还有你说Object类为什么可以被重写?这个原因很简单啊,因为他不是final的啊?Object是java里的基类懂吗?是所有类的祖宗懂吗?所有类都默认是Object的子类有木有?还是看看api里的介绍吧[size=-1]java.lang
Class Objectjava.lang.Object
public class ObjectClass Object is the root of the class hierarchy. Every class has Object as a superclass. All objects, including arrays, implement the methods of this class.
什么?你说看不懂?好吧,如果你想学好java,钻研api是必须的。
作者: dhysh5512176 时间: 2014-11-30 22:25
首先,我真的很感谢你很详细的给我回答这个问题,并且告诉我应该如何去做,谢谢。但是我也要说的是,确实 我承认我的基础很差,所以我敢于出来问,我并不怕我现在基础,因为这只是现在,只要我认真的学,以后,我也能够理解,也能够做到更好。
作者: aa524500 时间: 2015-1-5 23:26
因为String是final修饰的啊,所以不能继承啊,所以不能重写compareTo,这就是毕老师说的String类已经被SUN公司写死了啦
作者: lwj123 时间: 2015-2-5 20:18
String的API中你没看到吗?String是final修饰的,根本就不可以有子类,从何谈起重写compareTo方法呢?
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) |
黑马程序员IT技术论坛 X3.2 |