木仓科技凉经
整体体验很好,面试官水平很高,给我分析原因,直接给我结果不墨迹。
一、集合类题
List<String> list = new ArrayList<>(Arrays.asList("aa","bb","bb","cc")); for(int i=0;i<list.size();i++){ if(list.get(i) == "bb"){ list.remove(i); } }
问,代码会有异常吗?遍历打印list还会有"bb"吗?删除索引为1的"bb"后,原来索引为2的"bb"会往前移动。而i是++的,因此为漏删一个"bb"。如何将list转成HashMap?Key是字符串内容,值是每个元素的HashCode。插入到Map里如何保证原始list的顺序?乱说了一通,后来面试官说LinkedHashMap。气死了,没想起来。
二、多线程安全集合
private Map<String,Integer> map = new HashMap<>(); if(map.get(key) == null){ map.put(key,1); } else{ int value = map.get(key); map.put(key,value + 1); }
问,这个计数操作是线程安全的吗?如何让它线程安全?除了加锁,还可以怎么做?不加锁,换成ConcurrentHashMap能保证线程安全吗?不能,这里的get和put两个步骤不是原子操作,计数可以用ConcurrentHashMap的compute方法,以下是示例代码:
public static void main(String[] args) { ConcurrentHashMap<String,Integer> map = new ConcurrentHashMap(); map.put("key",1); // 修改key对应的value,追加上1 // 之前的操作方式 Integer oldValue = (Integer) map.get("key"); Integer newValue = oldValue + 1; map.put("key",newValue); System.out.println(map); // 现在的操作方式 map.compute("key",(key,computeOldValue) -> { if(computeOldValue == null){ computeOldValue = 0; } return computeOldValue + 1; }); System.out.println(map); }
三、线上异常怎么排查,分布式环境下怎么排查?哪些指令?最后说要用到ELK分布式日志。
四、多个服务集群,同时做定时任务记录接口访问量,怎么实现?会出现什么问题?
说了Schedule注解结合Cron表达式。但面试官说不同服务器时钟可能有偏差,导致不同服务器不在同一时间处理,那么用分布式锁等等也就起不到作用。所以需要用分布式时钟,单独用一个服务器的时钟,确保所有机器都在同时执行。
五、写Sql,group by、order by,引出了索引问题,聚簇索引、非聚簇索引,回表,覆盖索引等等。
六、问项目,HotKey原理实现,为什么要用它?
七、项目部署经验?
八、事务隔离级别,默认是什么?
十、封装、多态,设计模式,讲了单例、观察者模式