云从科技Java开发岗面经 - Sanarous的博客

云从科技Java开发岗面经

7 月 31 号晚上 8 点 30 视频面试的,面试官还可以,问的不算深,也都是基础知识。但是由于是第一次视频面试,有点紧张导致思路有点短路,有些关键点还是回答的不算好或者直接没回答上来,后面还要继续努力啊。。

  1. 先自我介绍,然后介绍一下最近做的项目,由于在实习,所以说的是实习中正在做的项目,项目中涉及到了 Netty,面试官对这个比较感兴趣,问我实习项目中 Netty 流量有多大,然而实际上我还没开始写 Netty 相关的业务…所以只能说不知道,目前还在看文档。面试官就没多问了,下面就是问 Java 基础。
  2. Java 基础你应该很了解吧,说说 Java 面向对象的三大特性?然后问你觉得多态的特点是什么?(ps:上次面试也问了我多态的原理)
  3. Java 容器你很清楚吧,那你说下 JDK1.8 后的 Map 的实现?我说既然是 Map,那就以最常用的 HashMap 举例, JDK1. 8后 HashMap 从数组+链表方法优化为数组+链表+红黑树的实现方式,链表长度默认超过 8 时会转化为红黑树,红黑树的搜索效率比长链表要高。然后他就问那你觉得红黑树相比其它树好在哪里,为什么采用红黑树?我说红黑树搜索效率高于普通二叉树,但是没有完全搜索二叉树效率高,应该是一种折中的体现吧(这里瞎掰了,回答是错误的,采用红黑树是因为红黑树的搜索、删除、插入最坏时间复杂度都为 O(logn))。那你说说容器中的 Map 使用的时候有哪些需要注意的地方?面试官这个问题提的有点突然,导致我也没完全想清楚,就按照能够想到的回答了,还是以 HashMap 为例,首先 HashMap 是线程不安全的,使用的时候需要注意单线程还是多线程环境,如果是多线程的话需要使用 ConcurrentHashMap 或者 Collections 类中的静态方法 synchronizedMap() 方法实现线程安全的 HashMap;第二点就是使用 HashMap 存储引用类型时,需要同时覆盖 equals 和 hashCode 方法。然后面试官说我第二点说的可以,一般人都想不到这点。。。但是事后我记起来我忘了说第三点,也是可以直接深入源码层面分析的,就是由于 HashMap 扩容机制的存在,使用前如果能大概知道容器存储的容量,在创建 Map 时就要指定容量,因为 HashMap 的 resize() 扩容机制效率是很影响性能的。。。不该啊。。
  4. JVM 你了解吗?那你说说 1.8 后的 JVM 内存收集算法?我说 JDK1.8 后 HotSpot 虚拟机引入了 G1 收集器,即 G1 收集算法,然后他问那你说说 G1 算法的特点?balabala一堆,那你觉得 G1 算法和标记算法的区别是什么?
  5. 然后继续问你了解双亲委派机制吗?我说了解,他问那你说说双亲委派机制中有几个类加载器?双亲委派机制的作用是什么?然后他问那如何破坏双亲委派机制?这个问题我没有答上来,我想了一下说是通过自定义类加载器修改类加载条件进行破坏,面试官没有回答我说的是否正确。。。各位可以自己百度一下答案。
  6. 多线程你了解吧?说说悲观锁和乐观锁?我说悲观锁就是线程在更新操作时总是认为会有其它线程来竞争,所以悲观锁会先进行加锁,如 Synchronized 和 ReentrantLock 都是乐观锁的实现,乐观锁就是线程在更新操作时总认为不会有其它线程跟自己竞争,那么这个线程在更新操作时会尝试去进行更新,如果更新成功就成功,如果失败就采取失败策略,常用的失败策略就是自旋,乐观锁的实现最常见的就是 CAS。
  7. 然后他问你知道数据库中如何实现乐观锁的吗?这个好像是面试常问题。。但是我还没复习完数据库。。仅凭记忆说了一下好像是使用 select xxx for update。。然后他说这是悲观锁。。。好吧丢人丢到家了。。。
  8. 然后又问了我数据库索引有哪些?B+ 树索引和哈希索引的区别和各自特点?
  9. 回到多线程,那你说说原子类的实现原理?
  10. 最后问了 IO,先问从 1.8 之后,JAVA 中的 IO 分为哪几类?然后问了一下 NIO 和 AIO 的区别?这个问题不难。。但是没答上来,我只说 NIO 是一个 Selector 轮询 Channel 通道,AIO 采用的是事件去驱动模型,具体的实现我答不上来,然后直接坦白说这方面我实在了解不多。。
  11. 最后问了我有什么需要问他的,我问了两个问题,一个是云从科技目前 Java 是在做什么方向,一个是我目前还有哪些地方需要加强,第二个问题面试官说从刚才的表现,有三个方面需要加强,一个是数据库方面,数据库的索引和锁机制需要熟悉(这个确实还没复习完。。。),一个是 IO 操作,最后一个是网络 Socket 编程,第二个和第三个可以说是一个问题,就是加强 NIO 和 AIO 的原理理解,如果能了解 Netty 框架原理更好。。

8 月 15 号下午 4 点 15 远程视频二面的,感觉二面面试官好像把问题写在了纸上- - 问问题的时候还低着头

  1. 不用自我介绍了,恭喜你进入了复试(好像没有一点激动的心情的亚子),上次面试后感受如何?我说挺棒的,上次问了面试官有哪些方向需要加强的,后期也重点看了一下,尤其是数据库和 IO 上。
  2. 那你说下数据库中的索引吧?使用索引有哪些需要注意的地方?这个我从索引的建立和避免用不到索引的角度来说的。
  3. Spring 中的事务怎么实现的?使用 AOP
  4. Java 中创建线程池有哪些方式?我说分为两类,一类是 Excutor 创建的,一类是直接 new ThreadPoolExecutor 的,并且问我第一类 Excutor 创建的原理(跟昨天网易面试问的一样),然后问我一般使用哪一种方式创建?我说第二种,因为易于控制和自定义参数。面试官在这里还解释了开发规范上要求尽量不要使用 Excutor 创建,这个我当然知道啦,就是阿里巴巴 Java 开发手册上的原话。
  5. 解释一下 AQS 原理?AQS 怎么实现公平锁和非公平锁的?
  6. 解释一下 CountDownLatch 和 CyclicBarrier 的区别?我说是 CyclicBarrier 提供的功能更高级,包括 reset() 重置、提供获取当前等待的线程数量等 API 操作,面试官解释说这不是核心,CountDownLatch 是线程到达同步点后再一起执行,CyclicBarrier 是线程之间互相等待…反正说了半天我还是没明白这个方面有什么区别,反正用起来是一样的感 jio,后面再补一下此处的原理。
  7. 问我熟悉分布式吗?我解释了一下什么是分布式,面试官说听我说的感觉我不熟这玩意…没关系,后面还问了一下知道怎么保证分布式系统的可靠性和一致性吗?答…不知道,这个估计是想闻一下分布式事务和分布式锁之类的,我不是很会所以也没继续往下问。

感受:两场面试感觉都还可以,面试官都比较 nice,问的问题也都属于基础性问题,没有给场景、算法题,然后这也是目前第一次面试被问了整个 Java 知识体系,帮我查漏补缺了一些知识点,后面继续努力学习!以应对后面更多的大公司!


8 月 20 号下午 2 点 半电话 HR 面的,20分钟不到就结束了。

  1. 自我介绍

  2. 了解云从科技吗?

  3. 印象最深或者最有成就的项目(简历上的)

  4. 在实验室干活的时候是一个什么角色?leader 还是干活的?还是善于提意见的?

  5. 如果和同学在项目某些意见上不一致会有 argue 吗?怎么解决的?

  6. 如果谁都不服谁怎么解决?

  7. 自我评价,个人优缺点

  8. 职业规划,对于岗位和公司的偏好

  9. 有没有其它 offer?有没有其它在面试流程的?

  10. 意向薪资

如果这篇文章对您很有帮助,不妨
-------------    本文结束  感谢您的阅读    -------------
0%