java面试题第4期

Spring boot 相对 Spring有什么优势

springBoot是在Spring的基础上的一个扩展延伸
springboot使用注解的方式替代了原有springXMl配置的方式
同时springboot提供了各种starter启动器,使我们更快的从0构建一个项目,
同时增加了自动配置,针对于需要在spring中引入依赖,添加配置信息的操作直接变成引入即可使用,定制化的直接修改对应的配置参数即可
总得来说大大的提高了构建速度,提高了开发效率(开箱即用)

SpringBoot和Spring的区别

Spring有哪些很好的特性:

IOC,DI:ioc容器用来存放项目中使用到的springBean,DI就是控制反转,在没有Spring的时候,我们使用对象是,都是new一个对象进行使用,然后等待垃圾回收器自动回收,
针对一些经常使用的对象,我们可以缓存起来,使用的时候直接拿就行了,所以就用到了ioc容器来对这个对象的声明周期进行管理

AOP:面向切面编程,例如我们需要再一个方法执行前后打印方法执行的开始结束时间,方法执行的耗时,这种代码,不可能再每个方法前后都去写一次,以后维护也得不偿失
切面编程需要指定一个切入点,即需要在那些方法置入代码
通知分类:前置通知,后置通知,环绕通知,返回通知,异常通知
AOP原理:动态代理实现方式分类jdk代理,cglib代理,如果我们需要切入的类实现了接口就使用jdk代理,如果没有实现接口就使用cglib代理
jdk动态代理是动态生成类,cglib动态代理是动态修改字节码

如何使用IOC(如何生成Bean放到ioc容器?)

1.使用@Configurtion+@Bean注解可以声明一个Bean
2.使用自动配置,即META-INF/spring.factories文件中声明自动配置类+@Bean注解也可以声明Bean
3.@Bean+FactoryBean<T> 使用工厂Bean来生成,生成时会调用其get方法
4.使用@Service,@Controller,@Component等注解声明某个类为一个springBean,其实很多注解底层都继承了@Component注解

通常如何获取bean

1.使用@Autowired注解注入
2.使用@Resource注解注入
3.构造器注入
4.实现BeanFactoryAware或者ApplicationContextAware接口,可以拿到BeanFactory,可以通过BeanFactory.getBean()也可以拿到

bean 扫描路径

默认扫描路径是启动类所在的包及其子包,需要指定其他的包可以使用以下方式
1.@ComponentScan或者使用@ComponentScans
2.使用@@SpringBootApplication(scanBasePackages="需要扫描的包")

@Autowired和@Resource的区别

@Autowired:是spring官方提供的注解,只按照类型来注入
@Resource:是java的注解,默认按照beanName来注入,也可以按照类型来注入

@Autowired和@Resource的区别

Map:只存60个键值对,需要设置初始化容量吗?设置的话设置多少初始化容量?

需要设置初始化容量为:128
当我们再确定知道要存放多少个数据的时候,可以直接设置成:键值对个数< 最小的2的n次方*0.75
分析:首先容量大小必须是2的n次方(hashMap底层原理),就可选的值为 16,32,64,128...等
要是直接设置成64,由于负载因子0.75,也就是说我们存到48个key-value的时候就会进行一次扩容
所以直接设置成128

hashmap什么时候退回回链表?为什么不是7

当红黑树个数为6时,退回成为链表,
为什么不是7?:因为链表转树是8,如果树转链表是7,那么如果我们某个链表或者树,put,然后remove,这样的频繁操作,会导致我们不停在进行转树和转链表,
设置成6就是有一个间隔的效果,使之转换没那么频繁

取模的时候为什么用&(length-1)

因为就是一个取模操作(前提是length必须是2的n次方),
hash & (length-1) = hash % length
由于计算机本来就是位运算的效率很高,所以使用了位运算的方式,这也是为什么hashMap的数组长度都是2的n次方的一个缘故

容量不是2的整数次幂 还用&(length-1) 影响会怎样?

容量是2的整数次幂,n -1 后,高位为1后的0都变为1,如 16:10000, 16-1=15:1111, 1111 再与 hash 做 & 运算的时候,各个位置的取值取决于 hash;如果不是2的整数次幂,必然会有的0的位,0与任何数&肯定为0,会造成更多的哈希冲突

JAVA类加载过程

加载-连接-初始化
连接又分为:验证-准备-解析
准备阶段:将变量赋值为初始值,例如代码中的 int a = 100,此时执行的是int a=0;
初始化阶段:执行init方法,将a=100,赋值为我们指定的值

Full GC效果不好 每次只能从90%-》85%之后又90%了,这种情况下应该怎么办比较好

full gc频繁说明old区很快满了。
如果是一次fullgc后,剩余对象不多。那么说明你eden区设置太小,导致短生命周期的对象进入了old区。
如果一次fullgc后,old区回收率不大,那么说明old区太小。
补充:
-XX:NewRatio:设置新生代和老年代比例,默认为2 也就是新生代1/3  老年代/3
-XX:SurvivorRatio:设置新生代中Survivor区的比例,默认8 即 Eden、From、To=8:1:1
-Xms:堆初始化大小
-Xmx:堆最大值
-Xss:每个线程的栈大小

更多IT资料【IT桃园村】,电子书,面试手册,八股文

image
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容