得物一面凉经(经典八股文拷打,全部反思)+处女面感受
得物面试被面试官全程八股拷打。因为是第一次面试很多答不出来,我尴尬的脚指头都能扣出三室一厅。
这周想着先把八股过一遍,才刚刚复习到JUC,JVM上次看还是两个月前,数据结构上次系统学还是大二下,完全没想到会考。
项目是一点没问,全程被疯狂拷打。
周末对着这些问题深刻理解了一下,发现这些问题都非常经典,都是高频的考点和易错点,所以我整理出了八股文面经,攒攒人品,希望大家多多点赞+收藏,持续关注,有更多对面试的详细干货。
一、一面问题
计算机网络:
1、说一下计算机网络的分层模型。
2、如果没有第三次握手会怎样 ?
3、TCP/IP为什么可靠?是如何保障的?
3、域名解析的过程?
MySQL:
1、联合索引是什么?
2、考联合索引,问:执行SQL语句具有条件 where a=1 b>2 c=3,它会用到联合索引吗?
3、隔离性是解决什么问题?
4、(场景题,比较基础经典)在可重复读这个隔离级别下,有两个事务AB,对一个金额数据100进行更改,A事务每次加10,B事务每次加20,A事务执行1秒,B事务执行10秒,B事务执行到第3秒的时候A事务执行,请问最后金额的值是多少。
JVM虚拟机:
1、如何确定一个对象是垃圾对象?
2、软弱引用怎么理解?
3、GCRoot会引用到弱引用对象吗?
4、Class类型的对象有可能被回收吗?
JUC并发编程:
1、ReentrantLock具有哪些特性?
2、ReentrantLock底层是怎么实现的?结构是怎么样的?
3、Volatile关键字能保证线程安全吗?如何保证变量可见性?
4、线程池里面的线程区分核心线程和非核心线程吗?如何从线程自身角度去区分是核心线程还是非核心线程。
数据结构
1、大顶堆的插入过程是怎样的?
2、大顶堆删除一个元素是怎么调整的?
3、大顶堆插入和删除的时间复杂度和空间复杂度是多少?
二、一面拷问回答
计算机网络:
1、说一下计算机网络的分层模型。
OSI七层模型:
应用层:提供服务、应用程序给用户。举例:HTTP、DNS。
表示层:负责数据处理,包括:编解码、压缩解压缩、加密解密、格式化。举例:JPEG、SSL。
会话层:管理和控制会话,包括建立、维护和终止会话。举例:RPC。
传输层:提供可靠的数据传输服务。包括:流量控制、错误检测和修复。举例:TCP、UDP。
网络层:负责路由和寻址。决定数据包从源到目的地的最佳路径。举例:IP。
数据链路层:负责帧的组装、拆解和错误检测和修复。举例:Ethernet。
物理层:定义了硬件规范,涉及物理连接和传输介质。举例:光纤、铜缆、USB、IEEE802.3。
2、如果没有第三次握手会怎样 ?
1、 无法确认客户端接收能力。服务器无法确认客户端是否已经收到SYN-ACK包,无法确认连接是否成功。
2、 无法确认服务器发送能力。服务器无法确定自己的发送能力是否正常。
3、 无法确认网络状态。无法确认网络的状态是否正常。如果此时发送数据,可能导致数据丢失,无法保证数据可靠传输。
4、 资源浪费。服务器可能会为未确认的连接分配资源。
总结:没有第三次握手,服务器无法确认连接状态,数据传输的可靠性得不到保证,并且会造成资源浪费。
3、TCP/IP为什么可靠?是如何保障的?
可靠性保障:
1、 数据传输之前:有三次握手确保连接。
2、 数据传输时:有序列号和确认应答、超时重传、滑动窗口、拥塞控制之类的机制。
3、 数据传输之后:有四次挥手断开连接。
序列号和确认应答:每个TCP端都包含一个序列号和确认应答号,用于确保数据包按顺序到达且不重复。
超时重传:TCP发出一个报文段之后,会启动一个定时器,等待目的端确认收到这个报文段。如果未能及时收到确认,将重发报文段。
滑动窗口:主要用于流量控制。TCP连接每一方都有固定大小的缓冲区空间,接收端只允许发送端发送接收端缓冲区能容纳的数据。如果接收方来不及处理会告知发送方,降低发送的频率,防止包丢失。
拥塞控制:TCP使用多种拥塞控制算法(慢启动、拥塞避免、快恢复等)来防止网络拥塞,当网络拥塞时,调整发送数据的速率。
3、域名解析的过程?
第1步:检查浏览器缓存中是否有域名解析对应的IP地址。
第2步:检查操作系统缓存中是否有域名对应的DNS解析结果。
第3步:检查本地DNS服务器(内网)是否有域名对应的解析结果。
—————————————————————————
第4步:如果本地DNS服务器没有缓存结果,就向根DNS服务器发送查询请求。
第5步:根DNS服务器返回给本地DNS服务器一个顶级DNS域名服务器的地址。
第6步:本地DNS服务器向顶级域名DNS服务器发送解析请求。
第6步:顶级域名DNS服务器查找并返回对应的权威域名服务器的地址。
第7步:本地DNS服务器向权威域名服务器发送查询请求。
第8步:权威域名服务器询存储的域名和IP的映射关系表,把查询出来的域名和IP地址等信息连同TTL值返回给本地DNS服务器。
—————————————————————————
第9步:本地DNS服务器缓存域名和IP地址对应关系。
第10步:解析结果返回给本地电脑,完成域名解析过程。
补充:
根DNS服务器:全球13台,负责管理互联网的根域。
顶级DNS服务器:存储了顶级域名下所有权威域名服务器信息。
权威域名服务器(Name Server):提供特定域名解析信息的服务器。
二级域名:顶级域名下的子域名。
根服务器(存储顶级域名服务器地址)——>顶级域名服务器(存储权威域名服务器地址)——>权威域名服务器(存储域名和IP的映射关系表)
MySQL:
1、联合索引是什么?
定义:使用表中多个字段创建索引,就叫联合索引,也叫组合索引或复合索引。
使用场景:多条件查询,根据多个列进行查询。对多个列进行排序或分组操作。
2、考联合索引,问:执行SQL语句具有条件 where a=1 b>2 c=3,它会用到联合索引吗?
考察知识点:最左前缀匹配原则。
从左向右进行匹配,直到遇到范围查询(>或<)为止。对于>=和<=和BETWEEN以及LIKE的范围查询不会停止匹配。
标答: a和b列会用到联合索引,第2个条件b>2是范围查询,所以c列不会使用联合索引。
3、隔离性是解决什么问题?
解决的是在多用户环境下,多个事务同时访问和操作数据库,相互干扰,导致数据不一致的问题。
问题包括:
1、 脏读(读到的是脏数据,读到的是回滚前的数据。A对数据进行修改,B读到的是修改后的数据,但A将数据回滚,此时B读到的就是脏数据)。
2、 丢失数据(或者说覆盖数据。A先对数据进行修改,B再对数据进行修改,导致A对数据的修改被覆盖丢失)。
3、 不可重复读(类似幻读,不可重复读侧重于修改。A事务多次读同一个数据,B事务对这个数据的值进行了修改,导致A事务多次读到的数据值不同)。
4、 幻读(类似不可重复读,幻读侧重于插入。A事务多次对某张表进行读取,B事务向该表中插入数据,导致A事务在后续的读取中发现多了原本不存在的数据,就像出现幻觉一样)。
4、(场景题,比较基础经典)在可重复读这个隔离级别下,有两个事务AB,对一个金额数据100进行更改,A事务每次加10,B事务每次加20,A事务执行1秒,B事务执行10秒,B事务执行到第3秒的时候A事务执行,请问最后金额的值是多少。
所谓可重复度简单来理解就是:当事务A对数据进行修改的时候,不会影响到事务B读到的值,事务B可以重复读取数据而不受其它事务的影响。
A事务在3到4秒的时候将金额增加10,初始数据是100,所以此时是110。
B事务在1到10秒的时候每秒将金额增加20,初始数据是100,所以此时是200。
最后AB事务都提交之后,会将结果进行合并,这种合并是基于快照的,也就是在事务A第4秒提交的金额的基础上,加上事务B最终的值,也就是110+200=310。
JVM虚拟机:
1、如何确定一个对象是垃圾对象?
1、 引用计数法:每个对象有一个引用计数器,记录了有多少个引用指向该对象,如果计数为0,说明没有引用指向该对象,对象即为垃圾对象。
2、 可达性分析算法:从GC Roots根对象开始,用引用链遍历整个对象图,如果对象到达不了根对象,就认为该对象是垃圾对象。
补充:GC Roots根对象:
1、 虚拟机栈中引用的对象(包括局部变量表中的引用类型变量和调用方法时传递的引用类型参数)。
2、 本地方法栈中引用的对象。JNI(Java Native Interface)引用的对象。
3、 方法区中类静态属性引用的对象(static修饰)。
4、 方法区中常量引用的对象(final修饰)。
5、 所有被同步锁持有的对象。
6、 活动线程。
7、 类加载器。
2、软弱引用怎么理解?
软引用:介于强引用和弱引用之间。当系统内存不足时会被垃圾回收器回收,在内存充足时不会被回收。通过java.lang.ref.SoftReference类来实现软引用。
弱引用:比软引用更弱的引用类型。弱引用对象只要有垃圾收集过程发生,就会被回收,无论系统内存是否充足。弱引用避免内存泄露。常用于映射对象,避免内存泄露。通过java.lang.ref.WeakReference类实现弱引用。
3、GCRoot会引用到弱引用对象吗?
不会。GC Roots通常只包含强引用对象。
4、Class类型的对象有可能被回收吗?
答:有可能。满足以下3种情况Class类型对象可能被回收:1、类的所有实例都已经被回收。2、加载该类的类加载器ClassLoader被回收。3、该类对应的java.lang.Class对象没有在任何地方被引用,无法在任何地方通过反射访问该类的方法。
JUC并发编程:
1、ReentrantLock具有哪些特性?
1、 可重入性。同一个线程可以多次获取同一个锁不会发生死锁。
2、 独占性(跟Synchronized类似)。同一时间内只有一个线程能持有锁。
3、 等待可中断。等待的线程可以放弃等待,处理其它事情。
4、 可实现公平锁。默认使用非公平锁,可实现公平锁。
5、 可实现选择性通知。ReentrantLock支持条件队列(Condition),condition.await等待某个条件,condition.signal()唤醒等待的线程。
6、 轮询。使用tryLock()可以使线程反复尝试获取锁,而不必一直阻塞直到获取锁。
7、 带超时的锁。允许在指定时间内尝试获取锁,如果超过规定时间则获取锁失败。
2、ReentrantLock底层是怎么实现的?结构是怎么样的?
ReentrantLock底层实现:
ReentrantLock底层是由AQS实现的,AQS是一个抽象类,英文全称:AbstractQueuedSynchronizer,代表抽象队列式同步器,它提供了实现锁和其它同步装置的基础框架,提供了一个FIFO同步队列来管理锁的获取顺序。
AQS有一个被volatile修饰的state变量(锁计数),state=0代表释放锁,state>0代表获得锁(state>1代表当前线程重复获得锁)。
ReentrantLock实现有lock()和unlock()方法。lock()尝试获取锁,如果当前线程已经持有该锁,则增加锁的计数,是通过调用compareAndSetState方法来进行CAS操作实现的。如果锁已经被其它线程持有则阻塞当前线程。unlock用于解锁,减少锁的计数,当计数为0时,真正释放锁。
ReentrantLock内部的基本结构:
ReentrantLock包含一个抽象内部类Sync,继承自AQS。Sync有2个具体实现:FairSync和NonfairSync,分别对应公平锁和非公平锁。
3、Volatile关键字能保证线程安全吗?如何保证变量可见性?
Volatile能保证线程安全吗?
答:不行。因为Volatile不能保证对变量操作的原子性(比如对volatile修饰的变量i进行++操作,包括读取变量、增加值、写回变量,如果多个线程同时执行这些操作,也可能导致竞态条件,导致最终的结果不一致),只有Synchronized能保证可见性和原子性。
补充:Volatile主要用来保证变量的可见性,告诉JVM这个变量是共享且不稳定的,每次使用都必须到主存中进行读取。
Volatile可以禁止指令重排序,JVM会插入内存屏障,确保操作的顺序性。
4、线程池里面的线程区分核心线程和非核心线程吗?如何从线程自身角度去区分是核心线程还是非核心线程。
区分核心线程和非核心线程:
1、核心线程在初始化时创建,非核心线程是在需要时动态创建。
2、核心线程需要保持存活(等待新的任务),非核心线程会在空闲一段时间后销毁。
可以通过corePoolSize设置核心线程数,可以通过maximumPoolSize设置最大线程数(包括核心线程和非核心线程)
数据结构:
1、你能介绍一下大顶堆吗?
数据结构中的大顶堆是一种特殊的完全二叉树。
特点:1、完全二叉树。除了最后一层外,其它节点都是满的。2、具有堆属性:节点的值都大于或等于其子节点的值。
2、大顶堆的插入过程是怎样的?
将新元素插入堆的末尾。向上调整,比较新插入节点与其父节点的值,如果新节点的值大于父节点的值,则交换,继续向上调整,直到新节点的值小于等于其父节点的值,或者新节点成为根节点。
3、大顶堆删除一个元素是怎么调整的?
首先,将要删除的元素位置标记为索引i,然后和大顶堆的最后一个元素替换位置,将最后一个元素删除。
然后,从索引i的位置向下进行堆化处理,分为下滤和上滤,如果当前节点小于其子节点的值则进行下滤;如果大于其父节点的值则进行上滤,直到找到一个合适的位置并保持大顶堆的性质。
4、大顶堆插入和删除的时间复杂度和空间复杂度是多少?
插入操作分为2步:1、将元素插入堆的末尾。2、上滤操作。
插入时间复杂度:O(logn)。
分析:插入元素到堆末尾时间复杂度O(1)。上滤时因为树的高度为logn,最差情况需要logn次比较,时间复杂度O(logn)。
插入空间复杂度:O(1)。
————————————————
删除操作分为2步:1、将待删元素与堆最后一个元素交换。2、将堆元素下移或上滤。
分析:交换的时间复杂度O(1)。元素上移或下滤最多需要移动logn次,时间复杂度O(logn)。
空间复杂度:O(1)。
三、杂谈
先说一下这周的情况:
21号(上周五)晚上开始投简历,24号(周一)开始陆续有Hr回复,28号(今天周五下午)得物一面。
面试:得物。
笔试+测评:宇信科技、东方财富、浙大应科。
笔试和自我测评邮件都是今天28号收到的,打算周末做一下。
整体感觉:小厂完全不要我;中厂有要的意向;大厂对985一视同仁,给你面试特权,具体发挥看你造化。
改进思路:
1、下一阶段要对重点的知识进行重点的复习,重心还是在八股文上。
2、加强刻意联系,多考考自己,看自己是否真的掌握,避免一看就会,一面就跪的情况,
3、下周要多面试几次,克服心理压力。