2021.11.1 面试总结
1.用户线程和守护线程区别
在Java中通常有两种线程:用户线程和守护线程(也被称为服务线程)
通过Thread.setDaemon(false)设置为用户线程。
通过Thread.setDaemon(true)设置为守护线程。
线程属性的设置要在线程启动之前,否则会报IllegalThreadStateException异常,如果不设置线程属性,那么默认为用户线程。
守护线程:是一种特殊的线程,在后台默默地完成一些系统性的服务,比如垃圾回收线程、JIT线程都是守护线程。
用户线程:可以理解为是系统的工作线程,它会完成这个程序需要完成的业务操作。如果用户线程全部结束了,意味着程序需要完成的业务操作已经结束了,系统可以退出了。所以当系统只剩下守护进程的时候,java虚拟机会自动退出。
用户线程和守护线程的区别:
1.主线程结束后用户线程还会继续运行,JVM存活
2.如果没有用户线程,都是守护线程,那么JVM结束(所有的线程都会结束)。
2.递归和循环区别
针对需要重复地多次计算相同的问题,通常可以选择递归或者循环两种不同的方法。
- 递归:是在一个函数的内部调用这个函数本身。
优点:代码简洁、清晰,并且容易验证正确性。
缺点:
1、它的运行需要较多次数的函数调用,如果调用层数比较深,每次都要创建新的变量,需要增加额外的堆栈处理,会对执行效率有一定影响,占用过多的内存资源。
2、递归算法解题的运行效率较低。在递归调用的过程中系统为每一层的返回点、局部变量等开辟了栈来储存。递归次数过多容易造成栈溢出等
注意:递归就是在过程或函数里调用自身;使用递归策略时要注意的几个条件
1、必须有一个明确的递归结束条件,称为递归出口。
2、递归需要有边界条件、递归前进段和递归返回段。
3、当边界条件不满足时,递归前进。当边界条件满足时,递归返回。
- 循环:是通过设置计算的初始值及终止条件,在一个范围内重复计算。
优点:速度快,结构简单。
缺点:并不能解决所有的问题。有的问题适合使用递归而不是循环。如果使用循环并不困难的话,最好使用循环。
3.Java多态的底层原理
作为一门面向对象语言,Java 拥有封装、继承、多态三大特性。多态就是允许不同类的对象对同一消息做出响应。基于多态,可以消除一些类型耦合关系,实现可替换、可扩充。Java 中使用多态特性的方法主要有,实现一个接口,实现抽象类的一个方法,覆盖父类的一个方法。
多态的底层实现是动态绑定,即在运行时才把方法调用与方法实现关联起来。
动态绑定请看以下链接:
4.springBean的生命周期
实例化 -> 属性赋值 -> 初始化 -> 销毁

- Spring启动,查找并加载需要被Spring管理的bean,进行Bean的实例化
- Bean实例化后对将Bean的引入和值注入到Bean的属性中
- 如果Bean实现了BeanNameAware接口的话,Spring将Bean的Id传递给setBeanName()方法
- 如果Bean实现了BeanFactoryAware接口的话,Spring将调用setBeanFactory()方法,将BeanFactory容器实例传入
- 如果Bean实现了ApplicationContextAware接口的话,Spring将调用Bean的setApplicationContext()方法,将bean所在应用上下文引用传入进来
- 如果Bean实现了BeanPostProcessor接口,Spring就将调用他们的postProcessBeforeInitialization()方法。
- 如果Bean 实现了InitializingBean接口,Spring将调用他们的afterPropertiesSet()方法。类似的,如果bean使用init-method声明了初始化方法,该方法也会被调用
- 如果Bean 实现了BeanPostProcessor接口,Spring就将调用他们的postProcessAfterInitialization()方法。
- 此时,Bean已经准备就绪,可以被应用程序使用了。他们将一直驻留在应用上下文中,直到应用上下文被销毁。
- 如果bean实现了DisposableBean接口,Spring将调用它的destory()接口方法,同样,如果bean使用了destory-method 声明销毁方法,该方法也会被调用。
面试官:请你说一下 Bean 的生命周期 - 知乎 (zhihu.com)
5.BeanFactory和ApplicationContext的区别
BeanFactory:
是Spring里面最低层的接口,提供了最简单的容器的功能,只提供了实例化对象和拿对象的功能;
ApplicationContext:
应用上下文,继承BeanFactory接口,它是Spring的一各更高级的容器,提供了更多的有用的功能;
1.国际化(MessageSource)
2.访问资源,如URL和文件(ResourceLoader)
3.载入多个(有继承关系)上下文 ,使得每一个上下文都专注于一个特定的层次,比如应用的web层
4.消息发送、响应机制(ApplicationEventPublisher)
5.AOP(拦截器)
两者装载bean的区别
BeanFactory:
BeanFactory在启动的时候不会去实例化Bean,中有从容器中拿Bean的时候才会去实例化;
ApplicationContext:
ApplicationContext在启动的时候就把所有的Bean全部实例化了。它还可以为Bean配置lazy-init=true来让Bean延迟实例化;

浙公网安备 33010602011771号