经典大厂面试题

126 阅读4分钟

经典大厂面试题

1、ArrayList的JDK1.8之前与之后的实现区别

  • JDK1.6 : ArrayList像饿汉式,直接创建一个初始化容量为10的数组。缺点就是占用空间较大

image.png

  • JDK1.7 & JDK1.8 : ArrayList像懒汉式,一开始创建一个长度为0的数组,当添加第一个元素时再创 建一个初始容量为10 的数组

image.png

2、List 和 Map 区别?

image.png

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 都是用数组实现的,主要有这么三个区别:

  1. Vector 是多线程安全的,线程安全就是说多线程访问同一代码,不会产生不确定的结果,而 ArrayList 不是。这个可以从源码中看出,Vector 类中的方法很多有 synchronized 进行修饰,这 样就导致了 Vector 在效率上无法与 ArrayList 相比。

    Vector 是一种老的动态数组,是线程同步的,效率很低,一般不赞成使用。

  2. 两个都是采用的线性连续空间存储元素,但是当空间不足的时候,两个类的增加方式不同。

  3. Vector 可以设置增长因子,而 ArrayList 不可以,ArrayList集合没有增长因子。

适用场景分析: 1、Vector 是线程同步的,所以它也是线程安全的,而 ArrayList 是线程无需同步的,是不安全 的。如果不考虑到线程的安全因素,一般用 ArrayList 效率比较高。 实际场景下,如果需要多线程访问安全的数组,使用 CopyOnWriteArrayList 。

\