往set里面put一个学生对象,然后将这个学生对象的学号改了,再put进去,可以放进set么?并讲出为什么
答:不可以放入,因为修改学号并不会修改这个学生对象的hashcode,set不能存放相同(使用equals判断成立)的元素
修改hashcode的生成方法即可放入
在hashset中判断两个对象是否重复的规则是:
1),判断两个对象的hashCode是否相等.
如果不相等,认为两个对象也不相等,完毕; 如果相等,转入2)
(这一点只是为了提高存储效率而要求的,其实理论上没有也可以,但如果没有,实际使用时效率会大大降低,
所以我们这里将其做为必需的。后面会重点讲到这个问题。)
2),判断两个对象用equals运算是否相等
如果不相等,认为两个对象也不相等; 如果相等,认为两个对象相等(equals()是判断两个对象是否相等的关键)
为什么是两条准则,难道用第一条不行吗?不行,因为前面已经说了,hashcode()相等时,equals()方法也可能不等,
所以必须用第2条准则进行限制,才能保证加入的为非重复元素。
那么为什么不直接用equals()方法判断呢?
我想是因为效率的原因。很容易让hashcode()的效率比equals()高些,
因为它不必每次都重新算hash值,具体参照上面String的hashcode()实现
(这一点只是为了提高存储效率而要求的,其实理论上没有也可以,但如果没有,实际使用时效率会大大降低,
所以我们这里将其做为必需的。后面会重点讲到这个问题。)
2),判断两个对象用equals运算是否相等
如果不相等,认为两个对象也不相等; 如果相等,认为两个对象相等(equals()是判断两个对象是否相等的关键)
为什么是两条准则,难道用第一条不行吗?不行,因为前面已经说了,hashcode()相等时,equals()方法也可能不等,
所以必须用第2条准则进行限制,才能保证加入的为非重复元素。
那么为什么不直接用equals()方法判断呢?
我想是因为效率的原因。很容易让hashcode()的效率比equals()高些,
因为它不必每次都重新算hash值,具体参照上面String的hashcode()实现
验证代码:
1 package com.set; 2 3 import java.util.HashSet; 4 import java.util.Iterator; 5 import java.util.Set; 6 /** 7 * 验证问题: 8 * 往set里面put一个学生对象,然后将这个学生对象的学号改了,再put进去,可以放进set么?并讲出为什么 9 * 答:不可以放入,因为修改学号并不会修改这个学生对象的hashcode,set不能存放相同(使用equals判断成立)的元素 10 * 修改hashcode的生成方法即可放入
11 */ 12 public class TestSet { 13 14 /** 15 * @param args 16 */ 17 Object o; 18 public static void main(String[] args) { 19 20 Set<Student> set=new HashSet<Student>(); 21 Student s1=new Student("1", "xxh"); 22 // 往集合中放入学生对象s1 23 set.add(s1); 24 System.out.println(s1.hashCode()); 25 // 修改s1的学号 26 s1.setSid("2"); 27 System.out.println(s1.hashCode()); 28 // 尝试放入修改后的s1 29 if(set.add(s1)){ 30 System.out.println("可以放入"); 31 }else{ 32 System.out.println("不可以放入"); 33 } 34 // 通过迭代器查询集合中的元素 35 Iterator<Student> it=set.iterator(); 36 while(it.hasNext()){ 37 Student s=it.next(); 38 System.out.println(s.hashCode()+"Set中的学生学号"+s.getSid()+" 姓名"+s.getSname()); 39 } 40 } 41 42 } 43 44 class Student{ 45 private String sid; 46 private String sname; 47 48 public String getSid() { 49 return sid; 50 } 51 52 public void setSid(String sid) { 53 this.sid = sid; 54 } 55 56 public String getSname() { 57 return sname; 58 } 59 60 public void setSname(String sname) { 61 this.sname = sname; 62 } 63 64 public Student(String sid, String sname) { 65 super(); 66 this.sid = sid; 67 this.sname = sname; 68 69 } 70 71 // @Override 72 // public int hashCode() { 73 // TODO Auto-generated method stub 74 // return Integer.valueOf(sid); 75 //} 76 77 }