一、HashMap和HashTable的区别?
二、HashMap有哪些线程安全的方式?
三、HashMap在扩容上有哪些优化? 难点
三、为什么ConcurrentHashMap是线程安全的?
四、java锁机制?
- 无锁
- 偏向锁
- 轻量级锁
- 重量级锁
五、对AQS 抽象队列同步器的理解?
https://baijiahao.baidu.com/s?id=1709429801289752198&wfr=spider&for=pc
- 基石:volatile
- CAS(Compare And Swap):
- 互斥锁EXCLUSIVE,可重入
- 共享锁SHARE
- FIFO队列
六、对ReentrantLock, ReentrantReadWriteLock、CountDownLatch的理解?
- ReentrantLock可重入的互斥锁。
- ReentrantReadWriteLock可重入的读写锁:
- CountDownLatch:用作线程计数。只有当线程全部执行完成,n=0时,才唤醒主线程。
七、说说对线程池的理解?
https://pdai.tech/md/java/thread/java-thread-x-juc-executor-ThreadPoolExecutor.html
八、String、StringBuilder、StringBuffer的问题汇总。
- StringBuilder\StringBuffer的区别?
- 两者都继承自AbstractStringBuilder.
- StringBuilder不是线程安全的,所以效率更高。
- StringBuffer的方法使用了synchronized关键字修饰,是线程安全的,但是效率低。
- String和StringBuilder/StringBuffer的区别?
- String 的值是不可变的。每次对String 的操作,都会生成新的String对象。
- 什么情况下用“+”运算符进行字符串连接比调用StringBuffer/StringBuilder 对象的append方法连接字符串性能更好?
- 看下面这个例子。
反编译后的代码如下:
“+”号使用StringBuilder处理。如果连接字符串行表达式很简单(如上面的顺序结构),那么"+"和StringBuilder基本是一样的。但是如果是使用循环来连接字符串,性能会产生很大的差距。
反编译后的代码如下:
可以看到,循环体内,每次循环都会生成一个StringBuiler对象。这样会造成资源浪费,并且效率要低。优化的方法是在循环体外声明StringBuiler。
- 看下面这个例子。
九、线程安全集合类有哪些?
java.util.concurrent.*包下的。
例如:ConcurrentHashMap; CopyOnWriteArrayList; CopyOnWriteArraySet;
底层大都采用Lock锁(1.8的ConcurrentHashMap不使用Lock锁)保证线程安全的同时,效率也很高。
十、synchronized锁升级?
标签:面试题,java,String,--,StringBuilder,线程,StringBuffer,HashMap From: https://www.cnblogs.com/aleda-territory/p/17317676.html