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

Posted spades7

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了往set里面put一个学生对象,然后将这个学生对象的学号改了,再put进去,可以放进set么?并讲出为什么相关的知识,希望对你有一定的参考价值。

往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 }

 

以上是关于往set里面put一个学生对象,然后将这个学生对象的学号改了,再put进去,可以放进set么?并讲出为什么的主要内容,如果未能解决你的问题,请参考以下文章

E. Two Teams(线段树+链表)

冒泡实现ArrayList里面的对象排序

@ManyToMany的学习

面向对象:简单的学生管理系统

深入理解带参方法-----对象作为参数的方法

struts2和hibernate 传值问题和实体类设计问题