有赞面经(一面)---凉经
有赞面经(一面)---凉经
8.10号在牛客网上投了有赞的内推,期间收到邮件邀请在线笔试,约到8.18号下午3点-4点笔试,笔试其实不难,编程题也不难,都是些Leetcode上的简单题,奈何我算法菜啊,没做出来。。。但是,还是很幸运地收到了有赞的面试邀请,约在了24号晚上七点,也就是今晚。我早早回到寝室开始准备,7点03分,接到了面试电话。电话里听声音,应该是个二十多岁的年轻人,听声音比较疲惫,估计是面试了一整天了。所以,他简单介绍了一下自己,就直接问我问题了,自我介绍都给我免了。。。
直接上面经干货:
- 你对集合框架是怎么理解的?
- 我从Collection,Map开始大概讲了集合的框架体系,然后自己引出我们平时常用的ArrayList、LinkedList、HashMap、HashSet等
- 对ArrayList、LinkedList这些集合怎么理解的?多线程下会出现什么什么问题?
- 大概讲了两种集合底部所用数据结构,所适用场景。多线程情况下容易出现丢失修改、数据不一致的问题
- 由线程安全问题引出,线程安全的集合
- 讲了Collections里有方法可以把线程不安全的集合转为线程安全的,再引出了JUC(java.util.concurret)包里的线程安全集合---CopyOnWriteArrayList
- 然后面试官追问,CopyOnWriteArrayList底部实现原理,我讲了COW(写时复制)机制,然后面试官又追问,使用会出现什么问题,我说会出现数据不一致情况,面试官再追问,只有这一个吗?没有其他的了吗?其实我看博客的时候,记得有两个,但是回答的时候,只记得一个了,只好说我不太记得另外一个了
- 对HashMap理解以及在多线程情况下会出现什么问题?
- 讲了HashMap底层数据结构---散列表,然后它是有一个Node数组+链表实现的,当出现hash冲突时,使用链地址法解决,然后,自己又讲了一下jdk.7和jdk1.8的区别----红黑树以及为什么用红黑树(这里面试官没有追问我的红黑树的详情,万幸)
- 多线程情况下出现的问题,我主要说使用put方***出现数据不一致,get会形成死锁(详情有点复杂,我自己也有点绕,面试官也没继续追问)
- 讲下你了解的Hash函数有哪些?
- 这个真不记得了,我随便说了个取模函数、ax+b(线性方程)。。。
- 线程安全的map有哪些?
- 第一个讲了Hashtable,讲了一下里面大部分方法都是用同步锁修饰,所以效率比较低,然后自己引出ConcurrentHashMap,讲了jdk1.7和1.8的实现(1.8的好像忘记讲了,尴尬,cas+syc锁啊,白看了)
- 讲下实现线程池的几种方式?
- 先讲了newFixedThreadPool、newCacheThreadPool还有newSingleThreadExecutor,简单介绍了各自的特点和用法
- 面试官追问,还有其他的吗?我又把剩下的接着讲了下(newScheduledThreadPool),这里我貌似记成了两种,多说了一种。。。
- 线程池的核心参数说下?
- corePoolSize(核心池的大小)、maximumPoolSize(池中允许的最大线程数)、keepAliveTime(当线程数大于corePoolSize时,终止前多余的空闲线程等待新任务的最长时间)这里我好像说错了,说成个数了。。。
- 然后面试官又追问,其他参数没有了吗?额,一下子又记不起来了,后面几个。。。
- 讲下可重入锁?Synchronized锁是可重入锁吗?
- 讲了可重入锁基本实现---判断线程,外加一个计数器实现。说了下不可重入锁会出现死锁的情况以及原因,最后回答,Synchronized是可重入锁
- 讲下Synchronized是怎么升级的?
- 这里直接上高级部分了,可能是听我之前提到锁比较多,觉得我对这块理解比较熟练(事实也确实是这样,我一直想引他往这边问,嘿嘿嘿)
- 先讲了下JVM里的对象的存储结构(对象头、实例区域、填充对齐),讲对象头里的运行时数据(MarkWord)和类型指针,再引出轻量级锁怎么膨胀到重量级锁的,最后,自己讲了下对这里的理解,为什么需要锁升级?(这一块我讲得挺仔细,也讲的比较久,都是从深入理解JVM的最后几章看到的)
- JVM对新生代是怎么回收的?
- 先讲了一下什么对象会被GC认为可回收,引出可达性回收,再将讲了一下回收新生代用的是复制算法,简单介绍了一下复制算法的实现
- 新生代里是怎么划分的?每个区域的比例?你觉得设计者为什么要这么划分?
- 新生代分为Eden、s0和s1,其中Eden区占比达80%。
- 为啥这么划分?问得我一时脑梗,想了一会,然后说我不太清楚。。。
- 讲下Spring容器是怎么加载的?
- 简单介绍了一下,先获取配置文件地址,读取并解析xml节点,获取到配置信息,最后利用反射机制创建出所需要的对象。然后说了一下自己之前简单实现过一个SpringIOC容器,实现原理和上面差不多。(感觉我这里讲得太简单了,其实我有看过源码,但是没怎么看懂,加上又是面试,一时间记得的东西都忘记答了)
- 一个关于Spring的Bean的问题
- 这个问题最尴尬,我先听了一遍,没听清楚。然后又叫面试官说了一遍,没听懂啥意思。然后我又说没听懂啥意思?能再讲一遍吗?面试官这个时候就感觉我应该是没接触过这个问题,就说你应该是没了解过,然后又把问题描述了一遍。我说是和AOP有关系吗,他说:“没有,我们进行下一题吧”。(到现在写这篇面经,我都不记得这个问题的是啥了,尴尬至极)
- MySQL的两种引擎你了解吗?讲下看看
- MyISM和Innodb,讲了一下两者的区别,balabala。。。
- Innodb默认隔离级别是什么?
- 读已提交,顺便讲了一下其他三种
- 然后读已提交会出现什么并发问题,这个,我脑子一时短路,没记起来,(就是避免了脏读,但是还会存在不可重复读和幻读)
- Innodb什么时候会加上表锁?
- 这个真没看过,说了一下我对数据库锁机制这块了解不多,然后面试官说:“好的,了解。”
- 聚集索引的最左匹配原则
- 这个有看过一点,但是知道的很片面,然后问了面试官,是和索引的命中有关吗?他说是的,然后我就扯到索引的失效上去了,说用什么like,>,<等这些索引会失效,然后面试官又追问,为什么会失效,底层怎么进行命中判断的(还是在问最左匹配原则),我直接崩了,之前这块没认真看懂,弱弱地说:“我这块不太熟悉”。面试官很亲切地回答:“了解了解,我们进行下一题吧”
- TCP的连接和断开具体实现讲一下
- 这个我简历上没写,因为我知道的不多,原以为他不会问超出简历之外的(呵呵了,后面还问两三个分布式的问题,我好难啊。。。),试着询问了一下,是三次握手和四次握手吗?面试官说:“不是,我想听你介绍它的那些状态的转换”。我就知道了,他怕我直接背概念(三次握手和四次握手没得法啊,都是背出来的),所以,直接问核心,其实这块应该是和我上午看过的TCP状态机有关,但是那张图太复杂了,不花点时间,是啃不下来的。最后,没办法,又只能弱弱地说:“我这块不太熟悉”,emmmm
- 讲下你对分布式%*#¥Zookeeper服务注册…&%#@MQ消息队列的理解,哪一块比较熟悉
- 一大堆分布式名词,只听过Zookeeper,MQ,这是要搞我啊,分布式我都没学过,只了解过消息中间件的其中一个RabbitMQ,而且还只会安装,没了解里面的使用,更别提原理了。。。最后,只能说:“我分布式这块还没学过,最近也在开始学,但是学得还很少”
- 讲下分布式锁是怎么实现的
- 面试官还没死心,可能看我前面锁这块答得挺多的,想顺便问问。然而,我并不知道啊,emmm。但是,我给自己挖了个坑,我说Redis可以实现分布式锁(可能是内心里还想挣扎一下吧,本能地说了出来,成功地引出了面试官对我的第三个分布式问题,emmmm)
- 哦,那你讲下Redis怎么实现分布式锁的?
- 事实证明,no zuo no die ,我只能说:“我只知道Redis可以实现分布式锁,但我没看过它具体怎么实现的”,手动滑稽。。。
- 最后一个问题,怎么从一个字符串中找出最长子序列(题目我都记不太清楚了,好像是这个题,又好像不是,反正当我一听到是算法题,人都懵了)
- 最后一个问题了,果然让我好基友说中了,算法题----哦,我的痛。大学算法渣得一批,也是最近才开始复习数据结构,真的是从0开始啊。
- 然后我假装想了会,其实脑子里在想:“我怎么说我不会,会给面试官印象好一点,emmm”。最后,跟面试官老实讲:“我数据结构和算法这块比较菜,平时也没怎么做编程题。。。”
电话结尾,面试官跟我说,一个礼拜之内会有通知。个人估计会凉凉,因为看到好多985大佬都凉了。
以上,就是我的人生中第二次面试的全部经历了,简单小结一下吧
- 技术点:都是偏基础的,项目一点没问,框架也只问了Spring两个问题。集合偏多,针对集合问了几次多线程下会出现的安全问题,锁这一块需要深入原理,一定要吃透,牛逼的人可以钻研到操作系统层面去。JVM这块基础要扎实,像JVM内存结构(jdk版本不同,都会有一些差异)、垃圾回收算法、垃圾回收器等。数据库方面,重点要掌握索引及其原理、锁机制和数据库引擎,高深一点的要了解SQL优化、数据库优化这些。Redis简历上写了,但是没问。。。TCP/IP和HTTP这块要花时间掌握,因为问得频率很高
- 个人方面:语言组织这块做得不太好,当听到问题,自己肚子里一大堆话要讲,但是就是蹦不出第一句话,反正我自己感觉讲得是有点乱,也不知道面试官听得乱不乱。。。其次,数据库、计算机网络基础不够扎实,有待提高和加强。分布式的话,有时间会多学些的。最最头疼和心痛的,就是我的算法了,要是大学要我再重新来一遍,我一定痛改前非,好好学习算法,参加ACM
最后,有些个人认为的可能说得不是太对,希望大家可以指出,大家一起共同成长!!!
我的口号就是:“有面试不亏,有offer血赚!”
#面经##有赞##Java工程师##校招#