最近面了蚂蚁金服集团的Java实习生,遗憾的是在第三面的时候挂了,不过还是希望能在此博客跟更多人分享我的经验,跟大家一起成长!
由于论文未按照我原本的计划投出去,备战实习的时间被耽搁了,于是乎,从今年的3月份正式准备的Java研发工程师相关的工作!因为我目前在读研二,很多人问我为什么不选择算法工程师,而且我读研期间也是做的算法类(异质图嵌入表示)相关工作,或者找数据挖掘,或者跟NLP相关的工作也行啊!的确,本人也经过再三的思考和相关实际工作的考量,最终还是觉得从事技术类研发工作可能更加适合我吧!
好啦,题归正传!我是3月1日开始准备的Java类相关工作,由于时间匆忙,我只好一边面试,一边准备,导致一开始被一些面试官怼得很惨!一开始准备Java我就投了阿里巴巴集团,于是乎在3月8日收到了杭州阿里巴巴的预面试,电话里面是一个声线温柔的小哥哥,大致就是想跟我约一个时间,由于我的简历通过了阿里系统的简历筛选并且优秀的情况下,给了我预面试,意思就是说,如果我表现优秀,只需要通过这一面就可以提前确定,不影响后续的正式面试!(不过,那时候我准备Java才8天,甚至连最起码的悲观锁、乐观锁都答不上来!!!),于是还是硬着头皮面试,当时大致问了这些我问题:
请问java中内存泄漏是什么意思?什么场景下会出现内存泄漏的情况?
1. 谈谈对HashMap的理解,以及HashMap的底层实现原理?
2. 请问HashMap线程安全吗?conCurrentHashMap是如何解决线程安全问题的?
3. 请问看过JDK的源码吗?对JDK有些什么了解?
4. 请问一下类加载的顺序和过程?
5. synchronized和volilate关键字的作用?对同步代码块有什么理解?
6. 请谈谈对乐观锁和悲观锁的理解,他们的应用场景,和具体的实现方式?
7. 请问你对线程池了解多少?
8. 请问你对设计模式有没有了解?单例模式有几种实现方式?如何实现的?
9. 请问你都学过那些数据库知识?MySQL的索引机制请讲一下
10. 请谈一谈线性表和链表的优缺点
11. 请简述红黑树的基本原理和代码实现
12. 请简述一下快速排序的基本过程和思想
13. TCP/IP模型(4层模型简述)
14. 请简述TCP3次握手和3次挥手的基本过程,为什么不能2次握手?
15. TCP是一个全双工的工程,请简述原理
16. 请问对Redis有些什么了解,是否了解Reids的内存回收机制
17. Java有哪些并发手段,请简述一下
18. 线程数达到线程池的上限,有哪些策略来处理
19. 设计模式
20. 线程池的常用参数
21. 内存可见性、有序性、原子性
22. GC的机制
23. 导致Full GC的几种情况
24. JVM内存调优
25. Java内存模型
26. 接口默认方法的作用
27. HashCode一样,equal不一样怎么办?
28. 分布式锁怎么实现?
29. 最左前缀匹配
30. Tree索引和Hash索引的区别
31. 为什么并发操作会导致hashmap死循环?
32. http和tcp的区别?
33. 请简述什么是内存溢出?
34. CAS实现原理?
35. 平衡二叉树
36. MySQL的存储引擎
当然,由于表现得不好,就没有后续了.........
于是,后面接着面了成都的蚂蚁金服,通过了前两轮面试之后才得知重庆这面也有蚂蚁金服公司,于是将成都的蚂蚁金服转到了重庆蚂蚁金服进行面试!
蚂蚁金服第一面:
1. 浅谈科研项目以及自己以前做过的项目
2. HashMap的初始长度为什么是16?
经验值,既然一定要设置一个默认的2^n 作为初始值,那么就需要在效率和内存使用上做一个权衡。这个值既不能太小,也不能太大,太小了就有可能频繁发生扩容,影响效率。太大了又浪费空间,不划算。
3. 红黑树为什么快,请简述一下原因
红黑树能够以O(log2(N))的时间复杂度进行搜索、插入、删除操作。此外,任何不平衡都会在3次旋转之内解决。而且实际应用中,很多语言都实现了红黑树的数据结构。比如 TreeMap, TreeSet(Java )、 STL(C++)等。
4. “Segment”分段锁中每个Segment中如果叫你来设计,你会怎么设计?
5. GC 算法
6. GC是如何进行清理的?
7. OSI模型和TCP/IP模型
8. Http和TCP之间的区别?以及HTTP为什么要基于TCP来做而不是基于其他协议来做
TCP是传输控制协议,HTTP是数据传输协议,HTTP是基于TCP来做的;
http协议只定义了应用层的东西,下层的可靠性要传输层来保证,但是没有说一定要用tcp,只要是可以保证可靠性传输层协议都可以承载http,比如有基于sctp的http实现。 http也不是不能通过udp承载,在手机上就有人自己开发基于reliable udp的http协议,不过都是非标准的。
9. TCP三次握手过程?为什么不是2次?为什么不是4次?
这里就引出了 TCP 与 UDP 的一个基本区别, TCP 是可靠通信协议, 而 UDP 是不可靠通信协议。
- TCP 的可靠性含义: 接收方收到的数据是完整, 有序, 无差错的。
- UDP 不可靠性含义: 接收方接收到的数据可能存在部分丢失, 顺序也不一定能保证
首先,我们要知道TCP是全双工的,即客户端在给服务器端发送信息的同时,服务器端也可以给客户端发送信息。如果两次,那么B无法确定B的信息A是否能收到,所以如果B先说话,可能后面的A都收不到,会出现问题 。
如果四次,那么就造成了浪费,因为在三次结束之后,就已经可以保证A可以给B发信息,A可以收到B的信息; B可以给A发信息,B可以收到A的信息。
蚂蚁金服第二面:
当时主要问了MySQL,由于太匆忙,没有记下太多,就只想起了这两个问题
1. MySQL索引原理是什么?
(1)索引的本质:一种排好序的数据结构;
(2)Hash 索引:单条记录查询的效率很高,时间复杂度为O(1),但是我们常用的Mysql Innodb引擎就不支持hash索引,Hash索引适合精确查找,但是范围查找不适合;
(3)B+树索引:MySQL中最常用的索引的数据结构是 B+ 树
2. MySQL为什么查询速度快其实就是问B+树为什么查询速度快?
(1)B+ 树的层级更少:相较于 B 树,B+树每个非叶子节点存储的关键字数更多,树的层级更少,所以查询数据更快;
(2)B+ 树查询速度更稳定:B+ 所有关键字数据地址都存在叶子节点上,所以每次查找的次数都相同所以查询速度要比B树更稳定;
(3)B+ 树天然具备排序功能:B+ 树所有的叶子节点数据构成了一个有序链表,在查询大小区间的数据时候更方便,数据紧密性很高,缓存的命中率也会比B树高;
(4)B+ 树全节点遍历更快:B+ 树遍历整棵树只需要遍历所有的叶子节点即可,而不需要像 B 树一样需要对每一层进行遍历,这有利于数据库做全表扫描;
1. 此时此刻,如何知道重庆上方有多少架飞机?
2. 如何预测未来1个小时,重庆上方有多少架飞机飞过?
3. Hashcode()方法和equils()方法的区别?
4. ==和equils()方法的区别?
5. i和j都是Number类型的对象,现在i=7, j=7,请问 i==j 会返回什么结果?为什么?
6. 请问HashMap和HashTable的区别是什么?
7. 请问Java中有哪些集合,集合中哪些是线程安全的?
8. 简单谈一谈链表
9. 大概讲一讲你学到的一些排序方法和其对应的时间复杂度
10. 请问数据库中事物的隔离级别有哪些?分别介绍一下
11. 分布式锁
最后在蚂蚁的第三面挂了,是因为没有答出hashcode具体的计算方法,以及ArrayList扩容原理,还有如何重写hashcode方法和equals方法(以上问题都是基础问题,希望大家在准备的过程中一定要注重基础的学习,不要像我一样,这些基础的问题没有回答上来被挂掉实在可惜!!)