面试之Java篇

集合

1.LinkedList和ArrayList的区别以及其应用场景

两者的区别:

  • LinkedList其内部数据结构为双向链表;ArrayList其内部数据结构为动态数组;
  • ArrayList是基于索引的数据结构,因此在数组中搜索和读取速度快,而LinkedList是需要遍历其链表来访问。
  • 相对ArrayList,LinkedList插入和删除更快,因为它不需要改变数组大小时,进行扩容操作,且不需要像ArrayList插入或删除后,需要挪动数组。
  • 但LinkedList需要更多的内存,因为ArrayList的每个索引位置都是实际的数据,而LinkedList中的每个节点需要存储实际数据和前后节点的位置。
    应用场景:
  • 当应用需要大量的随机访问时,采用ArrayList。
  • 当应用需要更多的插入和删除时,采用LinkedList。

并发

1. ConcurrentHashMap的实现原理

ConcurrentHashMap可以看作为线程安全的HashMap,用来替代HashTable,以提高性能。在JDK 1.8之前,其结构为Segment+数组+链表方法;在JDK 1.8之后,采用的是数组+链表+红黑树结构,采用的大量CAS方法和sychonized关键字来保证线程安全。

面试之Java篇_第1张图片
JDK1.8之前版本.png

JDK 1.7版本源码分析

JDK 1.8版本源码分析

2. cas原理
  • 对CAS的一点理解
  • ABA问题
3. 线程同步以及实现方法
  • 线程同步的目的是在多个线程同时访问互斥数据时,应该同步以保护数据,确保两个线程不会同时修改它。
  • 同步方法:a. 使用java.util.concurrent包提供的机制;b. 使用synchronized关键字;c. 采用Lock锁。
  • 应用场景:a. 尽量使用java.util.concurrent包提供的机制来实现同步,以避免不必要的错误;b. 在竞争不激烈的情况下,优先考虑synchronized关键字;c. 在竞争激烈的情况下,可以考虑Atomic和Lock锁机制。
面试之Java篇_第2张图片
同步类.png
3.逃逸分析
4. 锁原理
  • 锁的四种状态
  • 可重入锁
  • 自旋锁
  • 锁的优化
5. 进程与线程的区别
6. 读写锁(ReentrantReadWriteLock)
  • 读写锁的原理
  • 读写锁源码分析
  • CLH算法
7. 乐观锁和悲观锁

你可能感兴趣的:(面试之Java篇)