与大佬谈话心得体会

最近一直没有写博客,一直在准备面试,阿里(三面)网易(一面)都被刷了,说实话心情还是蛮难受的…

昨天,我叫我哥能不能帮我找些大牛聊聊项目,给点意见,指点指点。

说实话我一直想进阿里,看着身边的同学很多都拿到大公司 offer 阿里集团、支付宝、菜鸟、网易… 而我(可能能拿到华为的目前还不知道那就是 0 offer)对比起来说实话心里还是有点难受的为什么我这么菜。

昨天和那个大牛聊了后发现差距在哪里,我先问他:“我现在觉得有个好项目还是很重要,不过感觉自己实习做的东西基本是 CRUD 都没什么难点,我面试的时候说了基本面试官都不太敢兴趣? 不太敢兴趣,基础知识就问的多了,一问多了很多知识点自己就没有准备好一下子就….”

大佬:其实我更加注重基础,基础可以看出一个人可塑性如何? 给我看了下他经常问的一些问题。

我哥:你们就当一个面试吧,我走开你们慢慢聊。

大佬:好吧,那就先第一个问题吧! ArrayList 和 LinkedList 的区别?

我:ArrayList 底层使用数组实现,查找比较快,插入删除因为要移动位置相对来说慢点,LinkedList 底层使用双向链表实现,插入删除比较快,查询比较慢。

大佬:好,描述下这两个的 add()?

我: ArrayList 的 add()当添加元素是需要检查下是否到达了阀值需不需要扩容,LinkedList 使用双向链表实现的 插入的时候 new 一个结点插入就可以。

大佬:使用 ArrayList 和 LinkedList 当插入 100 万条数据时哪个更快?

我 :LinkedList 快因为它插入只需要 new 对象然后插入,而 ArrayList 插入的时候需要检查扩容。

大佬: 你又尝试过吗? 真的是这样吗?

我: 没,我感觉是这样的….

大佬: 其实是 ArrayList 快,你可以去测一下,有一段是LinkedList快,好像到达 70~80 万(我记不清是不是这个数)的时候 ArrayList 会更快。 你知不知道热加? 你可以跑下,当你第一次跑完时间,和第二次跑完时间是不一样的,第二次第一次更快,因为cpu寄存器里面还存在一些东西(我记不清楚了),说了下 junit 和(我记不清是不是jmock还是jmp)区别啥的… 后面还讲了些我实在没记住(应该拿笔记下的)

我: 点头,佩服佩服


第二个问题

大佬:谈下 Map 吧

我:Map 是一个接口定义了些方法,AbstractMap 抽象类实现了 Map 接口,我用的比较多的是 HashMap、LinkedHashMap。

大佬: 还有吗?

我:HashTable、ConcurrentHashMap … 额…

大佬:NavigableMap 知道不?

我: 听说过没用过?

大佬: 你应该这样回答,Map 主要是以 k,v 形式存放数据,再讲下它的树形结构(分支),再谈谈用的比较多的几个类。

大佬:比如这样一个情景: HashMap,用 get 方法如果集合中有元素存在就返回 V 的值,如果没有用 put 方法 把时间戳给写入,多线程会有什么问题?

我:如果集合中有通过 get 方法有元素已经存在,多线程相当于读操作是安全的,如果比如说有两个线程 get 的时候元素都不存在 都要 put,那么一个元素的 V 会替换另外一个元素的 V。

大佬:还有吗?这是一种情况

我: 不知道了

大佬:你知道 HashMap cpu 100% 吗?

我: 听说过,好像在扩容的时候

大佬: 去看下

大佬:那么如何保证线程安全呢?

我: 用 ConcurrentHashMap ,Collections.synchronized方法

大佬: 其实是线程不安全的,解释了下…..

我: 没听懂

我: 是不是用锁把,get 和 put方法锁起来

大佬: (怎么说我忘了)


第三个问题

大佬:synchronized 关键字 和 Lock 的区别?

我:synchronized 关键字是 jvm 层面上编译会自动加锁解锁(我在牛客上一个人回答上看的,不过大佬好像疑惑了下有问题),Lock 是 jdk 层面上的,需要自己加释放锁。synchronized 好像是JDK1.6 后做了锁优化:锁粗化、自选锁等等,性能上并不比 Lock 差推荐使用 synchronized
synchronized 和 wait(),notify(),notifyAll 结合使用,Lock 结合 Condition,await(),singnal(),signalAll(),Lock 还有 tryLock()方法,Lock 可以实在公平锁和非公平锁,synchronized 是非公平锁。

大佬: 还有吗?

我:差不多就这样了。

大佬:你应该先讲他们的使用,再将它们差别。使用大佬讲了很多,InterruptedException啥的 记不清楚,还深入讲解了 synchronized 和 Lock 底层实现 几种状态…


第四个问题

大佬:谈谈类加载器吧

我: 类加载过程:加载、验证、准备、解析、使用、销毁。在 JVM 中确定一个类的唯一性由类加载器和类本身。 然后讲了双亲委托,4个类加载器,如果没有找到就会通过自己加载 findclass,类名称转化为字节码,defineclass 返回 Class 对象。

大佬:用过 Tomcat 吗?

我:用过

大佬:知道 Tomcat 什么加载和什么加载(我记不清楚了)的区别吗?

我:不是很清楚

大佬:破坏双亲委托的方式?

我:我记得有个contextClassLoder 在 jdbc 加载第三方库 JNDI,会调用线程类加载器…

大佬:其实 tomcat 那两个就是破坏了双亲委托,解释了如果破坏….(讲了很多 蛮多没听懂)


第五个问题

大佬:还知道啥新技术吗? Docker知道不?

我:我了解 Docker 和虚拟机区别

大佬:了解就不问了,没使用过,就不多问了。

大佬: 你平时在学校做的应用是怎么发布的?

我:就是一台服务器,环境、数据库配置好,把war 放在webapp下面就好了,看下可不可以跑

大佬: 那一些使用软件版本知不知道

我:知道但不太关注

大佬: 在实际中 coding 的成本是最低的,你需要关注服务系性能啥的 需要调优,比如 jvm 调优 堆内存啥的…


我:我是不是只能达到平均水平

大佬: 你比平均好一点(客气话),你回答需要是我眼前一亮,才会留下深刻印象,比如第一个问题的 ArrayList 和 LinkedList 添加 100 万 数据谁快? 如果你能答上来,知道为什么我觉得就可以给评A,95%的人其实都不知道


总结

和大佬聊完后回去想了很多,觉得 7 月 10 多号开始到现在一个多月的准备其实感觉是功利主义的追求,自己理解的很多东西都是深入都是皮毛了解。突然想到了考研时朱伟老师的那句话:少一些功利主义的追求,多一些不为什么的坚持。 我哥和我说你不一定要进阿里啊,其它小公司也可以主要是你能学到啥,进了阿里有些你一直搞业务其实学到的并不是很多,小公司有小公司好大公司有大公司好(我知道我哥是在安慰我)。

说实话我想进阿里,想进大公司。但是看看自己现在的能力,真不行。想想这段时间的有点功利性的学习。 好好反思反思!

少一些功利主义的追求,多一些不为什么的坚持。

发布了77 篇原创文章 · 获赞 191 · 访问量 18万+

猜你喜欢

转载自blog.csdn.net/u013164931/article/details/82109347