Set里的元素是不能重复的,这就是说用什么方法来区分重复与否呢? 是用==还是equals()? 它们有何区别
Set里的元素是不能重复的,那么用什么方法来区分重复与否呢? 是用==还是equals()? 它们有何区别?
网上的很多答案都是:
“Set里的元素是不能重复的,那么用iterator()方法来区分重复与否。equals()是判读两个Set是否相等。
equals()和==方法决定引用值是否指向同一对象equals()在类中被覆盖,为的是当两个分离的对象的内容和类型相配的话,返回真值。”
我感觉“用iterator()方法来区分重复与否”这句话不对吧,这不是用来循环的吗?
------解决思路----------------------
不管你怎么判断,都需要把set里的元素一个一个地拿出来对比一下,我觉得这句话的意思是,用iterator()方法来遍历set里已有的元素,把它们一个一个地拿出来,然后再做真正的对比。
------解决思路----------------------
当使用HashSet时,hashCode方法就会得到调用,判断已经存储在集合中的对象的hash code值是否与增加的对象的hash code值一致:
1. 如果不一致,直接加进去;
2. 如果一致,再进行equals方法的比较,equals如果返回true,表示对象已经加进去了,就不会再增加新的对象;否则加进去。
------解决思路----------------------
可以查下Set这个类的源码!! 它的子类HashSet 是用hashcode来区别的!
来循环遍历比较是否重复的
网上的很多答案都是:
“Set里的元素是不能重复的,那么用iterator()方法来区分重复与否。equals()是判读两个Set是否相等。
equals()和==方法决定引用值是否指向同一对象equals()在类中被覆盖,为的是当两个分离的对象的内容和类型相配的话,返回真值。”
我感觉“用iterator()方法来区分重复与否”这句话不对吧,这不是用来循环的吗?
------解决思路----------------------
不管你怎么判断,都需要把set里的元素一个一个地拿出来对比一下,我觉得这句话的意思是,用iterator()方法来遍历set里已有的元素,把它们一个一个地拿出来,然后再做真正的对比。
------解决思路----------------------
当使用HashSet时,hashCode方法就会得到调用,判断已经存储在集合中的对象的hash code值是否与增加的对象的hash code值一致:
1. 如果不一致,直接加进去;
2. 如果一致,再进行equals方法的比较,equals如果返回true,表示对象已经加进去了,就不会再增加新的对象;否则加进去。
------解决思路----------------------
可以查下Set这个类的源码!! 它的子类HashSet 是用hashcode来区别的!
public V put(K key, V value) {
if (key == null)
return putForNullKey(value);
int hash = hash(key);
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;
}
来循环遍历比较是否重复的