因为从实习开始一直从事传统行业的Java开发(本人17届,16年开始实习,算上实习时间在第一家公司呆了2年半左右),想进一步提升自身技术与转向互联网企业,所以果断在年初离职从厦门来到深圳开始了面试之旅。现在记录下面试中遇到的问题,供大家参考。
电商类小公司面试,公司规模不足50人。开始给了一份试卷,作为老司机一看就知道这题目应该是考察下基础,即时部分没答上也无伤大雅,主要是能讲出其中原理。
笔试及一面主要题目
面试官是一个较年轻的小哥,应该比我大2岁左右
1:考察 int和Integer的区别,写出下列程序的输出结果,详解可以看这位的博客https://blog.youkuaiyun.com/teacher_lee_zzsxt/article/details/79230501
Integer i = 10;
Integer j = 10;
System.out.println(i == j);//true
Integer a = 128;
Integer b = 128;
System.out.println(a == b);//false
int k = 10;
System.out.println(k == i);//true
int kk = 128;
System.out.println(kk == a);//true
Integer m = new Integer(10);
Integer n = new Integer(10);
System.out.println(m == n);//false
2:spring事务传播类别
- PROPAGATION_REQUIRED:如果当前没有事务,就创建一个新事务,如果当前存在事务,就加入该事务,该设置是最常用的设置。
- PROPAGATION_SUPPORTS:支持当前事务,如果当前存在事务,就加入该事务,如果当前不存在事务,就以非事务执行。
- PROPAGATION_MANDATORY:支持当前事务,如果当前存在事务,就加入该事务,如果当前不存在事务,就抛出异常。
- PROPAGATION_REQUIRES_NEW:创建新事务,无论当前存不存在事务,都创建新事务。
- PROPAGATION_NOT_SUPPORTED:以非事务方式执行操作,如果当前存在事务,就把当前事务挂起。
- PROPAGATION_NEVER:以非事务方式执行,如果当前存在事务,则抛出异常。
- PROPAGATION_NESTED:如果当前存在事务,则在嵌套事务内执行。如果当前没有事务,则执行与PROPAGATION_REQUIRED类似的操作。
当时只写了四个,后面面试官问我这块时回答平时开发用的都是默认设置所以这块记得不是很清晰,即存在事务则加入,没有则新建,一般配置在service层,一顿解释后面试官表示ok、理解(哈,这老哥还是挺好说话的~)
3:事务隔离级别
DEFAULT 默认级别,mysql一般默认是REPEATABLE-READ
READ_UNCOMMITTED 读未提交,即能够读取到没有被提交的数据,所以很明显这个级别的隔离机制无法解决脏读、不可重复读、幻读中的任何一种,因此很少使用
READ_COMMITED 读已提交,即能够读到那些已经提交的数据,自然能够防止脏读,但是无法限制不可重复读和幻读
REPEATABLE_READ 重复读取,即在数据读出来之后加锁,类似"select * from XXX for update",明确数据读取出来就是为了更新用的,所以要加一把锁,防止别人修改它。REPEATABLE_READ的意思也类似,读取了一条数据,这个事务不结束,别的事务就不可以改这条记录,这样就解决了脏读、不可重复读的问题,但是幻读的问题还是无法解决
SERLALIZABLE 串行化,最高的事务隔离级别,不管多少事务,挨个运行完一个事务的所有子事务之后才可以执行另外一个事务里面的所有子事务,这样就解决了脏读、不可重复读和幻读的问题了
4:数据库设计范式
第一范式:当关系模式R的所有属性都不能在分解为更基本的数据单位时,称R是满足第一范式的,简记为1NF。满足第一范式是关系模式规范化的最低要
求,否则,将有很多基本操作在这样的关系模式中实现不了。
第二范式:如果关系模式R满足第一范式,并且R得所有非主属性都完全依赖于R的每一个候选关键属性,称R满足第二范式,简记为2NF。
第三范式:设R是一个满足第一范式条件的关系模式,X是R的任意属性集,如果X非传递依赖于R的任意一个候选关键字,称R满足第三范式,简记为3NF.
当时回答:抱歉记不太清了,这是概念化的东西,只是一种类似指导的存在,并不一定需要遵守,在某些场景下会存在违反范式的设计,例如反范式的列式存储数据库Hbase,或者需要冗余字段提高查询性能。(老哥听完点了点头,表示OK,再次觉得老哥好沟通)
其他:
其中还有些mybatis的一些基础问题,因为上家用的是Hibernate,所以具体的细节问题回答不知道,但主体问题可以答上来如支持的主键生成策略,答根据经验无外乎为自定义主键与数据库自增的主键。
还问了http content-type的常用类型、spring一些常用注解
如何优化sql语句,mysql什么情况下索引会失效(当时简单口头回答了一下,走索引啊避免全表扫描吧啦吧啦)
二面问题:
二面面试官是个中年男子,较为严肃
- 介绍一下最近的一个项目,遇到哪些难点,怎么解决。
- 用过哪些中间件 答Kafka redis
- Kafka通讯协议?没搞懂他想问什么,回答协议是Kafka自己实现的协议,貌似面试官不怎么满意。
- Mysql 有哪些存储引擎 答:只记得常用的InnoDB和MyISAM,当时读MyISAM(my-z[ei]m)麦者m,面试官一脸疑惑,我只能拼出了英文字母,好奇这是不是我读法有问题,汗。。。
- InnoDB和MyISAM和区别,答:innoDB支持事务,而MyISAM不支持,MyISAM支持全文检索特性(貌似新版本的InnoDB也支持了,详情MySQL中MyISAM与InnoDB区别及选择),面试官还确认了几遍是不是MyISAM不支持事务,搞得我都有点懵了无语
- 建立表是否一定需要主键 答坚定回答不一定需要,问了我好几次是否确定,我说确定(当时实习建表忘记建主键了,表成功建立了,还被同事提醒下,所以一直记得),搞不懂为啥问个好几遍。查了一下完整回答应该是:InnoDB的数据文件本身要按主键聚集,所以InnoDB要求表必须有主键 (MyISAM可以没有),如果没有显式指定,则MySQL系统会自动选择一个可以唯一标识数据记录的列作为主键,如果不存在这种列,则MySQL自动为 InnoDB表生成一个隐含字段作为主键,这个字段长度为6个字节,类型为长整形。所以InnoDB下建表可以不显示的设置主键。
- 最后终极一问期望薪资多少 答14k,面试官让我回去等人力通知,凉凉~
总结:一些问题虽然很基础平时不会刻意去记忆,但面试多多少少会问一下,所以在面试前还是有必要把套路题都记一下,不然答不上来也略显尴尬,例如:servlet生命周期、cookie与session的区别、stringBuffer\stringBuilder区别。好,开始准备下一场面试~