木仓科技凉经

整体体验很好,面试官水平很高,给我分析原因,直接给我结果不墨迹。

一、集合类题

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原理实现,为什么要用它?

七、项目部署经验?

八、事务隔离级别,默认是什么?

十、封装、多态,设计模式,讲了单例、观察者模式

全部评论

相关推荐

评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务