一面:
- 首先自我介绍,说了一些学校啊,专业啥的
- 问了正在实习中的岗位主要负责什么
- 手写一个单例模式,就双重检查加同步synchronized,volatile(然后就开始问synchronized和volatile的实现原理)
- String,StringBuffer,StringBuilder的区别,以及为什么String是不可变的,还有String类的内部属性应该怎么设计保证不可变(回答内部属性可能是一个char类型的数组,使用final来修饰,这个我猜的。。。)
- 说到final又接着问final修饰属性,方法,类的区别,还有final修饰属性不可变,那为啥可以修改属性的值(回答final修饰的引用是不可变的,但是引用的对象是可以改变的,面试官也没有深入问,这个问题就算过了)
- 手写一个算法吧:使用两个栈来实现一个队列,还好之前在牛客网刷到这种类型的题目,原理很简单,但是要注意处理边界的条件
- 说到redis,让我说一种熟悉的数据类型以及怎么实现的,这个时候当然要提hash了,因为和java中的hashMap很相似,所以接下来就问了HashMap(实现的原理,hashcode计算,hash冲突的解决办法,这个我是真的很熟练,看样子面试官也很满意),ConcurrentHashMap(分段锁以及怎么确定这个段多大合适)
- 怎么解决sql注入问题,JDBC自己怎么实现,怎么使用连接池来操作(连接池的实现原理)
- 一面基本就是这些吧,有些真的想不起来,然后没多大会我就开始二面
二面
- 上来就让写一个算法,将数组中的所有数组合成一个最大的整数(回答不太好,感觉自己算法太差,把想法具体手写代码表达出来的能力太欠缺)
- git常用命令
- 数据库引擎有哪些,InnoDB和MyISAM的区别(说了从事务的支持方面,锁的粒度,查询的速度,索引的类型,问我就只有这些吗?。。。。。)
- 数据库的隔离级别
- 写了一堆数据,让写个sql,我用了表连接,面试官说可以
- 那这些数据如果是在linux文件中,用什么命令可以查询出其中的一列(emmm,linux看来还是懂的太少)
- 开始问网络,http和https的区别,https加密的方式(消息采用对称加密,但是秘钥采用非对称加密)以及ca证书由哪一方负责管理(这个。。。)
- 说一些OSI七层模型以及每层都用到哪些协议
- 说一下TCP和UDP的区别,为什么TCP是可靠的连接(然后就开始说三次握手四次挥手)
- TCP网络拥塞怎么解决,还有滑动窗口具体怎么实现的
- 再写一个算法吧,找出有序数组中某个数(可能重复)的开始下标和结束下标(可能是时间复杂度没达到面试官的要求)
- 最后问我你了解ROP框架吗(不了解)
三面
- 上来说了说学校,专业
- 开始问实习的项目,具体是做什么的,数据库怎么设计的
- 说到主键,问我项目中的主键怎么做的,我说使用UUID,他就开始问我为什么要使用UUID,使用自动增长的主键不可以吗?(这个因为项目需要吧,记录日志什么的使用UUID生成在可读性上会比数字强)
- 然后开始问使用自增长主键和生成的主键对数据库有什么影响?然后就开始说到了索引,主键索引,唯一索引
- 说到索引就开始问数据库引擎
- 计算1000!末尾有多少个0(转载这个博客很不错)
- 再写一个算法吧,把一个二叉查找树转换为一个链表,left指向比当前结点小的结点,right指向比它大的结点,然后根节点重新执行链表的开始,只是用二叉树的左右结点的引用(指针)变化来实现
- 接着问线程和进程的区别,CPU的调度问题,操作系统怎么解决资源竞争问题(都是操作系统课本上讲到的问题吧,但是不是计算机专业,好多东西都是自己学的,有些专业名词真的不知道)
总结
- 基础知识很欠缺啊,真的很有必要去认真学习一下计算机专业的书籍,基本没咋问java的内容以及框架(Spring家族,mybatis等)的一些实现原理
- 算法是硬伤,从今天起要多刷算法题了