https://www.cnblogs.com/lchzls/p/6714474.html
(一)、list和set的区别
1、List,Set都是继承自Collection接口
2、List特点:元素有放入顺序,元素可重复 ,Set特点:元素无放入顺序,元素不可重复,重复元素会覆盖掉,(元素虽然无放入顺序,但是元素在set中的位置是有该元素的HashCode决定的,其位置其实是固定的,加入Set 的Object必须定义equals()方法 ,另外list支持for循环,也就是通过下标来遍历,也可以用迭代器,但是set只能用迭代,因为他无序,无法用下标来取得想要的值。)
3.Set和List对比:
Set:检索元素效率低下,删除和插入效率高,插入和删除不会引起元素位置改变。
List:和数组类似,List可以动态增长,查找元素效率高,插入删除元素效率低,因为会引起其他元素位置改变。
参考地址:https://www.cnblogs.com/IvesHe/p/6108933.html
(二)、HashSet 是如何保证不重复的
总的来说,在向hashSet中add()元素时,判断元素是否存在的依据,不仅仅是hash码值就能够确定的,同时还要结合equals方法。
HashSet 类中的add()方法:
public boolean add(E e) {
return map.put(e, PRESENT)==null;
}
put()方法
public V put(K key, V value) {
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;
}
可以看到for循环中,遍历table中的元素,
1,如果hash码值不相同,说明是一个新元素,则存入;
如果没有元素和传入对象(也就是add的元素)的hash值相等,那么就认为这个元素在table中不存在,将其添加进table;
2,如果hash码值相同,且equals判断相等,说明元素已经存在,不存;
3,如果hash码值相同,且equals判断不相等,说明元素不存在,存;
如果有元素和传入对象的hash值相等,那么,继续进行equals()判断,如果仍然相等,那么就认为传入元素已经存在,不再添加,结束,否则仍然添加。
(三)、HashMap 是线程安全的吗,为什么不是线程安全的
参考:https://blog.csdn.net/chisunhuang/article/details/79041656