一面:
没问什么技术相关的,就是随便聊聊,面试官很nice
二面:
部门leader,相关问题如下
1、异常的分类和继承关系
Java中提供两种错误的异常类,分别是Error和Exception,他们拥有相同的父类Throwable(当时没想起来),Error表示错误,不可恢复,发生在JVM层次,而Exception表示可恢复的异常 又分为运行时异常和检查异常。区别是运行时异常可以不进行处理,常见的有ArrayIndexOutOfBoundsException、NullPointerException、ClassCaseException、 等。检查异常需要 try catch进行捕获。
2、IO和NIO区别
Java IO与NIO之间最大的区别是,IO是面向流的,NIO是面向缓冲区的。Java IO面向流意味着每次从流中读一个或多个字节,直至读取所有字节,不被缓存,也不能前后移动流中的数据。NIO则将数据读取到缓冲区中,需要时可在缓冲区中前后移动
Java IO的各种流是阻塞的,当一个线程调用read()或write()时,该线程被阻塞。NIO是非阻塞的
(此问题回答的不好,后续加强学习)
3、Mybatis中#与$区别
- #相当于对数据加上双引号,$相当于直接显示数据
- #可以防止sql注入,是预编译语句
- 使用在order by中 用$
4、Spring中用到的设计模式
- 工厂模式:在各种BeanFactory以及ApplicationContext创建中用到了
- 代理模式:在AOP实现中用到了JDK的动态代理
- 策略模式:加载资源文件的方式,使用了不同的方法,比如:ClassPathResourceFileSystemResource,ServletContextResource,UrlResource
- 单例模式:创建Bean的时候
5、Spring Boot
用来简化新Spring应用的初始搭建以及开发过程
这个问题是我自己挖的坑,不知道怎么就提到了Spring Boot,然后面试官就开始问问题,之前很早确实配置过一个入门的Spring坏境,实在太low了,所以就GG了,发现这个技术用的还是很多的,后面也得要系统的学习下。
6、多个对象相互引用 是否会被GC回收
判断对象是否存活的算法:给对象中添加一个引用计数器,每当有一个地方引用它时,计数器值就加1;当引用失效时,计数器值就减1;当计数器值为0时就不再被使用
引用计数算法虽然实现简单,判断效率也很高,但无法解决相互引用的问题,比如A引用B,B引用A,然后A和B都设置为null,此时这两个对象并不会因为互相引用就不回收它们。
此问题回答的不够坚定,实在是不应该,深入理解Java虚拟机一书也看了好几遍,看过还需要进行强化理解与记忆,下面那个问题也是如此
7、GC策略,各个的区别
标记-清除算法,分为”标记”和”清除”两个阶段:首先标记出所有需要回收的对象,在标记完成后统一回收所有被标记的对象。它的不足主要有两个:一个是效率问题,标记和清除两个过程的效率都不高;两一个是空间问题,会产生大量不连续的内存碎片。
复制算法,将可用内存按容量划分为大小相等的两块,每次只使用其中的一块。当这一块的内存用完了,就将还存活着的对象复制到另外一块上面,然后再把已使用过的内存空间一次清理掉。
标记-整理算法,标记过程与“标记-清除”算法一样,但后续步骤不是直接对可回收对象进行清理,而是让所有存活的对象都向一端移动,然后直接清理掉端边界以外的内存。
分代收集算法,根据对象存活周期的不同将内存分为新生代和老年代
8、left join与right join区别
Left join:将左侧数据全部返回,右侧相符的数据返回,不符合的部分则返回NULL值
Right join:将右侧数据全部返回,左侧相符的数据返回,不符合的部分则返回NULL值
9、如何根据语句查看是否有索引
这个问题我描述的可能不是很清楚,事后查询资料,不知道考察的是不是 explain 这个关键字
10、数据库SQL优化
看相关资料有好几十条最佳实践或优化,我也是没能说出多少啊,竟然说了个分表,然后就有下面的问题了(又是一坑) ,┭┮﹏┭┮
11、分表相关问题
不够深刻,加强学习
以上就是大概能回忆到的面试题,整体是不难,面试官给的评价也很中肯,虚心接受,再接再厉。
也感谢雷哥(小雷FansUnion)的推荐 ^_^
原创文章,作者:Maggie-Hunter,如若转载,请注明出处:https://blog.ytso.com/tech/pnotes/14180.html