Java面试题
1、Spring Cloud
1.1 Spring cloud 注册中心的原理?
1.2 Spring cloud 熔断限流的原理
熔断本质上是做快速失败,防止级联故障引起雪崩。它的主要采用的手段是基于断路器的设计模式。
断路器有基本模式和扩展模式。
基本模式中,断路器由两个状态和一个动作组成:断路器打开状态、断路器关闭状态和跳闸动作。在断路器关闭状态下,请求过来每次都要先经由跳闸动作,由跳闸动作判断是否需要将状态改成断路器打开状态。断路器打开状态下,请求直接执行快速失败的动作,不会向后请求。
扩展模式中,断路器增加了一个半开状态,它允许有限数量的请求通过,如果执行成功,恢复到关闭状态;如果失败,则恢复到开放,然后重启定时器,一段时间后再用半开状态来尝试。扩展模式可以半自动化的进行熔断恢复,避免了基本模式中,一旦断路器被打开完全依赖人工判断是否恢复的弊端。
2、spring面试题
2.1 Spring 支持的几种 bean 的作用域。
- singleton: bean 在每个 Springioc 容器中只有一个实例。
- prototype:一个 bean 的定义可以有多个实例。
- request:每次 http 请求都会创建一个 bean,该作用域仅在基于 web 的
SpringApplicationContext 情形下有效。 - session:在一个 HTTPSession 中,一个 bean 定义对应一个实例。该作用域仅在基于 web的 SpringApplicationContext 情形下有效。
- global-session:在一个全局的 HTTPSession 中,一个 bean 定义对应一个实例。该作用域仅在基于 web 的 SpringApplicationContext 情形下有效。
缺省的 Springbean 的作用域是 Singleton.
2.2 Spring 框架中的单例 bean 是线程安全的吗?
不,Spring 框架中的单例 bean 不是线程安全的。
2.3 解释 Spring 框架中 bean 的生命周期。
- Spring 容器从 XML 文件中读取 bean 的定义,并实例化 bean。
- Spring 根据 bean 的定义填充所有的属性。
- 如果 bean 实现了 BeanNameAware 接口,Spring 传递 bean 的 ID 到 setBeanName 方法。
- 如果 Bean 实现了 BeanFactoryAware 接口,Spring 传递 beanfactory 给 setBeanFactory
方法。 - 如果有任何与 bean 相关联的 BeanPostProcessors,Spring 会在
postProcesserBeforeInitialization()方法内调用它们。 - 如果 bean 实现 IntializingBean 了,调用它的 afterPropertySet 方法,如果 bean 声明
了初始化方法,调用此初始化方法。 - 如果有 BeanPostProcessors 和 bean 关联,这些 bean 的
postProcessAfterInitialization()方法将被调用。 - 如果 bean 实现了 DisposableBean,它将调用 destroy()方法。
2.4 哪些是重要的 bean 生命周期方法?你能重载它们吗?
有两个重要的 bean 生命周期方法,
第一个是 setup,它是在容器加载 bean 的时候被调用。
第二个方法是 teardown 它是在容器卸载类的时候被调用。
Thebean 标签有两个重要的属性(init-method 和 destroy-method)。用它们你可以自己定
制初始化和注销方法。它们也有相应的注解(@PostConstruct 和@PreDestroy)。
2.5 什么是 Spring 的内部 bean?
当一个 bean 仅被用作另一个 bean 的属性时,它能被声明为一个内部 bean,为了定义
innerbean,在Spring的基于XML的配置元数据中,可以在或
元素内使用元素,内部 bean 通常是匿名的,它们的 Scope 一般是 prototype。
2.6 什么是 bean 装配?
2.7 解释不同方式的自动装配。
有五种自动装配的方式,可以用来指导 Spring 容器用自动装配方式来进行依赖注入。
- no:默认的方式是不进行自动装配,通过显式设置 ref 属性来进行装配。
- byName:通过参数名自动装配,Spring 容器在配置文件中发现 bean 的 autowire 属性被
设置成 byname,之后容器试图匹配、装配和该 bean 的属性具有相同名字的 bean。 - byType::通过参数类型自动装配,Spring 容器在配置文件中发现 bean 的 autowire 属
性被设置成 byType,之后容器试图匹配、装配和该 bean 的属性具有相同类型的 bean。
如果有多个 bean 符合条件,则抛出错误。 - constructor:这个方式类似于 byType,但是要提供给构造器参数,如果没有确定的带
参数的构造器参数类型,将会抛出异常。 - autodetect:首先尝试使用 constructor 来自动装配,如果无法工作,则使用 byType 方
式。
@Resource注解使用的是byName 方式注入,
2.9 springboot启动流程?自动装配原理?
SpringBoot启动流程解析
SPRINGBOOT启动流程及其原理
spring启动流程中的自动装配模块源码:
SpringApplication$run()
SpringApplication$getRunListeners()
SpringApplication$getSpringFactoriesInstances()
SpringApplication$getSpringFactoriesInstances()
SpringFactoriesLoader$loadFactories()
SpringFactoriesLoader$loadFactoryNames()
SpringFactoriesLoader$loadSpringFactories()
9、
10、
3、Java集合
3.1 Map
3.1.1 HashMap的put和get方法原理
参考:
HashMap的put和get方法原理
HashMap 得get put 方法实现原理
put方法原理:
是我们插入时会调用得方法,当我们调用.put(k,v)得时候,首先会把k,v封装到一个node节点中,然后调用k的hashCode方法得到hash值,通过hash函数,将hash值转换为数组下标,如果此下标对应得位置上没有元素,则将节点存到该位置,如果有链表,则会拿k去与链表上得每个节点得k去做比较,相同得话就覆盖此链表上得节点,全部不同得话就会,在此链表尾部,新建一个新的节点(k,v得node节点)。这样就完成了一次插入。
get方法原理:
我们查询的时候调用得方法,首先会调用k得hashcode方法,得到hash值,然后通过hash函数将hash值转换为数组下标,去该下标中看有没有元素,没有得话返回null,如果该下标对应得位置有单链表,则会去链表拿k去和单链表得每个节点得k做对比,如果有相同得则返回,该节点得值,如果全部比完后没有相同得则返回null,此为一次查询。
3.1.2 hashMap为什么二倍扩容详解?
参考:
hashMap为什么二倍扩容详解
3.1.3 HashMap如何扩容?
4、Java多线程
4.1.1、java 中 wait 和 sleep 方法的不同?
最大的不同是在等待时 wait 会释放锁,而 sleep 一直持有锁。Wait 通常被用于线程间交互,sleep 通常被用于暂停执行。
4.1.2 多线程出现死锁的情况,如何解决
4.1.3 线程中的 shutdown 和 shutdownNow 的方法的区别?
线程池中shutdown()和shutdownNow()方法的区别
java线程池的shutdown和shutdownNow方法的异同
4.1.4 ReentrantLock的底层原理
ReentrantLock主要利用CAS+AQS队列来实现。
4、
5、
6、
7、
8、
9、
10、
5、数据库
5.1 mysql
5.1.1 mysql存储结构有哪些?默认的存储结构是什么?
索引是一种加快查询速度的数据结构,常用索引结构有hash、B-Tree和B+Tree
Mysql选择用B+Tree数据结构。