往set里面put一个学生对象,然后将这个学生对象的学号改了,再put进去,可以放进set么?并讲出为什么...

本文探讨了HashSet存储自定义对象(如学生)时的行为。解释了当修改对象属性后再次添加到HashSet时为何不会成功,并提供了修改hashCode生成方法的解决方案。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

往set里面put一个学生对象,然后将这个学生对象的学号改了,再put进去,可以放进set么?并讲出为什么 

答:不可以放入,因为修改学号并不会修改这个学生对象的hashcode,set不能存放相同(使用equals判断成立)的元素   

  修改hashcode的生成方法即可放入

 

在hashset中判断两个对象是否重复的规则是:
  1),判断两个对象的hashCode是否相等. 

         如果不相等,认为两个对象也不相等,完毕;    如果相等,转入2)
    (这一点只是为了提高存储效率而要求的,其实理论上没有也可以,但如果没有,实际使用时效率会大大降低,
     所以我们这里将其做为必需的。后面会重点讲到这个问题。)
  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 }

 

转载于:https://www.cnblogs.com/Spades7/p/8206671.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值