集合
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关键字来保证线程安全。
2. cas原理
3. 线程同步以及实现方法
- 线程同步的目的是在多个线程同时访问互斥数据时,应该同步以保护数据,确保两个线程不会同时修改它。
- 同步方法:a. 使用java.util.concurrent包提供的机制;b. 使用synchronized关键字;c. 采用Lock锁。
- 应用场景:a. 尽量使用java.util.concurrent包提供的机制来实现同步,以避免不必要的错误;b. 在竞争不激烈的情况下,优先考虑synchronized关键字;c. 在竞争激烈的情况下,可以考虑Atomic和Lock锁机制。