java面试题--核心知识

发布时间 2023-04-26 10:14:16作者: 翊梦

一、HashMap和HashTable的区别?

二、HashMap有哪些线程安全的方式?

三、HashMap在扩容上有哪些优化?  难点

三、为什么ConcurrentHashMap是线程安全的?

四、java锁机制?

  1. 无锁
  2. 偏向锁
  3. 轻量级锁
  4. 重量级锁

五、对AQS 抽象队列同步器的理解?

https://baijiahao.baidu.com/s?id=1709429801289752198&wfr=spider&for=pc

  1. 基石:volatile
  2. CAS(Compare And Swap):
  3. 互斥锁EXCLUSIVE,可重入
  4. 共享锁SHARE
  5. FIFO队列

六、对ReentrantLock, ReentrantReadWriteLock、CountDownLatch的理解?

  1. ReentrantLock可重入的互斥锁。
  2. ReentrantReadWriteLock可重入的读写锁:
  3. CountDownLatch:用作线程计数。只有当线程全部执行完成,n=0时,才唤醒主线程。

七、说说对线程池的理解?

https://pdai.tech/md/java/thread/java-thread-x-juc-executor-ThreadPoolExecutor.html

 

八、String、StringBuilder、StringBuffer的问题汇总。

  1. StringBuilder\StringBuffer的区别?
    1. 两者都继承自AbstractStringBuilder.
    2. StringBuilder不是线程安全的,所以效率更高。
    3. StringBuffer的方法使用了synchronized关键字修饰,是线程安全的,但是效率低。
  2. String和StringBuilder/StringBuffer的区别?
    1. String 的值是不可变的。每次对String 的操作,都会生成新的String对象。
  3. 什么情况下用“+”运算符进行字符串连接比调用StringBuffer/StringBuilder 对象的append方法连接字符串性能更好?
    1. 看下面这个例子。

       反编译后的代码如下:

       “+”号使用StringBuilder处理。如果连接字符串行表达式很简单(如上面的顺序结构),那么"+"和StringBuilder基本是一样的。但是如果是使用循环来连接字符串,性能会产生很大的差距。

        反编译后的代码如下:

       可以看到,循环体内,每次循环都会生成一个StringBuiler对象。这样会造成资源浪费,并且效率要低。优化的方法是在循环体外声明StringBuiler。

 九、线程安全集合类有哪些?

java.util.concurrent.*包下的。

例如:ConcurrentHashMap; CopyOnWriteArrayList;  CopyOnWriteArraySet;

底层大都采用Lock锁(1.8的ConcurrentHashMap不使用Lock锁)保证线程安全的同时,效率也很高。

十、synchronized锁升级?