上海-运去哪-24届JAVA开发实习生(oc)
一面:无任何八股,全实操性问题
- 简单介绍下你的项目,挑其中一个你实现的功能模块讲讲?
回答:区域债券成交异动的数据统计展示,因数据量较大,sql执行5-6秒左右,产品要求优化,采用定时任务每晚凌晨12点去redis中刷新数据,提高响应速度 - 反问:你们的服务是单节点还是多节点?
回答:单节点,多节点会存在重复扫描的问题,因此要加分布式锁 - 场景题:如果项目里的任何一个地方出NPE异常(NullPointException),这时我想要打印日志记录?该怎么做?
回答slf4j,然后try-catch代码块里catch块写log.error(“”),面试官说理解错了,遂想到aop全局异常处理,回答做切面,切面配置扫描为controller、service、mapper。(需要再复习一遍牛客论坛里怎么做的) - 慢sql你怎么做?
如果是远程接口的话先排除网络超时的问题,采用explain关键字查看相关列balabala - mybatis使用最少的类完成一个查询?
mapper接口直接注解式写查询语句,但是也需要个实体类 - 代码如何写?说三点
1耦合性,2可读性,3健壮性
二面:主要问点在sql优化还有多线程上
- 实习时长?两家公司的离职原因?
实习6个月左右,一家是实习到过年需要返回老家,一家是兼顾科研和实习选择学校附近并且版本迭代稳定,寻求更好的平台 - 简单介绍下你的实习项目?其中遇到问题?你是怎么解决的?
介绍了区域概览模块,叙述了下redis加缓存具体是怎么加的?然后问遇到的问题,回答多节点重复刷新redis,加分布式锁 - 介绍下sql优化具体怎么做的?
回答like双百分号索引失效问题,又追问别的索引失效问题,回答or != is null is not null导致的索引失效,以及不要让索引列参与计算以及函数计算 - sql索引创建场景题目:select xxx from table where a1 = 1 and a2 = 2怎么加索引?
回答创建a1 a2联合索引,问如果调换顺序呢?回答索引失效,然后根据使用频率创建索引,如果a2频率高的话就a1 a2联合索引加上a2单索引。 - 你在项目里是怎么使用多线程的?
回答多线程导入功能的实现 - 如果多线程操作共享变量,就比如对一个变量的累加操作,你怎么考虑?
回答采用原子类去定义变量,追问使用原子类就不会出错吗?再回答对代码块sychonized加锁,然后用原子类定义变量(其实是想问threadlocal) - 最后一个问题,threadlocal的应用场景?
回答存储登陆用户的个人信息,比如区分是登陆还是未登陆的用户,主要用于线程隔离
总结 :多线程部分比较薄弱,需要重新学习,sql优化以及底层还可以,另外实习项目遇到的难点和问题点以及亮点要总结成简单易懂的语言来描述
北京-京东-Young计划实习生(hr面挂)
虽然大概率是kpi面,但是也是人生中的第一次大厂面试,继续总结,继续努力,虽然对内心的触动还是挺大的,但是也不要乱了秋招的节奏,慢慢优化自己,坦然接受生活中的一切发生!!!
技术面
- 自我介绍
- 项目中遇到的难点和问题?具体优化怎么做的?
回答三个层面,首先是sql层面的走索引优化,然后是查询接口调用多个服务采用多线程去查询,最后是慢查询加redis缓存处理 - 反问开启了多个线程是怎么控制的?提到了一个一个线程执行完然后主线程怎么怎么?(没听清大概是这个意思)
回答使用countdownlatch来控制,比如查询3个服务的请求,new countdownlatch(3),然后每查询完一个服务-1,程序最后再加个判断,判断countdownlatch是否为0,不为0的话使用await()方法等待执行完毕。 - 再次反问有没有别的解决方法,并提示使用join方法也可以解决找个问题
- 项目中使用到了分布式锁,分布式锁如果不用redis你有什么解决方案?
首先回答为什么要使用分布式锁,因为JVM层面的锁锁住的是单进程,当我们遇到多进程的问题时就需要分布式锁来实现一个互斥访问,然后回答如果不使用redis的话可以使用mysql创建张表,使用唯一性约束来实现。再然后就是用zookeeper来实现了,具体没展开说 - 深度分页问题,如果单表的数据量非常的大
曾经在八股上看到过此类问题,回答先把要深度分页的id查找出来,然后尽量走覆盖索引(完全就是靠一丁点记忆在瞎吹) <