Set集合底层是底层结构是由数组+链表+红黑树。
存入元素不重复的原理:
set集合存入元素时,首先会根据hashcode方法计算出该元素的hash值,如果已经存在该hash值,则会调用eaqul方法,判断两个元素是否相同,相同则不存;如果hash值相同,元素不相同,则会形成链表直接把元素挂在已经存在的元素下边;如果hash值不相同则会直接存进去。
源码:
public boolean add(E e) {
return map.put(e, PRESENT)==null;
}
查看源码我们可以发现,HashSet其实是调用了map集合中的put方法来保证元素不会重复。
再点进去看看put源码:
public V put(K key, V value) {
return putVal(hash(key), key, value, false, true);
}
会发现这里面又调用了putVal方法和hash方法
public class HashMap<K,V> implements Map<K,V>{
//hash()方法是计算元素的哈希值,它底层是hashCode()方法
//如果传进来的元素是null,返回哈希值为0
//如果不是null,则按后面的表达式计算哈希值
static final int hash(Object key) {
int h;
return (key == null) ? 0 : (h = k