在51job上投了好几家简历,最后只有一家打电话约我去面试(可能51job上的简历写得太差了吧--|||),约的是下午三点,结果我两点40就到了,刚好没有人来面试,就直接给我面了。
先是做了个自我介绍,然后面试官就拿着简历开始问我。
- 谈谈你对于redis的理解(自己作死,简历上写了熟悉redis,结果mysql和orcal都没问,就问了redis,之前答得很草率,下面的答案是我自己回来好好看了redis之后,再写出来的)
redis是一个基于key-value的数据库其value最大可达到:516M,是一个已知性能最快的key-value的数据库,它有5种数据类型:String,List,Set,ZSet,Hash。其中String是可以包含任何数据的,List是一个链表结构的数据类型,Set是一个集合,ZSet是String类型的双向链表,Hash适合存储对象,它的添加和删除的平均的时间复杂度都为O(1)。redis的缺点就是:它的容量是受物理内存的限制,不能去做海量数据的高性能的读写,redis只能局限于小数据量的高性能操作和运算。redis的优点就是:1.因为数据是存在内存中的,所以速度很快。2.有丰富的数据类型。3.支持事务,其操作都是原子性的。4.有丰富的特性用于缓存消息和删除过期信息。
2.你简历上写了你熟悉sql的优化,可以说一说么?
我说得的是建立合适索引和优化查询语句。
3.那你可以说一下什么是索引吗?
我的回答是:在我看来索引是数据库用来便于查找的标记。
百度的回答:索引是与表或视图关联的磁盘上结构,可以加快从表或视图中检索行的速度。索引包含由表或视图中的一列或多列生成的键。这些键存储在一个结构(B树)中,使 SQL Server 可以快速有效地查找与键值关联的行。
4.你说了索引的优点是便于查找,那他有什么缺点或不足呢?
这个问题我没有回答出来,最后面试官和我说:索引的不足就是效率低,占用的资源多,每次的增删改需要动态的维护导致时间变长
5.谈谈你对于mybatis缓存机制的理解。
1.一级缓存:是session级别的的,在使用同一个session进行查询时,会将第一次的结果存到session中,然后之后的查询同一个结果时,就会从session中去获取到结果,而不会再去发送sql语句
2.二级缓存:是sessionFactory级别的,在使用session查询到数据并且提交时,之后查询都会从sessionFactory中读取缓存中的数据
6.说说你对于事务的理解
我当时的回答是:在我看来,事务是一个要求多条sql语句同时成功同时失败。
后来的了解:事务有四大特性:CAID(原子性、一致性、隔离性、持久性),原子性是指事务的操作是全部成功或者全部回滚,一致性:一个事务执行之前和执行之后要处于一致性状态,隔离性:当多个用户操作表时,一个事务的操作过程中不能被其他的事务干扰,并发事务隔离,持久性:事务一旦提交,对于数据库中的数据的改变是永久性的
7.如果两台服务器,一台修改了你的数据库中的数据,一台中有缓存,那岂不是另外一台无法去拿到最新的数据,你有没有了解过这种情况
我当时脑袋里面想到的是:设置定时器,定时更新缓存。但是没有说,就说没有去了解。
8.说一下tcp建立连接的三次握手
这个我之前写了博客,大致是按照自己写得博客来说的,面试官还顺便问了为什么不是两次握手和四次握手。(博客中都有.....)
https://blog.csdn.net/Freak_ysy/article/details/81543873
8.谈谈你对于spring的了解
spring中主要是ioc(控制反转)和aop(面向切面编程),ioc就是生成新对象的权利交给了我容器,由容器生成,程序员只需要在容器中获取到合适的对象,aop是面向切面编程,可以说是对于oop的一种补充,oop的编程更多的是纵向扩展(通过继承),而如果oop横向的扩展的话就显得特别冗余,所以就有了aop用来横向扩展,来降低类之间的耦合,类与类之间没有依赖,通过接口实现
9.为什么要用spring而不用单链模式
没有回答的上来,后面面试官和我说的是:因为spring中可以用实现接口。
10.你对于数据结构了解的多么(我回答的是:不多),那问你点简单的吧。数组和链表的区别
数组在内存中的存储是按顺序存储的,链表在内存中的存储是不按顺序来的,但是链表通过指针来将链表中的一个一个数据给连接起来。然后,数组的查询速度要比链表块,但是链表的插入和删除要比数组快的多。
11.你对于hashmap又了解么,说一说你了解的hashmap
hashmap的底层是数组和链表,他是以键值对的方式存储的,它允许存空值,但是只能存储一个,当它添加数据是,先是查找键的位置,看是否有这个键,没有的话就插入这个键值对,有的话就修改那个键所对应的值。hashmap还有一个扩容机制,hashmap的默认长度是16,其中有一个扩容因子,默认为0.75,当hashmap的存储的数据达到了它内存大小的75%时候就会触发扩容,新建一个hashmap是原来hashmap的两倍,在将旧的hashmap中的数据放入到新的hashmap中,其位置是 以前的位置+扩容的大小 。大概就是这样了。
12.详细的说一下hashmap的查找(感觉答得不好)
先将hashmap中的键 hashcode一下,再通过equals去比对hashmap中的各个键的hashcode码,如果没有,就插入,如果有就修改链表中的数据
13.在查找的过程中,你是如何查找的?for循环?那hashmap的时间复杂度就是O(n)了?
没回答出来,其实很简单就是因为数组的时间复杂度是O(1)的
14.你简历上写了你对于机器学习中的算法有一些了解,可以挑一个你用的最好的来说一下么?
我说得是knn算法和它的延伸k-d树,感觉面试官也不是很懂。最后问了我一个项目,还是机器学习的一个项目,我就解释了一下这个项目。
最后,就是很基本的流程了,问我有什么想说的啊?理想薪资是多少啊?什么时候可以来上班啊?.......这些问题。
经过这一次的面试,感觉还是不错的,面试官人还好,一看就是搞技术的,中途的一些问题,还让我去想一下,也不催你。总的来说还是认识到自己的很多的不足之处。