您的位置:首页 > 职场人生

研二面试大厂的面试题记录

2020-07-12 09:58 344 查看

一、自我介绍

二、项目介绍

自我项目介绍和负责的模块
讲解重点和核心
实习心得
个人情况

三、面试

【面试官】我看你这边写到对常见的数据结构有一些了解,你能跟我聊一下HashMap这种数据结构吗?
【我】可以的,HashMap在1.7和1.8/做的一个比较大的改变一点,
1.7之前使用的是数组+链表,他的数据节点是一个Entry节点,是他的一个内部类,在这之前,数据插入的过程是使用的是一个头插法,但是会产生一个问题就是,他在resize时候,也就是在扩容的时候,可能会造成里面有一个resize(),他又调用了一个transfer的方法,把里面的的一些entry进行了rehash,在这个过程中可能会造成一个链标的一个循环,就可能在下一次get的时候出现一个死循环的情况,也有可能就是因为他没有加锁,再多个线程并发的时候,不能够保证时安全的,就是我put的进去值的时候,取出来还是我put进去的一个值。JDK1.8以后进行了一个比较大的变化就是,把它变成了链表+数组+红黑树折磨一个结构,把原来的一个Entry节点变成了一个Node节点,他的整个put的过程也做了一个优化。

【面试官】你先简单说一下他的扩容机制吧,刚刚因为我看到你提到扩容。
【我】扩容机制,就是要了解capicity这个节点就是在初始化HashMap,如果没有设置他的初始值,他的默认初始值容量为16,负载因子0.75,如果当计算出来一个threhold是他的一个扩容的阈值,如果当我在put的时候我会先判断我当前的size是不是大于这个阈值,如果大雨的话,就回创建出来一个两倍大小,原来的两杯大小,将原来的一个Entry,进行resize的折磨一个过程。

【面试官】刚刚你有提到1.7之前是头插法,1.8之后是尾插法,那头插法时候会有死循环,是线程不安全的原因之一,那么在1.8之后线程就安全了吗?
【我】他也不是线程安全的,因为才用了尾插法,没有改变,他原来数据插入的一个顺序,不会出现链表循环的一个问题。

【面试官】那么它线程不安全,你在日程开发中,是怎么保证他的线程安全呢?
【我】我一般会使用ConcurrentHashMap线程安全的一个集合容器

【面试官】那,线程安全的还有HashTable啊,或者我给他加Synchronized啊,或者Lock啊,或者用Collection.Synchronized都可以对它进行一个同步的操作,你为神魔选他啊?
【我】第一个就是他的并发度更高,在我看来,普通的HashTable就是直接对里面的方法进行了一个Synchronized加了一个对象锁,但是ConcurrentHashMap在1.8之后变成了数组+链表+红黑树,他只会锁住就是我目前渠道的那个Entry所在的那个节点一个的值,在上锁的时候使用了CAS,效率更高。

【面试官】刚刚你提到了锁升级,你跟我介绍介绍他的过程?
【我】好的,就是在最开始的时候,我们的锁是由有支持偏向锁的,我当前获取到锁资源的这个线程,我会优先让她再去获得这个锁,如果它没有获取到这个锁,就升级成为一个轻量级的,一个CAS的锁就是一个乐观锁,乐观锁的时候他就是一个比较有交换的过程,如果这个CAS如果没有设置成功的话,他会进行一个自旋,自旋到一定的次数之后才会升级成Synchronized折磨一个重量级的锁,这样的话就保证了他的性能的问题。

【面试官】OK,其实你还漏了异一步,他应该是最开始是无锁的状态,一上来他会先去判断一下,然后再升级,不过没关系,你吧核心的全部答出来了
然后我看到你这边还对Spring也是比较了解,他里面的事务隔离级别有几种你知道吗》?
【我】主要分为7中,比如说Required就是我支持当前事务,如果没有当前事务,还有Supports,如果没有事务,就以非实物进行运行,还有Mandatory,如果当前没有事务,我就抛出异常,还有nOt_Supported就是非事务运行,有挂起,还有Never就是非事务运行,如果有就抛出异常,还有就是一个Required——New就是支持一个内嵌的一个事务过程。

【面试官】OK,你现在在日常开发过程中,使用的最常用的事务隔离是哪一个?
【我】嗯,Required

【面试官】那么他和数据库的事务隔离级别又什么区别呢?
【我】这个,没有了解太多

【面试官】没关系,后面你去了解一下,其实差不太多,你对AOP了解吗?他的实现方式有哪些?或者说你的项目中使用到的AOP你简单给我介绍一下。
【我】我在项目中主要使用AOP可以做全线预热,还有一些日志的操作,因为他可以订一些切点,将一些窃电的植入进去,比如做权限的校验,JWT,可以先AOP拦截下来,判断权限,也可以把日常的日志操作,相应的变更。他主要有两种框架,一个是使用JDK,因为是使用动态代理去做Proxy,另外一个就是cglib,他们两个区别主要是,JDK Proxy可以生成语言接口,就是语言相通的接口,折磨一个类,如果原来的类没有实现接口的话,就是他可能,不太合适。如果cglib的话,就会使用一种字节码的ASM编辑器,可以生成一个目标类的子类,去实现类似动态代理的功能,在性能来说,cglib他在创建对象的过程中,可能就是做的更慢一些,但是在运行的时候效率更高一些。

【面试官】我看你这边还提到了反射机制,你在开发过程中神魔地方用到了反射,或者说java它本身那些地方用到了反射,你大概能给我说说吗?
【我】好的,就是提到了代码的重构,可以达到的效果就是可以用一套代码跑多个流程,南无我们如何去适配更流程呢,首先就用到一些泛型,在运行的时候去获取到泛型折磨一个运行时候的类,拿到他对应
业务的一个实体类,去放置一些业务信息,因为反射可以获取到运行的一些状态信息,所以可以能够达到代码复用的过程。

【面试官】动态获取是吧?,那你有没有考虑过反射的性能,因为据我了解,反射在大多数情况下性能并没有拿么好?
【我】对,因为反射他会先去方法区里面就是先去看它这个类有没有加载过,如果没有的话会有一个类加载的过程,可能的话就会影响性能。

【面试官】嗯,因为反射是一个解释操作嘛,需要告诉JVM,希望他怎么做,就是比我们直接写代码,直接操作会慢一点。我看到你的简历说对Nginx有了解,你知道踏实怎么做均衡的吗,或者说她做负载均衡的常见算法有哪些?
【我】主要是一致性哈希,就是他可以就跟Hashmap的 KEy 一样,去做一个一次性哈西,把那个,还有就是加权,可以吧权值加大,让更多人的流量打到某台机器上,这就是的话可能就效果并没有那么好吧,

【面试官】OK,嗯,一致性哈希的一致性是什么意思,
【我】呃,我所理解的一致性,哈希就是呃,所有的所有的流量过来是一样的就是,如果我这次达到了一台机器上下一次还可以打造一台机器上同一台机器上那

【面试官】OK,你这边对网络的就是TCPUDP的比较熟悉三次握手,我们来聊一下为什么是三次握手,而不是两次或者四次吧,
【我】呃好的,我所理解的三次握手,就是因为首先他三次握手是因为什么,我客户端要给那个发那个服务器报告,我要我要和你建立连接,然后顺便把我自己的一个发送的能力,然后发给服务器,让服务器知道,然后服务器判断我是否可以给你创建链接把我的一个接收的一个能力,然后返回给客户端,然后只有三次握手,才能够保证就是双方的发作能力和接受能力都达到了一个就是我认为就是写上好的这么一个过程,但是因为协议没有100%可靠的,所以这三次已经够了,如果四次也不能保证是100%可靠的

【面试官】嗯,其实就是TCP,它本身是一个稳定的可靠的链接吗,所以说对你刚刚说这个过程是OK的,嗯嗯,讲一下,你就是在研究生期间觉得不错的项目,因为我看你这边有提到的大概都是实习的项目研究生里面,你有大概做一些什么项目啊,
【我】那个这些直销系统就是我的研究生啊,那个就是是吧哦对对对你觉得你说你在里面担任的是组长吧,你是怎么去沟通和协调就是平时你们组员之间的一些工做。出现一些矛盾或者工作压力比较大的情况,你是怎么处理这种情况做一个组长
【我】呃,我觉得作为一个组长,首先互联网这个行业压力本身就是很大的,然后作为一个组长,我只能说就是按照他们目前的一个工作的状态,还有他们目前的就是一个能力的范围,给他们安排合适的一个需求的一个迭代的过程,嗯,然后尽尽量的把我们的开发规范,还有我们的那个一个一个上线,不管说是上线,还是我们需求的一个一个评审的一个过程,给做规范,然后把文档给刘规范这样的话才能够让我们项目就是项目组吧,更平稳了,再往前发展,

【面试官】嗯,我看你项目里面,你不是说写到有用,mysql去做一些就是使用吗,你在里面有没有一些调优的经验,就比如说是对数据库用多个所以匹配的时候有什么经验吗,
【我】呃,如果说就是在所以这一块儿其实是sql调优的一个比较大的一个过程,我这个我来看来的话就是我们首先可以就是把他看着,比如说我创建索引,我在创建索引的时候可能会考虑以下几个因素,首先覆盖索引内覆盖索引可以减少回表的次数,
【面试官】java8的新特性来讲一讲?
【我】…

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐