集合框架库常见面试题

1.ArrayDeque、Stack、LinkedList区别

底层数据存储方式:ArrayDeque是长度为16的数组,Stack是长度为10的数组,LinkedList是链表. 线程安全:三个中只有Stack是线程安全的,因为他继承了Vector接口. 使用场景: 1.频繁的插入、删除操作:LinkedList 2.频繁的随机访问操作:ArrayDeque 3.未知的初始数据量:LinkedList

2.ArrayList LininkedList Vector的区别

底层数据结构:ArrayList是长度为10的数组,Vector是长度为10的数组,LinkedList是链表.ArrayList是在第一次添加元素时进行扩容,在构造函数中赋值一个空数组. 扩容机制:ArrayList是1.5倍扩容,Vector是2倍扩容,LinkedList不需要扩容. 线程安全:只有Vector是线程安全的. 使用上: 1.频繁的插入、删除操作:LinkedList 2.频繁的随机访问操作:ArrayList

3.Java并发修改异常 ConcurrentModificationException

ConcurrentModificationException: “modCount 不等于 expectedModCount”,则抛出ConcurrentModificationException异常,产生fail-fast事件。 产生原因:无论是add()、remove(),还是clear(),只要涉及到修改集合中的元素个数时,都会改变modCount的值.当多个线程对同一个集合进行操作的时候,某线程访问集合的过程中,该集合的内容被其他线程所改变(即其它线程通过add、remove、clear等方法,改变了modCount的值);这时,就会抛出ConcurrentModificationException异常,产生fail-fast事件。 解决办法:使用java.util.concurrent包下的CopyOnWriteArrayList. 为什么使用CopyOnWriteArrayList就能解决问题? (01) 和ArrayList继承于AbstractList不同,CopyOnWriteArrayList没有继承于AbstractList,它仅仅只是实现了List接口。 (02) ArrayList的iterator()函数返回的Iterator是在AbstractList中实现的;而CopyOnWriteArrayList是自己实现Iterator。 (03) ArrayList的Iterator实现类中调用next()时,会“调用checkForComodification()比较‘expectedModCount’和‘modCount’的大小”;但是,CopyOnWriteArrayList的Iterator实现类中,没有所谓的checkForComodification(),更不会抛出ConcurrentModificationException异常!

4.HashSet、LinkedHashSet、TreeSet之间的区别

HashSet是用哈希表实现的,元素是无序的,添加,删除操作的时间复杂度都是O(1),TreeSet底层是红黑树,元素是有序的,添加、删除操作时间复杂度为O(log(n)).LinkedHashSet是介于HashSet 和 TreeSet之间,内部是一个双向链表结构,所以它的插入是有序的,时间复杂度是O(1)。

5.HashMap底层结构(数据结构 + put + hash算法)

JDK1.7 之前使用头插法、JDK 1.8 使用尾插法

static final int hash(Object key) {
          
   
        int h;
        return (key == null) ? 0 : (h = key.hashCode()) ^ (h >>> 16);
    }

^按位异或运算,只要位不同结果为1,不然结果为0; 异或运算能更好的保留各部分的特征,如果采用&运算计算出来的值会向1靠拢,采用|运算计算出来的值会向0靠拢

6.HashMap、LinkedHashMap、TreeMap三者之间的区别和联系?

1.LinkedHashMap是继承于HashMap,是基于HashMap和双向链表来实现的。 2.HashMap无序;LinkedHashMap有序,可分为插入顺序和访问顺序两种。如果是访问顺序,那put和get操作已存在的Entry时,都会把Entry移动到双向链表的表尾(其实是先删除再插入)。 3.LinkedHashMap存取数据,还是跟HashMap一样使用的Entry[]的方式,双向链表只是为了保证顺序。 4.LinkedHashMap是线程不安全的。 5.TreeMap主要是按照顺序进行存储数据.

7.Java当中的四种引用

1)强引用 A a = new A(); a是强引用,gc永远不会被引用的对象 2)软引用 SoftReference 系统将要发生内存溢出的异常,会讲软引用对象列入回收范围内进行回收 3)弱引用 WeakReference 被弱引用关联的对象只能够生存到下一次垃圾回收之前 4)虚引用 PhantomReference isEnqueued获取到当前被虚引用关联的对象是否被回收

经验分享 程序员 微信小程序 职场和发展