HashSet<Object> hs = new HashSet<Object>();
WarpString ws1 = new WarpString("aaa");
WarpString ws2 = new WarpString("aaa");
String s1 = new String("aaa");
String s2 = new String("aaa");
hs.add(ws1);
hs.add(ws2);
hs.add(s1);
hs.add(s2);
System.out.println(hs.size());
打印结果是:3
但是不明白为什么,哪位可以帮忙指点指点?
WarpString ws1 = new WarpString("aaa");
WarpString ws2 = new WarpString("aaa");
String s1 = new String("aaa");
String s2 = new String("aaa");
hs.add(ws1);
hs.add(ws2);
hs.add(s1);
hs.add(s2);
System.out.println(hs.size());
打印结果是:3
但是不明白为什么,哪位可以帮忙指点指点?
你重写下 equals 方法 就会发现原因
HashSet.add 方法内用的是 equals 来比较2个对象的
看看源码就知道了
WarpString的二个视为不同
因为String默认有重写equals方法
而你自己的WarpString没重写equals方法
HashSet什么情况下用?为什么不用ArrayList?
集合的概念,元素唯一
String s1 = new String("aaa");
String s2 = new String("aaa");
hs.add(s1);
hs.add(s2);
因为hashset的add是通过equals比较的,所以s1.equals(s2)比较的是字符串内容,所以加入的是一个
然而
WarpString ws1 = new WarpString("aaa");
WarpString ws2 = new WarpString("aaa");
同样也是通过equals方法,因为是两个普通类对象,所以结果ws1,ws2是两个不同的对象,所以加入的是两个。最后打印出来的结果是3
if (key == null)
return putForNullKey(value);
int hash = hash(key.hashCode());
int i = indexFor(hash, table.length);
for (Entry<K,V> e = table[i]; e != null; e = e.next) {
Object k;
if (e.hash == hash && ((k = e.key) == key || key.equals(k))) {
V oldValue = e.value;
e.value = value;
e.recordAccess(this);
return oldValue;
}
} modCount++;
addEntry(hash, key, value, i);
return null;
}
重点在这行if (e.hash == hash && ((k = e.key) == key || key.equals(k)))
为毛错个大小写就不显示了,强烈鄙视下