目录
2.01 ArrayList 和 Vector 的区别/异同?
2.02 ArrayList 和 LinkedList 的区别/异同?
2.04 HsahMap 和 Hashtable 的区别/异同?
2.07 ConcurrentHashMap 是如何保证线程安全的(线程安全的实现方式)?
2.08 ConcurrentHashMap 和 Hashtable 的区别/异同 ?
2.09 ConcurrentHashMap能完全替代Hashtable吗?
一、Java集合概述
1.1 什么是Java集合?
Java集合类存放于java.util包内,是一个用来存放数据的容器;
(这里的数据是一个个的对象,如果存入基本数据类型的数据,会自动装箱成包装类;并且集合存放的是对象的引用,而不是对象本身。)
1.2 集合主要有哪些?
集合主要分为 Collection 和 Map(映射) 接口;
而 Collection 接口又有 List(列表) 、Set(集)、Queue(队列) 子接口;
这些接口的主要实现及优缺点可以看图:
1.3 集合框架详解图
二、集合相关高频面试题
2.01 ArrayList 和 Vector 的区别/异同?
- Vector类 是List接口的古老实现类(JDK1.0就有了),ArrayList类 是List接口的主要的常用的实现类(JDK1.2新增的)。
- Vector类 的方法全都是同步的,两个线程可以安全的访问一个Vector对象;
但是如果一个线程访问Vector对象的话,要在同步操作上花费大量时间;
而 ArrayList 不是同步的,如果不需要保证线程的安全,建议使用ArrayList,效率较高;
(或者直接简单点说:Vector 线程安全但效率低,ArrayList 线程不安全但效率高。) - Vector扩容方式默认是 当前容量的1倍;ArrayList扩容是 当前容量×1.5+1 。
2.02 ArrayList 和 LinkedList 的区别/异同?
- ArrayList 底层使用的是数组实现,LinkedList 底层使用的是双向链表实现。
- ArrayList 随机查找和遍历速度快,插入删除速度慢;LinkedList 随机查找和遍历速度快,插入和删除速度快。
- ArrayList 插入和删除元素的速度会受插入位置的影响;LinkedList 插入和删除元素的速度不会受插入位置的影响。
- ArrayList 内存空间会耗费在列表后面的预留空间;LinkedList 内存空间会耗费在每个数据要多存储一个前驱和后继。
- ArrayList 需要扩容,扩容是 当前容量×1.5+1 ; LinkedList 无需扩容。
- ArrayList 和 LinkedList 都不是同步的,都是不保证线程安全。
2.03 HashMap的底层实现原理?
jdk7及jdk7之前
底层是用 数组+链表 来实现的;实现过程:
1. new HashMap() 之后,底层会创建一个长度为 16 的一维数组( Entry[] table )。
2. put 数据时( .put(key,value) ),会先调用 key 所在类的 hashCode 方法,计算出此key的哈希值,再将此哈希值经过处理计算后,得到该数据在数组table上的位置。
然后根据此位置来分情况判断是否存储:
情况一:
此位置为空, 直接在此位置上存储put的数据。
情况二:
此位置不为空,则说明此位置上已有一个或多个数据了(