黑马程序员技术交流社区

标题: size()相关问题 [打印本页]

作者: \(^o^)/    时间: 2014-4-23 23:21
标题: size()相关问题
本帖最后由 \(^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?
作者: 悠然丶    时间: 2014-4-23 23:41

set集合中不能存储重复的元素.自定义对象必须要重写hashCode()和equals()方法
所以你打印出集合的长度就是3.

作者: Dijkstra    时间: 2014-4-23 23:45
这个是HashSet的问题,主要是Person()类里重写了重写hashCode()和equals()方法,所以第二个lisi02覆盖了第一个
作者: 四川男人    时间: 2014-4-23 23:46
结果仍然是4
hashset在增加数据的时候,会自动调用从object继承下来的hashcode方法和equals方法
如果没有重写这两个方法,就没有定义自己对象比较规则,而new一个对象的时候,哈希值是不一样的,
所以jvm判断没有相同对象,所以能够添加进去,故size() 结果是4
作者: 清风夜独醉    时间: 2014-4-23 23:54
结果应该是4;
简单的说就是,你new了4个不同的persion对象放到set里了。结果怎么可能是3呢。
作者: igi9009    时间: 2014-4-24 00:04
打印结果是不是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
作者: 清风夜独醉    时间: 2014-4-24 00:07
本帖最后由 清风夜独醉 于 2014-4-24 00:09 编辑

结果还是4因为person每new一个都是有不同的引用的,虽然里面我们看到的内容一样,但是在内存中他们的hashcode不同,是完全不同的两个对象,所以放在hashset中被视为两个完全不同的对象,结果依然是4

作者: 程序爱好者    时间: 2014-4-24 00:16
size()表示集合的个数(长度),HashSet不能不能重复元素,
自定义对象必须要重写hashCode()和equals()方法
所以长度就是3.




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2