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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© \(^o^)/ 中级黑马   /  2014-4-23 23:21  /  1072 人查看  /  7 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 \(^o^)/ 于 2014-4-23 23:56 编辑
  1. HashSet hs=new HashSet();

  2. hs.add(new person("lisi01",11));
  3. hs.add(new person("lisi02",12));
  4. hs.add(new person("lisi03",13));
  5. hs.add(new person("lisi02",12));

  6. sop(hs.size());
复制代码

当第二个和第四个相同的时候打印出来的是3?

7 个回复

倒序浏览

set集合中不能存储重复的元素.自定义对象必须要重写hashCode()和equals()方法
所以你打印出集合的长度就是3.
回复 使用道具 举报 2 0
这个是HashSet的问题,主要是Person()类里重写了重写hashCode()和equals()方法,所以第二个lisi02覆盖了第一个
回复 使用道具 举报
结果仍然是4
hashset在增加数据的时候,会自动调用从object继承下来的hashcode方法和equals方法
如果没有重写这两个方法,就没有定义自己对象比较规则,而new一个对象的时候,哈希值是不一样的,
所以jvm判断没有相同对象,所以能够添加进去,故size() 结果是4
回复 使用道具 举报
结果应该是4;
简单的说就是,你new了4个不同的persion对象放到set里了。结果怎么可能是3呢。
回复 使用道具 举报
打印结果是不是3那就要看你Person类里有没有复写hasCode()和equals()这两个方法了。
在没有复写这两个方法的时候,打印结果是4。因为HashSet默认的比较方式是比较对象的哈希值。而new person("lisi02",12)这个对象被new了两次,也就是有两个person("lisi02",12),这两个对象都有自己不同的哈希值,所以会被HashSet认为是不同对象。想要这两个相同,就必须在pesron类中复习hasCode()和equals()方法。代码如下
  1. import java.util.HashSet;

  2. public class Demo {

  3.         /**
  4.          * @param args
  5.          */
  6.         public static void main(String[] args) {
  7.                 // TODO Auto-generated method stub
  8.                 HashSet hs=new HashSet();

  9.                 hs.add(new person("lisi01",11));

  10.                 hs.add(new person("lisi02",12));

  11.                 hs.add(new person("lisi03",13));

  12.                 hs.add(new person("lisi02",12));



  13.                 System.out.println(hs.size());

  14.         }

  15. }

  16. class person{
  17.          String name;
  18.          int age;
  19.          public person(String name,int age){
  20.                  
  21.                  this.name=name;
  22.                  this.age=age;
  23.          }
  24.         @Override
  25.         public int hashCode() {
  26.                 final int prime = 31;
  27.                 int result = 1;
  28.                 result = prime * result + age;
  29.                 result = prime * result + ((name == null) ? 0 : name.hashCode());
  30.                 return result;
  31.         }
  32.         @Override
  33.         public boolean equals(Object obj) {
  34.                 if (this == obj)
  35.                         return true;
  36.                 if (obj == null)
  37.                         return false;
  38.                 if (getClass() != obj.getClass())
  39.                         return false;
  40.                 person other = (person) obj;
  41.                 if (age != other.age)
  42.                         return false;
  43.                 if (name == null) {
  44.                         if (other.name != null)
  45.                                 return false;
  46.                 } else if (!name.equals(other.name))
  47.                         return false;
  48.                 return true;
  49.         }
  50.          
  51.          
  52. }
复制代码

复写了这两个方法之后打印出来的结果就是3了,不复习的话打印结果就是4

评分

参与人数 1技术分 +1 收起 理由
枫儿 + 1 赞一个!

查看全部评分

回复 使用道具 举报
本帖最后由 清风夜独醉 于 2014-4-24 00:09 编辑

结果还是4因为person每new一个都是有不同的引用的,虽然里面我们看到的内容一样,但是在内存中他们的hashcode不同,是完全不同的两个对象,所以放在hashset中被视为两个完全不同的对象,结果依然是4
回复 使用道具 举报
size()表示集合的个数(长度),HashSet不能不能重复元素,
自定义对象必须要重写hashCode()和equals()方法
所以长度就是3.
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马