经典大厂面试题
1、ArrayList的JDK1.8之前与之后的实现区别
- JDK1.6 : ArrayList像饿汉式,直接创建一个初始化容量为10的数组。缺点就是占用空间较大
- JDK1.7 & JDK1.8 : ArrayList像懒汉式,一开始创建一个长度为0的数组,当添加第一个元素时再创 建一个初始容量为10 的数组
2、List 和 Map 区别?
Map集合
- 双列集合 : 一次存一对
- key是不允许重复的,value可以重复
- 一个key只能对应一个值value
- Map集合三兄弟 : HashMap【无序集合】、LinkedHashMap【有序集合】、TreeMap【有序集 合,自带排序能力】
List集合
- 单列集合 : 一次存一个
- 有序集合
- 元素可以重复
- 带索引
- List集合主要有两个实现类 : ArrayList和LinkedList
3、Array 和 ArrayList 有何区别?什么时候更适合用Array?
区别:
- Array可以容纳基本类型和对象,而 ArrayList 只能容纳对象【底层是一个对象数组】。
- Array指定大小的固定不变,而ArrayList大小是动态的,可自动扩容。
- Array没有ArrayList 方法多。
尽管 ArrayList 明显是更好的选择,但也有些时候 Array 比较好用,比如下面的2种情况。 1、如果列表的大小已经指定,大部分情况下是存储和遍历它们 2、基本数据类型使用Array更合适。
4、ArrayList 与 LinkedList 区别?
ArrayList
- 优点:ArrayList 是实现了基于动态数组的数据结构,因为地址连续,一旦数据存储好了,查询操 作效率会比较高(在内存里是连着放的)。查询快,增删相对慢
- 缺点:因为地址连续,ArrayList 要移动数据,所以插入和删除操作效率比较低。
LinkedList
- 优点:LinkedList 基于链表的数据结构,地址是任意的,所以在开辟内存空间的时候不需要等一个 连续的地址。对于新增和删除操作 add 和 remove ,LinedList 比较占优势。LinkedList 适用于要 头尾操作或插入指定位置的场景。
- 缺点:因为 LinkedList 要移动指针,所以查询操作性能比较低。查询慢,增删快
适用场景分析:
- 当需要对数据进行对随机访问的情况下,选用 ArrayList 。
- 当需要对数据进行多次增加删除修改时,采用 LinkedList 。
当然,绝大数业务的场景下,使用 ArrayList 就够了。主要是,注意 : 最好避免 ArrayList 扩容,以 及非顺序的插入。
ArrayList 是如何扩容的?
如果通过无参构造的话,初始数组容量为 0 ,当真正对数组进行添加时,才真正分配容量。每次按 照 1.5 倍(位运算)的比率通过 copeOf 的方式扩容。
重点是 1.5 倍扩容,这是和 HashMap 2 倍扩容不同的地方。
5、ArrayList 集合加入 10万条数据,应该怎么提高效率?
ArrayList 的默认初始容量为 10 ,要插入大量数据的时候需要不断扩容,而扩容是非常影响性能的。因 此,现在明确了 10 万条数据了,我们可以直接在初始化的时候就设置 ArrayList 的容量! 这样就可以提高效率了~
6、ArrayList 与 Vector 区别?
ArrayList 和 Vector 都是用数组实现的,主要有这么三个区别:
-
Vector 是多线程安全的,线程安全就是说多线程访问同一代码,不会产生不确定的结果,而 ArrayList 不是。这个可以从源码中看出,Vector 类中的方法很多有 synchronized 进行修饰,这 样就导致了 Vector 在效率上无法与 ArrayList 相比。
Vector 是一种老的动态数组,是线程同步的,效率很低,一般不赞成使用。
-
两个都是采用的线性连续空间存储元素,但是当空间不足的时候,两个类的增加方式不同。
-
Vector 可以设置增长因子,而 ArrayList 不可以,ArrayList集合没有增长因子。
适用场景分析: 1、Vector 是线程同步的,所以它也是线程安全的,而 ArrayList 是线程无需同步的,是不安全 的。如果不考虑到线程的安全因素,一般用 ArrayList 效率比较高。 实际场景下,如果需要多线程访问安全的数组,使用 CopyOnWriteArrayList 。
\