黑马程序员技术交流社区
标题:
size()相关问题
[打印本页]
作者:
\(^o^)/
时间:
2014-4-23 23:21
标题:
size()相关问题
本帖最后由 \(^o^)/ 于 2014-4-23 23:56 编辑
HashSet hs=new HashSet();
hs.add(new person("lisi01",11));
hs.add(new person("lisi02",12));
hs.add(new person("lisi03",13));
hs.add(new person("lisi02",12));
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()方法。代码如下
import java.util.HashSet;
public class Demo {
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
HashSet hs=new HashSet();
hs.add(new person("lisi01",11));
hs.add(new person("lisi02",12));
hs.add(new person("lisi03",13));
hs.add(new person("lisi02",12));
System.out.println(hs.size());
}
}
class person{
String name;
int age;
public person(String name,int age){
this.name=name;
this.age=age;
}
@Override
public int hashCode() {
final int prime = 31;
int result = 1;
result = prime * result + age;
result = prime * result + ((name == null) ? 0 : name.hashCode());
return result;
}
@Override
public boolean equals(Object obj) {
if (this == obj)
return true;
if (obj == null)
return false;
if (getClass() != obj.getClass())
return false;
person other = (person) obj;
if (age != other.age)
return false;
if (name == null) {
if (other.name != null)
return false;
} else if (!name.equals(other.name))
return false;
return true;
}
}
复制代码
复写了这两个方法之后打印出来的结果就是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