1、hashMap和ConcurrentHashMap的区别
-
ConcurrentHashMap是线程安全的,在并发的环境下不需要增加额外的同步
-
HashMap可以使用Collections.synchronizedMap(HashMap)来包装成为同步容器,使得HaspMap的作用几乎和Hashtable一样,每次对Map做修改操作的时候都会锁住这个Map对象。而ConcurrentHashMap会基于并发的等级来划分整个Map来达到线程安全,它只会锁住操作的那一段数据而不是整个Map都上锁。(Hashtable是jdk1的一个遗弃的类,它把所有方法都加上synchronized关键字来实现线程安全。所有的方法都同步这样造成多个线程访问效率特别低。Synchronized Map与HashTable差别不大,也是在并发中作类似的操作,两者的唯一区别就是Synchronized Map没被遗弃,它可以通过使用Collections.synchronizedMap()来包装Map作为同步容器使用。)
-
ConcurrentHashMap有很好的扩展性,在多线程环境下性能方面比做了同步的HashMap要好,但是在单线程的环境下,HashMap会比ConcurrentMap好一点。
2、List 和 Set 区别
相同点:List和Set都是继承自Collection接口,都可以用迭代的方式进行遍历。
不同点:
1.List的元素是有放入顺序的,元素可以重复。set的元素放入无顺序,元素不可用重复。
2.Set检索元素效率低下,删除和插入效率高。删除和插入不会引起元素位置的改变。
List检索元素效率高,删除和插入效率低。删除和插入会引起元素位置的改变,和数组类似可以动态增长。
注意:Set虽然无放入顺序,但元素在set中的位置是有该元素的HashCode决定的。其位置其实是固定的,加入Set 的Object必须定义equals()方法。
3、List 和 Map 区别
List是对象集合,允许对象重复。
Map是键值对的集合,不允许key重复。
4、Arraylist 与 LinkedList 区别
ArrayList是基于动态数组的数据结构,在内存中是连续存放的。查询效率高,插入和删除效率低。
LinkedList是链表结构,在内存中地址是任意存放的。插入和删除效率高,因为要移动指针所以查询性能低。
5、ArrayList 与 Vector 区别
1.Vactor是多线程安全的,Vector类中的很多方法都有synchronize进行修饰,导致Vector在效率上相对较低。
ArrayList是线程不安全的,效率相对较高。
2.两个都是采用线性连续空间存储元素,当扩容空间时,扩容方式不同。
3.Vector可以设置增长因子,而ArrayList不可以。
6、HashSet和HashMap区别
HashSet是线性结构,Set中的值不能重复。HashSet中元素的位置是由该元素的HashCode值决定的。
HashMap是键值对集合。实际上是一个“链表散列”的数据结构,即数组和链表的结合体。当多个key的HashCode值一样,value采用链表的结构来进行存储。
7、HashMap 的工作原理及代码实现
HashMap 在底层将 key-value 当成一个整体进行处理,这个整体就是一个 Entry 对象。HashMap 底层采用一个 Entry[] 数组来保存所有的 key-value 对,当需要存储一个 Entry 对象时,会根据hash算法来决定其在数组中的存储位置,再根据equals方法决定其在该数组位置上的链表中的存储位置;当需要取出一个Entry时,也会根据hash算法找到其在数组中的存储位置,再根据equals方法从该位置上的链表中取出该Entry。