java
- HashMap的八股(底层,链表/红黑树转换原因)
- HashTable和ConcurrentHashMap的底层实现
- ArrayList和LinkedList的区别和使用场景
- 线程池的参数及创建线程的方式
- volatile保证了什么(问了具体的内存屏障),volatile加在基本类型和对象上的区别
- synchronized和ReentrantLock区别和场景
- 垃圾回收的算法及详细介绍
- 反射的介绍与使用场景
- 两种动态代理的区别(现敲jdk方式)
- SpringBoot和Spring的区别,自动装配的原理
- SpringCloudAlibaba的组件介绍
答:
- hashmap 1.7 数组+链表 1.8 数组+链表/红黑树 之所以引入红黑树,是因为在链表过长的情况下,访问的时间复杂度是O(n),所以在链表长度大于8,数组长度大于64,会转换为红黑树。
- hashtable 和ConcurrentHashmap都是线程安全的Map类。hashmap底层的内部方法基本都经过了synchronized方法修饰,而ConcurrentHashmap1.7 和1.8实现方式都不同,1.7主要是用
segemant数组和hashEntry分段来处理的,对segment加锁,hashEntry数组里面有链表,1.8则是用Node数组和CAS加synchronized来保证线程安全,1.7使用的分段锁,锁的粒度大并发能力小,1.8使用CAS加syn锁机制粒度小并发度大。 - ArrayList 需要连续内存底层是数组,随机访问快,尾部插入删除性能可以,可以利用CPU缓存局部性原理。LinkedList底层是双向链表,随机访问慢,无需连续内存,头尾插入性能高。
场景若内存不连续可以使用LinkedList,其他情况用ArrayList最好。 - 线程池有7个参数:核心线程数、最大线程数、最长存活时间、最长存活时间单位、阻塞队列、创建线程工厂、拒绝策略。创建线程的方式有多种最常见的有、继承Thread类、实现Runnable接口、实现 Callable接口(有返回值)。。。使用lambda表达式来创建。
- 可见性和有序性,在每一个volatile读操作后面插入一个LoadLoad、一个LoadStore,在每一个volatile写操作前面加一个storestore后面加一个storeLoad,DCL双重检锁模式。
- synchronized是一个关键字、不用关心锁的释放、不能被打断、reentrantlock是一个类、必须手动释放锁、两者都是可重入的,一个依赖于JVM实现比较重量级。
- 常见垃圾收集算法有三种、标记清除、标记整理、标记复制、标记清除就是指标记需要清理的对象,垃圾回收时直接回收、会造成大量内存碎片分配不了导致垃圾回收提前进行。标记整理就是适用存活率较高的区域,将存活的对象移到一处,在清理,而标记复制就是将内存分为两块区域,垃圾回收时,将存活的对象移到另一处区域。
- 反射是框架的灵魂基础,因为他
赋予了我们在运行时分析类和执行类中方法的能力。通过反射可以获取一个类的所有属性和方法,还可以调用这些方法和属性。比如我们的动态代理就必须用反射,还用spring框架的注解。 - 区别 一个必须要接口、一个不用接口。JDK 动态代理只能代理实现了接口的类或者直接代理接口,而 CGLIB 可以代理未实现任何接口的类。
- springboot是基于spring的,简化了spring的配置.
- nacos 服务注册和配置中心 、openfegin远程调用服务、ribbon负载均衡、gateway网关配置、sentinel限流熔断组件、Seata分布式事务组件