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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

本帖最后由 郑云斌 于 2014-5-11 15:29 编辑

部分代码,问题在代码中:
class Student implements Comparable<Student>{

    public int hasCode(){
       return name.hashCode()+sum*78;//这句代码不明白
    }
    public boolean equals(Object obj){//此方法不明白
       if(!(obj instanceof Student))
           throw new RuntimeException("类型不匹配");
       Students=(Student)obj;
       return this.name.equals(s.name) && this.sum==s.sum;//这句代码不明白
    }
    public int compareTo(Student s){//此方法不明白
       int num = new Integer(this.sum).compareTo(new Integer(s.sum));//这句代码不明白
       if(num==0)
           return this.name.compareTo(s.name);//这句代码不明白
       return num;
    }
}

6 个回复

倒序浏览
  1. class Student implements Comparable<Student>{

  2.     public int hashCode(){
  3.         //这个是复写Object的hashCode方法。让不同对象的hash值不相等。
  4.        return name.hashCode()+sum*78;
  5.     }
  6.         //这个是复写Object的equals方法,因为Object的这个方法只比较对象的地址。
  7.         //而一般应用都要比较对象的内容。
  8.     public boolean equals(Object obj){
  9.        if(!(obj instanceof Student))
  10.            throw new RuntimeException("类型不匹配");
  11.        Students=(Student)obj;
  12.            //名字相同,且sum相同才是同一学生。判断是否是同一个学生。
  13.        return this.name.equals(s.name) && this.sum==s.sum;
  14.     }
  15.         //这个是实现接口的方法。让学生具有比较性。
  16.     public int compareTo(Student s){
  17.                 //Integer实现了Comparable接口,可以对int类型的数比较。(int转换成Integer即可)。
  18.        int num = new Integer(this.sum).compareTo(new Integer(s.sum));
  19.        if(num==0)
  20.                    //字符串实现了Comparable接口,也可以比较。
  21.            return this.name.compareTo(s.name);
  22.        return num;
  23.     }
  24. }
复制代码
回复 使用道具 举报
:(我还没看到
回复 使用道具 举报
本帖最后由 彭飞 于 2014-5-11 00:14 编辑

建议楼主回头反复听看下视频。

视频中讲了为什么要如此
【1】
return name.hashCode()+sum*78;//这句代码不明白  
是为了避免相同值的出现
老师举例是说,比如,传入张三 20岁,李四40岁,两个人,
架设张三的哈希值是40,假设李四的哈希值是20 那么,name.hashCode()+sum   返回的都是60 了
出现了相同的值,所以为了避免这种情况,在年龄上乘以一个数字,
这个可以自己定义,只要不超出int的范围即可

【2】
public boolean equals(Object obj){//此方法不明白
这是覆盖父类equals 的方法。
不知道你是不明白为什么写这个方法,还是不明白参数传递。
复写这个方法的目的是让该类具有比较性,比较返回的自然是true,或者false,所以是boolean类型

而传递参数是传入要比较的对象,对象具体是什么不知道,所以Object类型。

【3】
return this.name.equals(s.name) && this.sum==s.sum;//这句代码不明白
这句代码。
引入一下代码
  1. public boolean equals(Object obj){
  2.        if(!(obj instanceof Student))
  3.            throw new RuntimeException("类型不匹配");
  4.        Students=(Student)obj;
  5.        return this.name.equals(s.name) && this.sum==s.sum;//
复制代码


这个方法上面说了是作用于比较,声明了一个Studen 实例 来接收被传入的被强制转换类型的参数(就是obj)
这个参数符合你前面if的条件。那么他就具有了Studen的功能,接下来,当新增第一个对象时,被存储,当传入第二个对象时,这个第二个对象就是当前对象,而之前的对象就是s对象,
他们之间进行比较, 当名字相等,并且年龄相等的时候,就返回true,而有一个不同的时候就返回false了。

你得知道这是个用来比较的方法, 比较什么是根据需求定义的,比较结果是根据传递的参数进行比较的。

【4】
我还是建议了反复看看该天的视频
  1. public int compareTo(Student s){//此方法不明白
  2.        int num = new Integer(this.sum).compareTo(new Integer(s.sum));//这句代码不明白
  3.        if(num==0)
  4.            return this.name.compareTo(s.name);//这句代码不明白
  5.        return num;
复制代码


这一个方法中5行代码,3个不明白  -0-  实在是囧啊朋友。

4-1
compareTo() 方法是Comparable接口下的一个方法 作用就是比较,
返回是的 负数,正数,和0  负数就是小于,正数就是大于  相同就是0
比如拿1和3比,小于 就是负数 可以是-1,-2,-3,
比如拿10和2比,大于,就是整数,可以是2,3,4,1

4-2
Integer 就是int类型的对象,简单说就是把int变成对象了,
new Integer(this.sum) 就是把 this代表的sum 变成对象了,
就好比 new String();   进行了类型的转换了   

所以综合上面4-1-2
就是把this.sum变成了对象,拿来和s.sum对象进行比较,   比较结果是大于小于还是等于呢?
那就要根据参数具体来判断了,
能理解了吧。

4-3
最后一个if判断下
return this.name.compareTo(s.name);//这句代码不明白

这是出现相等的情况下才会执行到的语句
两个人的年龄相同了,有可能是同一个人吧,也有可能不是吧,那就再比下其他特征吧
所以把他们的名字拿来对比一下, 嗯,一样就是同一个人, 嗯不一样就是两个对象
根据Set 的其中一个特性,不可重复,
所以,当年龄一样,名字一样的时候,只会保留一个。

OK  
完毕
回复 使用道具 举报
彭飞 发表于 2014-5-11 00:08
建议楼主回头反复听看下视频。

视频中讲了为什么要如此

非常感谢,,看了你的回答,已经明白了,谢谢
回复 使用道具 举报
郑云斌 发表于 2014-5-11 10:12
非常感谢,,看了你的回答,已经明白了,谢谢

嘿嘿,要的。
回复 使用道具 举报
把毕老师的视频多看几遍就可以了  我也是这样的 不懂就多看几遍 也就那么回事
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马