Java集合框架相关知识整理

时间:2023-03-08 16:33:04

1、常见的集合有哪些?
  Collection接口和Map接口是所有集合框架的父接口
    Collection接口的子接口包括:Set接口和List接口
    Map接口的实现类主要有:HashMap、TreeMap、HashTable、ConcurrentHashMap以及Properties等
    Set接口的主要实现类有:HashSet、TreeSet、LinkedHashSet等
    List接口的主要实现类有:ArrayList、LinkedList、Stack、Vector等

2、HashMap和HashTable的区别?
     HashMap线程不安全,允许将Null值作为key 
     HashTable线程安全,使用了synchronized关键字修饰,不允许将null值设为key

3、HashMap的底层实现?
     在jdk8之前,其底层实现是数组+链表,jdk8之后使用了数组+链表+红黑树实现

4、ConcurrentHashMap与HashTable的区别?
     ConcurrentHashMap结合了HashMap和HashTable两者的优势,HashMap线程不安全,HashTable是线程安全的,但是hashTable在每次同步执行时都要锁住整个结构,而ConcurrentHashMap锁的方式是稍微细粒度的,ConcurrentHashMap将hash表分为16个桶,诸如get、put、remove等常用操作只锁住当前需要用到的桶。

5、List和Set的区别?
     List代表着有序且可以重复的集合
     Set代表着无序的且不可以重复的集合

6、List、Set、Map的初始容量和加载因子?
     ArrayList的初始容量是10,加载因子为0.5,扩容增量是原来容量的1.5倍,一次扩容后长度为15
     Vector的初始容量是10,加载因子为1,扩容增量是原来容量的2倍,一次扩容后长度为20
     HashMap和HashSet的初始容量是16,加载因子为0.75,扩容增量是元容量的2倍,一次扩容后长度为32

7、Java集合的快速失败机制“fail-fast”
     快速失败机制是java集合的一种错误检测机制,当多个线程对集合进行结构上的改变操作时,就有可能触发fail-fast机制
     例如:假设存在两个线程(线程A、线程B),线程A通过Iterator在遍历集合C中的元素,在这个时候线程B修改了集合C的结构(是结构上面的修改,而不是简单的修改集合元素的内容),那么这个时候程序就会抛出ConcurrentModificationException异常,从而触发fail-fast机制。
    原因:迭代器在遍历是直接访问集合中的内容,并且在遍历过程中使用一个modCount变量,集合在遍历期间如果结构发生变化,就会改变modCount的值。每当迭代器使用hasNext/next()遍历下一个元素之前,都会检查modCount变量是否为expectedmodCount值,如果一致就返回遍历,如果不一致就抛出异常,终止遍历。

8、ArrayList和Vector的区别
     vector是线程安全的,使用synchornized关键字修饰实现同步,ArrayList是线程不安全的。
     ArrayList和Vector都有一个相同的初始容量大小,为10,但是负载因子不同,ArrayList的负载因子是0.5,Vector的负载因子是1,所以每一次扩容ArrayList的长度为原来的1.5倍,Vector的长度为原来的2倍

9、如何去除vector中的重复元素
     HashSet set = new HashSet(vector);