为了账号安全,请及时绑定邮箱和手机立即绑定

在这节视频中,为什么只有比较containsValue的时候才出错,才需要修改hashcode和equals方法?

为什么containsKey的时候,没修改不报错呢?


正在回答

6 回答

因为Map的键值对应的值是唯一的,而值所映射的键值却有可能是多个的,而Contains方法自带的比较机制是比较索引,也就是地址,所以ContainsValue方法需要改写

3 回复 有任何疑惑可以回复我~
#1

风中过客 提问者

非常感谢!
2015-05-21 回复 有任何疑惑可以回复我~

个人理解,containsKey()方法中,调用的是String类型的equals()函数,查阅javaAPI文档可知,String类型已经对equals()方法进行了重写:“将此字符串与指定的对象比较。当且仅当该参数不为 null,并且是与此对象表示相同字符序列的 String 对象时,结果才为 true”。所以就不需要我们进行重写了!

0 回复 有任何疑惑可以回复我~

package com.imooc.collection;


import java.util.HashMap;

import java.util.Map;


/** * @author  guokewind 

 * @date 创建时间:2015年5月4日 下午12:01:29 

 * @version 

 * @parameter  

 * @since  

 * @return  */

public class Test3 {

public Map<String, String> students;

/**

* 在构造器中初始化students属性

*/

public Test3() {

this.students = new HashMap<String, String>();

}

public void testPut() {

students.put("1", "xiaoming");

}

public void duibi(String id,String name){

System.out.println(students.containsKey(id));

System.out.println(students.containsValue(name));

}

public static void main(String[] args) {

// TODO Auto-generated method stub

           Test3 test=new Test3();

           test.testPut();

          Student st=new Student("1","xiaoming");

           test.duibi("1","2");

           test.duibi("1","xiaoming");

}


}


0 回复 有任何疑惑可以回复我~

比较的是字符串吧?比较字符串的时候,是需要写equals的

0 回复 有任何疑惑可以回复我~
#1

风中过客 提问者

this.students = new HashMap<String, Student>(); key才是 String 类型,之后containsValue比较的是student中的name(String类型)
2015-05-04 回复 有任何疑惑可以回复我~
#2

风中过客 提问者

我试了一下 如果 是这样的 his.students = new HashMap<String, String>(); 这样的话 是能够正确比较的。 会不会因为之前比较的Value,直接把course2放到containsValue()里面了? 因此导致无法正确比较
2015-05-04 回复 有任何疑惑可以回复我~

举报

0/150
提交
取消

在这节视频中,为什么只有比较containsValue的时候才出错,才需要修改hashcode和equals方法?

我要回答 关注问题
意见反馈 帮助中心 APP下载
官方微信