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 中使用多态特性的方法主要有,实现一个接口,实现抽象类的一个方法,覆盖父类的一个方法。

多态的底层实现是动态绑定,即在运行时才把方法调用与方法实现关联起来。

动态绑定请看以下链接:

Java多态的底层原理

4.springBean的生命周期

实例化 -> 属性赋值 -> 初始化 -> 销毁

preview

  1. Spring启动,查找并加载需要被Spring管理的bean,进行Bean的实例化
  2. Bean实例化后对将Bean的引入和值注入到Bean的属性中
  3. 如果Bean实现了BeanNameAware接口的话,Spring将Bean的Id传递给setBeanName()方法
  4. 如果Bean实现了BeanFactoryAware接口的话,Spring将调用setBeanFactory()方法,将BeanFactory容器实例传入
  5. 如果Bean实现了ApplicationContextAware接口的话,Spring将调用Bean的setApplicationContext()方法,将bean所在应用上下文引用传入进来
  6. 如果Bean实现了BeanPostProcessor接口,Spring就将调用他们的postProcessBeforeInitialization()方法。
  7. 如果Bean 实现了InitializingBean接口,Spring将调用他们的afterPropertiesSet()方法。类似的,如果bean使用init-method声明了初始化方法,该方法也会被调用
  8. 如果Bean 实现了BeanPostProcessor接口,Spring就将调用他们的postProcessAfterInitialization()方法。
  9. 此时,Bean已经准备就绪,可以被应用程序使用了。他们将一直驻留在应用上下文中,直到应用上下文被销毁。
  10. 如果bean实现了DisposableBean接口,Spring将调用它的destory()接口方法,同样,如果bean使用了destory-method 声明销毁方法,该方法也会被调用。

一文读懂 Spring Bean 的生命周期

面试官:请你说一下 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延迟实例化;

BeanFactory和ApplicationContext的区别

posted @ 2021-11-01 14:49  x2245  阅读(32)  评论(0)    收藏  举报