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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始


在Hashmap中 判断对象重复是 hashcode值和equals方法.
都重写了,第一种方法不知道为什么不正确.  <String,Student>
第二种可以.  <Student,String>
求大神解读

  1. import java.util.HashMap;
  2. import java.util.Set;

  3. /*
  4.   * HashMap存储键和值。并遍历。
  5. * 键:String 学号
  6. * 值:Student (name,age)
  7. *
  8. * 特有需求:两个对象的成员变量值如果都相同。我们则认为是同一个对象。
  9. */
  10. public class HashMapDemo2 {
  11.         public static void main(String[] args) {
  12.                 HashMap<String,Student> hm = new HashMap<String,Student>();
  13.                
  14.                 hm.put("1",new Student("Google",5));
  15.                 hm.put("2", new Student("lenovo",10));
  16.                 hm.put("3", new Student("apple",8));
  17.                 hm.put("4", new Student("apple",8));
  18.                 hm.put("5", new Student("apple",8));
  19.                 //输出不能去除重复
  20.                 Set<String> set = hm.keySet();
  21.                 for(String key:set){
  22.                         Student value = hm.get(key);
  23.                         System.out.println(key+"--"+value.getName()+"---"+value.getAge());
  24.                 }
  25.                
  26.                 HashMap<Student,String> hm2 = new HashMap<Student,String>();
  27.                 hm2.put(new Student("google",5), "1");
  28.                 hm2.put(new Student("google",5), "1");
  29.                 hm2.put(new Student("google",5), "1");
  30.                 hm2.put(new Student("lenovo",7), "2");
  31.                 hm2.put(new Student("lenovo",7), "2");
  32.                 //正常,可以去重复
  33.                 Set<Student> set2 = hm2.keySet();
  34.                 for(Student key : set2){
  35.                         String value = hm2.get(key);
  36.                         System.out.println(key.getName()+"---"+key.getAge()+"---"+value);
  37.                 }

  38.         }
  39. }
复制代码
  1. //这是自定义的学生类
复制代码

  1. public class Student {
  2.         private String name;
  3.         private int age;

  4.         public Student(String name, int age) {
  5.                 super();
  6.                 this.name = name;
  7.                 this.age = age;
  8.         }

  9.         public String getName() {
  10.                 return name;
  11.         }

  12.         public void setName(String name) {
  13.                 this.name = name;
  14.         }

  15.         public int getAge() {
  16.                 return age;
  17.         }

  18.         public void setAge(int age) {
  19.                 this.age = age;
  20.         }

  21.         public int hashCode() {
  22.                 return this.name.hashCode() + this.age * 3;
  23.         }
  24.         //参数为object 才行?
  25.         public boolean equals(Object obj) {
  26.                 if (this == obj) {
  27.                         return true;
  28.                 }
  29.                 if(!(obj instanceof Student)){
  30.                         return false;
  31.                 }
  32.                 Student stu = (Student)obj;
  33.                 return this.name.equals(stu.name) && this.age == stu.age;
  34.         }
  35. }
复制代码




3 个回复

正序浏览
不对吧,hashcoed里面的值是唯一的
回复 使用道具 举报
不知道为什么没有重写HashCode(),不会写的话就自动生成啊,这个要写的
回复 使用道具 举报
Map集合的是唯一的!
因为第一种方式的键是String类型的,所以如果集合的键值出现相同的话,值会覆盖之前的值,但是你往集合中插入的键没有相同的,是"1","2","3","4","5" 没有相同的,后面的值Student类对象可以相同。
第二种方式的键是Student类型的,有相同的,所以添集合中添加的时候,会根据HashCode() 和 equals() 来判断是否相同。相同,则覆盖键对应的旧值。
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马