JAVA
(1)List 和 Set 的区别
1、List,Set都是继承自Collection接口
2、List特点:元素有放入顺序,元素可重复
Set特点:元素无放入顺序,元素不可重复
(注意:元素虽然无放入顺序,但是元素在set中的位置是有该元素的HashCode决定的,其位置其实是固定的)
3、List接口有三个实现类:LinkedList,ArrayList,Vector
(ArrayList这个类是类似数组形式的集合实例化,
而LinkedList类则是链表形式的实例化,具体的差别在于数据结构上面的不同
Vector 类非常类似ArrayList,两者的不同之处在于Vector是同步的方法,
在多线程操作的时候可能会抛出ConcurrentModificationException。)
Set接口有两个实现类:HashSet(底层由HashMap实现),LinkedHashSet
(2)HashSet 是如何保证不重复的
HashSet是哈希表结构,当一个元素要存入HashSet集合时,
首先通过自身的hashCode方法算出一个值,然后通过这个值查找元素在集合中的位置,
如果该位置没有元素,那么就存入。
如果该位置上有元素,那么继续调用该元素的equals方法进行比较,
如果equals方法返回为真,证明这两个元素是相同元素,则不存。
否则则在该位置上存储2个元素(一般不可能重复)
所以当一个自定义的对象想正确存入HashSet集合,那么应该重写Object的hashCode和equals
(3)HashMap 是线程安全的吗,为什么不是线程安全的(最好画图说明多线程环境下不安全)?
https://www.jianshu.com/p/2e89ab6ece15