标签:
SiteBean site1 = new SiteBean("http://www.yjbys.com/", ""); SiteBean site2 = new SiteBean("http://www.yjbys.com/", ""); Set<SiteBean> aaSet = new HashSet<>(); aaSet.add(site1); aaSet.add(site2); System.out.println(site1 == site2); System.out.println(site1.equals(site2)); System.out.println(site1.hashCode() == site2.hashCode()); SiteBean site3 = new SiteBean("http://www.yjby1s.com/11", ""); SiteBean site4 = new SiteBean("http://www.yjby1s.com/11", ""); aaSet.add(site3); aaSet.add(site4);
SiteBean 重写了hashCode和equals方法,代码如下: //比较的是域名 @Override public int hashCode() { return siteUrl.hashCode(); } //比较的是域名 @Override public boolean equals(Object obj) { if (obj == null) { return false; } if (getClass() != obj.getClass()) { return false; } final SiteBean siteBean = (SiteBean) obj; return Objects.equals(siteUrl, siteBean.siteUrl); }
输出如下:
false true true
且set中元素的个数是2.
set内部实现实际是map,在处理map的key的时候调用了hashcode方法,代码如下
static final int hash(Object key) { int h; return (key == null) ? 0 : (h = key.hashCode()) ^ (h >>> 16); }
调用了hashcode方法方法之后就去调用了equals方法,所以set的元素重复性是根据equals来判断的。
下面尝试不重写hashcode方法:
输出:
false true false
且set中元素的个数是4
下面尝试不重写hashcode和equals方法:
输出:
false
false
false
且set中元素的个数是4
作者:欧初权
转载注明:http://www.cnblogs.com/langtianya/p/4421582.html
判断Set里的元素是否重复、==、equals、hashCode方法研究-代码演示
标签:
原文地址:http://www.cnblogs.com/langtianya/p/4421582.html