来自中科院的一次java技术面经历

CSDN话题挑战赛第2期
参赛话题:面试宝典

技术二面

    • 面试流程
    • 面试题
      • 自我介绍
      • 面试题一:
      • 面试题二:
      • 面试题三:
      • 面试题四:
      • 面试题五:
      • 面试题六:
      • 面试题七:
    • 个人经验总结
    • 资料总结/刷题指南

面试流程

最近面了一下中科院的 java开发岗位,大致的面试流程和大厂基本上没什么区别,一共大概五面(不算hr面),整体分为两部分,技术面和非技术面,技术面时间稍长一些,大概1小时左右一轮,非技术面的话,除了最后一轮外,基本上也就30-40分钟(最后一轮一小时半)。面试的形式,第五轮是腾讯会议面试,因为面试官是中科院总部的六位领导,并且需要准备PPT进行演讲,类似毕设答辩,所以时间在所有面试里花费最长的。

接下来就主要介绍下技术面的面试过程和问题,最后再稍微的加一句PPT面试的场景(面对6位终极大boss,内心有多慌)。

面试题

自我介绍

老生常谈,面试前先做下自我介绍:

答案:
我叫XXX,毕业于XX年XX学校,目前工作了XX年,在XX家待过,分别是XX家(这里提示一下,可以说一些比较知名的公司,不知名的可以不用说,如果都不知名,那就无所谓了)。
其中在第一家,负责XX项目,主要实现了XX功能,在这个项目里扮演了XX角色,做了什么贡献,从这里学习到了什么等等,然后依次介绍。

最后说一下为什么要跳槽,以及为什么要选择贵公司等等。(这是一个开场自我介绍模版,如果有需要的小伙伴可以收藏保存,防止下次需要的时候找不到。)

然后接下来就是正式的技术问题了:

面试题一:

听你刚才的项目介绍中,使用到了多线程,那你是怎么保证多线程的安全性的。

问题剖析:

这道题考查了我们平常中使用多线程时的注意事项,有哪些隐患,怎么保证它的安全性等方面

问题解答:

这里从两个方面来解答:
第一点,首先是使用方面,我们都知道hashmap是不安全的,concurrentHashMap 是安全性的,那我们可以在使用的时候尽量使用安全类,比如 Java. util. concurrent 下的类。
第二点就是 ,我们有时候需要考虑到锁,因为某些场景如果不加锁就会导致线程不安全,比如:多个用户操作同一个数据,如果不加锁的情况下,用户1修改该数据的同时,用户2去读取该数据,就会导致数据不一致的问题。所以这时候需要考虑到锁,比如:synchronized 或者 Lock

面试题二:

既然你说到了concurrentHashMap,它为什么能保证线程的安全性呢?

问题剖析:

这道题考查了我们平常使用concurrentHashMap的时候对它的理解,考察了它的底层原理。想听一下你对它和hashmap有什么区别等等。

问题解答:

1、首先:concurrentHashMap 的底层采用了分段锁技术。就是将数据分成一段一段的存储,然后给每一段数据配一把锁,当一个线程占用锁访问其中一段数据的时候,其他段数据也能被其他线程访问。这种行为为实现高并发提供了有利的条件和前提。
2、其次:它是由Segment 数组结构和HashEntry数组结构组成。 Segment 是一种可重入锁(ReentrantLock),它在ConcurrentHashMap 里扮演锁的角色。 并且 Segment的结构和HashMap 类似,是由一种数组和链表结构的形式组成。 HashEntry 则是用于存储键值对和数据。

面试题三:

嗯,不错,那你来回答一下,synchronized的升级原理吧。

问题剖析:

这道题考查了我们对多线程下锁的掌握情况,分别有哪些锁,怎么自动升级的。已经涉及的有点深了,还好事先准备过。

问题解答:

1、首先:锁有无锁、轻量级锁、偏向锁、重量级锁。
2、其次synchronized 锁升级原理:在锁对象的对象头里面有一个 threadid 字段,在第一次访问的时候 threadid 为空,jvm 让其持有偏向锁,并将 threadid 设置为其线程 id,再次进入的时候会先判断 threadid 是否与其线程 id 一致,如果一致则可以直接使用此对象,如果不一致,则升级偏向锁为轻量级锁,通过自旋循环一定次数来获取锁,执行一定次数之后,如果还没有正常获取到要使用的对象,此时就会把锁从轻量级升级为重量级锁,此过程就构成了 synchronized 锁的升级。
3、最后锁的升级的目的:锁升级是为了减低锁带来的性能消耗。在 Java 6 之后优化 synchronized 的实现方式,使用了偏向锁升级为轻量级锁再升级到重量级锁的方式,从而减低了锁带来的性能消耗。

面试题四:

我看你们项目中使用的是spring boot,为什么使用它。(这是个送分题了,得把握住啊。)

问题剖析:

这道题主要是考察下对springboot的理解,基础题。

问题解答:

这道题答案多种多样,就随便举几个例子:
1、配置简单
2、独立运行
3、自动装配
4、无代码生成和 xml 配置
5、提供应用监控
6、易上手
7、提升开发效率

面试题五:

刚刚你说到了自动装配,它是怎么自动装配的呢?(好家伙原来问题在这,我能撤回这一条不。)

问题剖析:

这道题就是要考察下对springboot的理解有多深了,试探面试者是否是仅仅会使用而不知道底层的这样一个状态。

问题解答:

我觉得可以从一下几个方面来讲解:
1.什么是springboot自动装配?
2.springboot是如何实现自动装配的?
首先第一个问题:自动装配是springboot的核心,一般提到自动装配就会和springboot联系在一起。实际上 Spring Framework 早就实现了这个功能。Spring Boot 只是在其基础上,通过 SPI 的方式,做了进一步优化。
SpringBoot 定义了一套接口规范,这套规范规定: SpringBoot 在启动时会扫描外部引用 jar 包中的META-INF/spring.factories文件,将文件中配置的类型信息加载到 Spring 容器(此处涉及到 JVM 类加载机制与 Spring 的容器知识),并执行类中定义的各种操作。 对于外部 jar 来说,只需要按照 SpringBoot 定义的标准,就能将自己的功能装置进 SpringBoot。
没有 Spring Boot 的情况下,如果我们需要引入第三方依赖,需要手动配置,非常麻烦。但是,Spring Boot 中,我们直接引入一个 starter 即可。比如你想要在项目中使用 redis 的话,直接在项目中引入对应的 starter 即可。
引入 starter 之后,我们通过少量注解和一些简单的配置就能使用第三方组件提供的功能了。
所以说,其实自动装配可以简单的理解为:通过注解或者一些简单的配置就能在spring boot的帮助下实现某款功能。
对于第二个问题,如何实现自动装配的,我们只需要在springboot的启动类上加一个
@SpringBootApplication的注解,即可实现自动装配。

面试题六:

那你能说说@SpringBootApplication这个注解的原理吗?(来了,它来了,想再面试中掌握主动权,就需要让面试官按照自己的节奏走,自己抛问题,让面试官去问。这才是winer!)

问题剖析:

这道题就是要考察下对springboot核心注解的原理。

问题解答:

首先:@SpringBootApplication是一个复合注解,大概就可以把 它看作是 @Configuration、@EnableAutoConfiguration、@ComponentScan 注解的集合。
然后分别介绍下这三个注解的作用:
1、@Configuration:允许在上下文中注册额外的 bean 或导入其他配置类,作用与 applicationContext.xml 的功能相同。
2、@EnableAutoConfiguration:启用 SpringBoot 的自动配置机制。
3、@ComponentScan: 扫描包下的类中添加了 @Component (@Service,@Controller,@Repostory,@RestController) 注解的类 ,并添加的到spring的容器中,可以自定义不扫描某些 bean

面试题七:

嗯,springboot掌握的不错,看来在编程这一块还是有一定的基础的,我们这边的话在编程的时候也会用到算法,我看你简历中写参加过蓝桥杯和ACM,也都拿过奖,那我考你一道算法吧,手写个大概思路就行。:算法题目是 解数独 (具体题目我就不写在这里了,不占用篇幅了,想了解的可以点进去看看)

问题剖析:

这道题就是要考察面试者的算法和数据结构的基本功了,以及现场写代码的能力(伪代码)。

问题解答:

(好家伙,上来就是leetCode 最高难度的题,还好以前刷过几遍。)这里代码就不贴上,不占用篇幅了,数独链接里都有,这里就主要说一下思路,该题本质上也就一个回溯,如果对回溯比较了解的话,那基本上还是能写出来的,所以这里简单的介绍一下回溯,(如果要细讲的话,能另开一篇了)。
回溯法是一种选优搜索法,又称为试探法,按选优条件向前搜索,以达到目标。但当探索到某一步时,发现原先选择并不优或达不到目标,就退回一步重新选择这种走不通就退回再走的技术为回溯法,而满足回溯条件的某个状态的点称为“回溯点”。

个人经验总结

这是技术轮第二面的情况,面试官应该是是一个技术主管级别的,所以考察的比较深。还有一点,我觉得面试当中的我的亮点就是,能够把握面试的节奏,自己抛出问题让面试官去问,而不是回答完一个后,干巴巴的等面试官主动提问。因为面试时间有限,自己抛出的问题自己心里肯定清楚该怎么解答,这样面试质量就有了保证。干巴巴等面试官主动提问,谁知道他会问什么样的问题。这时候心里就有一丝紧张感,完全不利于发挥。

资料总结/刷题指南

如果大家想提升自己的算法和数据结构能力的话,可以加入新成立的【LeetCode学习社区】,大家一起学习一起讨论来实现共同进步。
也可以关注我的博客,一周更新三篇技术类文章,大家一起进步一起学习。

你可能感兴趣的:(生活杂谈,java,面试,程序人生)