今天只有上午一场面试,下午的取消掉了。
早上9点半之后就到了,两轮技术面,一轮hr面,到了12点之后才结束,总体来说还是一场很舒服的面试,跟技术面试官聊的挺好,还学到了不少知识。
一面:
- 不同数据结构的时间复杂度
- 讲一讲集合类都了解哪些,常用的有哪些,有什么区别
- ArrayList与linkedlish的区别与时间复杂度
- hashmap的数据接口,时间复杂度
- set的底层数据结构是什么
- 对那种排序熟悉,手写一个排序方法:冒泡;冒泡的时间复杂度是多少
- 除了冒泡,还知道其他的什么排序算法?桶排序的原理,快排的原理,二分查找
- 树的遍历方法有哪些?左中右
- 红黑树有什么了解?怎么实现平衡?
- 平衡二叉树有什么了解?
- MySQL的InnoDB索引用了什么数据结构?
- 一个对象如何实现在set中只能保存一个:重写equals与hashcode
- 对象实现集合中的排序需要做什么:继承Comparetor
- 关于线程安全的了解:synchronized,lock,volatile,原子类,juc,并发容器
- synchronized与volatile的区别:synchronized是java提供的内置锁,同步,对象锁,类锁;volatile是轻量级同步锁,保证内存可见性,不能保证原子可见性,实现原理为:有线程对被volatile修饰的变量进行修改之后,就把数据从工作内存刷回主内存,同时通知其他持有这个变量的线程的数据为无效,之后其他线程读取这个变量的时候需要从主内存取最新的数据。
- 线程池:Excutors提供的几种模板方式,自定义的核心参数:核心线程数,最大线程数,存活时间,阻塞队列,线程工厂,拒绝策略。
- 最大线程数和阻塞队列都满了之后怎么处理,根据配置的拒绝策略对请求进行处理。
- jvm有什么了解:运行时数据区的组成部分;垃圾回收算法;确定对象是否有引用的可达性分析算法;
- 什么情况下会触发full gc:有大对象直接进老年代时空间不足;或者是老年代做分配担保时空间不足时。
- ClassLoader:类加载机制,双亲委派模型的流程:启动类加载器,扩展类加载器,应用程序类加载器,自定义类加载器。
- 熟悉的数据库
- MySQL的索引类型:主键索引,唯一索引,联合索引,文本索引
- InnoDB的索引为什么要用b-tree:b-tree,b+tree,叶子结点指针连接,范围查找,顺序查找;选择B树,数据量太大,只有叶子结点存储数据,其他结点存储类似于查询条件;磁盘的扫描是以页为单位的,部分加载。
- 联合索引的最左匹配
- left join,right join,inner join的区别
- MySQL数据库表结构设计的三大范式,反范式:三大范式的了解,插入,数据存储;反范式的了解,查询效率;反范式的使用场景:表中增加冗余的查询字段数据;主表中统计子表数据时在主表中增加派生字段直接存储子表数据个数;减少表拆分,多表合并。
- MySQL的主从原理:binlog的同步的流程
- springboot的了解
- spring家族知道的有哪些?spring,springboot,SpringCloud,springbatch,springdata
- springdata有哪几种
- spring中的aop介绍一些
- 面向对象设计模式:工厂,单例,代理,模板,适配器,观察者
- 观察者模式,UML图,demo代码示例
- 代理模式:jdk的继承接口InvocationHandler,Proxy;cglib,产生子类
- 哪些源码用到设计模式的:jdk中的锁中有模板模式;spring里有工厂模式,代理,责任链;jdk中的IO,动态增加职责的,用装饰器;
- Springboot中熟悉的注解:@restcontroller,@requestmapping,@get,@post,@service,@repoity,@mapper
- @RestController是个复合注解,里面包含哪些注解,controller,responseBody
- @SpringBootApplication中包含哪些注解
- redis中数据结构有哪些
- redis的持久化方式,快照,增量日志的方式(类似于mysql的binlog)
- redis是否自己搭建过
- redis是单线程的,一般多线程的效率高一些,为什么redis的效率会那么高?单线程没有线程上下文切换,锁,同步,事务的开销;epoll的多路复用;完全在内存中处理速度快
- nginx有哪些作用?负载均衡,反向代理,静态文件缓存服务器
- 负载均衡的算法:随机,hash,轮询
二面: - 算法题:对一个int数组中的元素进行翻转,第一个与最后一个互换,第二个与倒数第二个互换;for循环中用i,j分别表示数组中从头开始与从尾开始的元素,循环条件:i<数组长度/2,j<数组长度/2,i++,j–,在for循环中去使用临时变量执行替换
- 两个int值互换除了临时变量之外还有什么方法?
a=a+b;a=a-b;b=a-b;
可能存在的问题,相加溢出异或,a=a^b;a=a^b;b=a^b;
- 有个初始化好的List users,把user中年龄小于20的删除掉
- users.stream.filter(o->o.getAge >= 20).collectionToList();
Iterator it = users.iterator();for(it.hasNext(){User u = it.next();if(u.getAge() < 20){it.remove();}})
- 再创建一个数组,符合条件的往里面放
- 增强for循环的方式会抛异常
for(int i=0;i<users.size();i++){User u = users.get(i);if(u.getAge()<20){users.remove(i);}}
这种方式会存在问题,删除之后,index的i会跳过未判断的元素,修改方案有两个:1、在if判断中的remove语句之后增加i–,可以解决,但是程序可读性差;2、i倒序遍历数组;- 为啥用Iterator,在1.8之前
- 如果是ArrayList确实不建议使用for循环,边遍历边删除;如果是linkedList,可以进行删除操作。
- 数据库死锁,获取锁超时,锁等待
- MySQL联合索引的使用,解释器优化
- memercash与redis,一般情况下redis性能表现挺好,比memercash好,但是redis是单线程,memercash是多线程,为什么?
- 多路复用是什么意思?
- 不说多路复用,memercash改为单线程,性能是不是就跟redis差不多了?memercash为什么用多线程?
- 服务化的了解,SpringCloud的组件介绍,Eureka,Zuul,Hystrix,Config,Ribbon,Feign,Bus,Stream,链路跟踪
- Zuul可以做什么事情?服务路由,鉴权认证校验,负载均衡,限流
- linux下vim的页首,页尾的命令,/和?的区别
- 大文件的查看命令,less,more,tail
- 查找log中的一个关键字,不但是一行,还想查找上面100行,下面100行
- 近三年的规划是什么样的?一方面是在技术方面扩展自己的技术面,分布式,微服务,底层的,另一方面工作机会中有机会的话去在技术管理方面发展
- 对加班怎么看?在开发紧张及上线期间加班是正常的,但是加班文化的那种耗着的话不能接受。
- 如果确实一直都很忙,比如几个月,小半年,加班到晚上9,10点,能接受吗?阶段性的加班其实还是可以接受的