黑马程序员技术交流社区
标题: 毕老师视频里的一个练习题,不是很明白 [打印本页]
作者: 郑云斌 时间: 2014-5-10 19:06
标题: 毕老师视频里的一个练习题,不是很明白
本帖最后由 郑云斌 于 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;
}
}
作者: skill20 时间: 2014-5-10 19:51
- class Student implements Comparable<Student>{
- public int hashCode(){
- //这个是复写Object的hashCode方法。让不同对象的hash值不相等。
- return name.hashCode()+sum*78;
- }
- //这个是复写Object的equals方法,因为Object的这个方法只比较对象的地址。
- //而一般应用都要比较对象的内容。
- public boolean equals(Object obj){
- if(!(obj instanceof Student))
- throw new RuntimeException("类型不匹配");
- Students=(Student)obj;
- //名字相同,且sum相同才是同一学生。判断是否是同一个学生。
- return this.name.equals(s.name) && this.sum==s.sum;
- }
- //这个是实现接口的方法。让学生具有比较性。
- public int compareTo(Student s){
- //Integer实现了Comparable接口,可以对int类型的数比较。(int转换成Integer即可)。
- int num = new Integer(this.sum).compareTo(new Integer(s.sum));
- if(num==0)
- //字符串实现了Comparable接口,也可以比较。
- return this.name.compareTo(s.name);
- return num;
- }
- }
复制代码
作者: snowaves 时间: 2014-5-10 23:32
:(我还没看到
作者: 彭飞 时间: 2014-5-11 00:08
本帖最后由 彭飞 于 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;//这句代码不明白
这句代码。
引入一下代码- 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;//
复制代码
这个方法上面说了是作用于比较,声明了一个Studen 实例 来接收被传入的被强制转换类型的参数(就是obj)
这个参数符合你前面if的条件。那么他就具有了Studen的功能,接下来,当新增第一个对象时,被存储,当传入第二个对象时,这个第二个对象就是当前对象,而之前的对象就是s对象,
他们之间进行比较, 当名字相等,并且年龄相等的时候,就返回true,而有一个不同的时候就返回false了。
你得知道这是个用来比较的方法, 比较什么是根据需求定义的,比较结果是根据传递的参数进行比较的。
【4】
我还是建议了反复看看该天的视频
- 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;
复制代码
这一个方法中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 10:12
非常感谢,,看了你的回答,已经明白了,谢谢
作者: 彭飞 时间: 2014-5-11 17:26
嘿嘿,要的。
作者: 楚风★憧憬 时间: 2014-5-11 17:40
把毕老师的视频多看几遍就可以了 我也是这样的 不懂就多看几遍 也就那么回事
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) |
黑马程序员IT技术论坛 X3.2 |