记某电商互联网公司java高级工程师面试

写文章前感谢帅丙,对我技术栈的深度有很大的帮助(尤其是redis)

文章中的回答不是标准答案,是本人当时的回答

一面

面试官:简单介绍下你做过的项目。

小白:略(主要是SpringCloud,redis,消息队列)

面试官:ok,那我先问点基础的东西,了解设计模式吗?

小白:用到的有单例模式,工厂模式,观察者模式。

面试官:单例模式你能说下有哪几种实现方式吗?

小白:懒汉式,饿汉式,双重校验。

面试官:HashMap的数据结构了解吗?

小白:jdk1.7是数组+链表,jdk1.8是数组+链表+红黑树。链表扩充到size=8就将链表转化为红黑树,头插入改为尾插入。

面试官:假设我这批数据刚好恰巧都插入到了一个链表里,怎么办?

小白:那就扩容吧。

面试官:除了扩容呢?

小白:可以重写hashcode方法吗?

面试官:可以,这就是我想要的答案。那你说说在判断对象相等的时候为什么要重写equals和hashcode方法?

小白:比如这两个对象相等,只重写equals方法而不重写hashcode方法在放入map的时候就会发现这是两个key,与两个对象相等相违背,造成困扰

面试官:hashMap支持并发吗?

小白:不支持,可以用hashTable和concurrentHashMap来替代。

面试官:那你说说他俩的区别

小白:hashTable是在hashMap的基础上,在方法上加上synchronized锁,concurrentHashMap在jdk1.7时采用segements做分段锁,jdk1.8时采用synchronized+CAS锁来实现

面试官:CAS锁怎么实现?

小白:用volatile标记变量,保证可见性,确保每次拿到的数据是最新的数据,在更新的时候再做比较,如果之前没有发生过变更,再update。

面试官:这是乐观锁还是悲观锁?

小白:乐观锁。

面试官:项目中的redis分布式锁怎么实现?

小白:根据请求id和自定义key去生成,把他作为一个key放入redis中,完成操作以后再删掉释放锁。

面试官:那我要是没完成操作怎么办?不是就形成死锁了?

小白:key会设置过期时间。

面试官:删掉key是直接delelte key吗?

小白:不是,为了确保原子性是将luna脚本放置到redis里执行。

面试官:redis和memoryCache有什么区别?

小白:redis支持持久化,memoryCache不支持,如果挂掉了里面的数据就全没了。

面试官:还有呢?

小白:我对memoryCache不太了解,没用过。

面试官:redis是单线程的还是多线程的?

小白:应该是单线程的吧

面试官:是的,自信点,不然怎么实现分布式锁呢。你们设备指令下发怎么保证安全性呢?如果被截取了不是可以轻松破解吗?

小白:发送的数据是加密的。

面试官:你都知道哪些加密方式呢?

小白:比如MD5,单向加密,像数据库存放密码不可能存放明文,所以一般存放md5加密后的数据。还有RSA加密,他是用公钥加密,私钥解密,所以他是可以获取到明文的。

面试官:线程池有了解过吗?怎么实现。

小白:可以用Executors获取线程池,也可以new threadPoolExecutor。

面试官:他俩有啥区别吗?

小白:前者在阿里开发规范里被否定了,因为会无限扩容,所以更推荐后者。

面试官:那你知道threadPoolExecutor有哪些参数吗?

小白:存活线程数,最大线程数,然后两个是失效时间,一个队列,还有线程工厂和错误策略。

面试官:你有什么想问的吗?

小白:有技术分享会吗

面试官:这个是有的,每周都会定期举办分享会,有很多大牛会介绍自己的经验。

二面

面试官:介绍下你的项目经历

小白:略。

面试官:之前有碰到过高并发的场景吗?

小白:有的,设备指令同时批量下发,打崩过数据库。

面试官:为什么会打崩

小白:因为同一时间大面积的reids key失效,所有的请求都打到了数据库。

面试官:怎么解决的呢?

小白:分批去处理数据,岔开redis key的失效时间。

面试官:这么大的问题之前没有发现吗?

小白:这个是发生在开发环境的,生产环境不会出现这个问题。

面试官:你们redis是怎么实现的?

小白:用AOP拦截大屏的接口,如果redis里有数据就返回,如果没有再访问数据库。

面试官:我看你项目经历有调优经验,那你说说如果一个接口返回比较慢了怎么入手调优?

小白:先打断点,看看主要耗时在哪里,如果是后台处理的慢,则要具体分析,改代码,如果sql执行慢就要分析sql,重写sql或者建立索引。

面试官:sql慢你怎么分析呢?

小白:可以打开慢查询日志,确认到执行慢的sql然后explain,看他有没有走索引,还是全表扫描了。

面试官:explain主要看哪几个参数?

小白:有个rows代表扫描走过的行数,其他好像还有什么all,如果出现了all就代表全表扫描了。

面试官:索引失效了解吗?谈谈什么场景下会索引失效

小白:比如用in ,not in,或者在索引字段上做计算函数都有可能发生索引失效。

面试官:联合索引什么情况下会失效呢?

小白:如果建立的时候是A,B那么查询的时候用B,A就会失效。

(后面问了很多场景,比如CBA,BCA)

面试官:有做过压力测试吗?

小白:有的

面试官:主要看哪些指标呢?

小白:QPS,还有错误率。

面试官:如果压测效果不好怎么办呢?

小白:前端限流,后端限流,jvm设置并发线程数。

面试官:我看你用的项目是springcloud,熔断降级怎么实现?

小白:引入Hystrix,然后他可以去拦截错误的接口,返回定义好的错误返回。

面试官:你了解哪些熔断的参数呢?

小白:有个分钟数,错误次数,熔断时间吧。

面试官:那你怎么提高你接口的吞吐量呢。

小白:利用eureka做负载均衡,比如设备模块这种并发量高的可以多启动几个微服务。

面试官:负载均衡的分配策略有哪些呢?

小白:轮询,随机,并发数最少,那几个英文忘掉了。

面试官:当初为什么选择SpringCloud呢?dubbo也可以啊

小白:确实可以,但是当时比较尴尬,dubbo还没有被阿里重启,而且dubbo用的是RPC,springCloud用的是http,大家又对spirng更熟悉,所以选用了SpringCloud

面试官:谈谈你对RPC呢?

小白:是远程进程调用。具体我也不太清楚

面试官:Java怎么实现RPC呢?

小白:不会

面试官:开发工具用的什么?

小白:IDEA

三面

面试官:介绍下项目经验

小白:略

面试官:你们sql最大的表有多少数据?

小白:几十万。

面试官:我看设备一直上报数据,表里无限增长,为什么数据量那么少。

小白:做了冷热数据分离,数据库里只保留三天的数据,之前的数据写成csv按照日期作为文件名存储起来

面试官:那我想要一个月前的数据怎么办?

小白:我们提供了接口获取数据,csv里保存的是json数据,所以依旧是可以查询的。

面试官:那相对于sql查询肯定慢很多吧。

小白:那是肯定的,所以尽量支持一些数据段提取,不要有什么复杂的操作,类似于tsdb。

面试官:你觉得你有什么缺点呢?(送命题)

小白:比较犟,跟同事会对方案要吵出一个最优解来。

面试官:如果就事论事的话我还是支持的,但是要注意说话的方式,尽量温和一点。那你觉得你的优点呢?

小白:接受新事物能力比较强吧,近期公司让我开发一些前端内容,虽然之前没接触过也可以照葫芦画瓢。

面试官:那你平时学习一些技术都是靠哪些渠道呢?

小白:csdn,微信公众号比如像阿里技术,架构之路之类的,github会看些项目相关或者类似的项目。

面试官:你不看一些专业书吗?

小白:相比专业书我更喜欢看史书。因为现在技术更新换代太快了,可能我看完一本书实现原理又变了,比如hashmap jdk1.7和1.8的区别。

面试官:看书其实可以训练你的编程思维,单纯看一些文章的话很多情况下会忘记,最好看完之后code一下,才能巩固

小白:了解

面试官:你对加班有什么看法呢?

小白:我觉得互联网人加班是很正常的,自己的事情干好了再下班。但是我比较反感明明没事还装作有事在那加班,或者自己能力不行然后装可怜。

面试官:之前有带过人吗?谈谈项目从立项到完结的流程

小白:略(各公司不一样)

面试官:你有什么想问的吗?

小白:既然提到加班,我想问下公司绩效和加班时间挂钩吗?

面试官:肯定不挂钩的。

小白:那我这边没问题了

面试官:等hr联系

总结一面面的比较广,主要是对项目中用到的技术做个大致了解,判断下你是不是真的会用,摸一摸你的基础。二面的话就会刨根问底,对一个技术栈深挖你的了解程度以及一些架构设计。三面就比较水了,技术问题不多,判断下你是否符合公司文化。

后续:拿到数据中台部门的offer。

发布了7 篇原创文章 · 获赞 5 · 访问量 3461

猜你喜欢

转载自blog.csdn.net/babing18258840900/article/details/104294933