常见面试题总结

欢迎各路大神勘误!!!

**************************

**************

计算机网路

1.OSI七层网络模型

物理层,数据链路层,网络层,传输层,会话层,表示层,应用层

2.TCP/IP五层模型?

物理层,数据链路层,网络层,传输层,应用层

2.计算机网络分层的原因?

1.使得结构上独立,容易开发和维护

2.促进形成规范化

3.三次握手

客户端向服务端发送请求,带上同步报文(SYN=1),还有初始化的序列号seq=x,

服务端收到后,就像客户端发送一个同步报文确认报文(SYN=1,ACK=1),初始化序列号seq=y,确认报文ack=x+1,

客户端收到后,向服务端发送请求,带上确认报文ACK=1;序列号seq=x+1,确认号ack=y+1;

4.四次挥手?

第一次,客户发送释放连接的报文(FIN=1,seq=u)

第二次,服务端给客户端发送确认报文(ACK=1,ack=u+1,seq=v)

第三次,服务端给客户端发释放连接的报文(Fin=1,ack=u+1,seq=w)

第四次,客户端给服务端发送确认报文(ACK=1,ack=w+1,seq=u+1)

5.TCP是什么?

是面向连接的可靠字节流传输协议

UDP是什么?

面向无连接得报文传输服务

6.TCP的首部构成?

源端口号,目的端口号,校验和,窗口大小,序列号

7.TCP与UDP的区别?

TCP提供面向连接的,可靠的传输服务

UDP提供的是无连接的,多对多的传输服务

UDP的传输速度更快,TCP的传输速度慢,资源开销大。

TCP拥有流量控制和拥塞控制。

8.Https和Http的区别?

Https是加密的超文本传输协议,结合对称加密和非对称加密技术,对通信进行加密,默认端口是443

Http是不加密的超文本传输协议,默认端口是80

9.浏览器输入URL到返回页面期间发生了什么?

DNS解析URL

建立TCP连接

发送HTTP请求

服务端响应资源

客户端解析资源并渲染

10.tcp粘包是什么?解决办法是什么?

是指TCP传输的数据过大,必须进行分片,然后从发送的数据包中取出数据产生的数据 大小问题,

解决办法:设置分割符,设置报文头部和尾部,

11.TCP怎样实现有效传输?

TCP通过重传机制,流量控制,拥塞控制,校验和,序列号,同步报文实现有效传输

12.流量控制与拥塞控制?

流量控制是通过滑动窗口实现的,发送方和接收方都有一窗口,根据窗口值得大小进行发送数据,发送方发送数据后,窗口内的可发送的数据就减少了,等到接收方给出确认,窗口就可以进行移动,窗口内可发送的数据也就多了,如果窗口内发送的数据一没有的得到确认,且 已经发送完了,那就停止发送。

拥塞控制:

慢启动:拥塞窗口从1开始增大,收到确认后,便指数型发送ACK确认 ,窗口值也是指数级增大。直到达到慢开始门限。

拥塞避免发生:超过慢 开始门限后,窗口值大小便线性增长

拥塞发生算法:出现超时重传的拥塞算法,窗口值重新从1开始,满开始门限变为最大窗口的一半。

出现快速重传的拥塞算法,窗口值从最大窗口之的一半开始,慢开始门限也是最大窗口值得一半。

快速恢复:

出现 对同一数据包得连续三次确认,就初始化窗口之为原来得一半开始,进行线程 增长

  • IP协议的首部结构?

版本号,首部长度,总长度,标识,片偏移,生存时间,首部校验和,目的地址,源地址

  • 什么TCP?

面向连接的可靠的字节流传输协议

  • 什么是 UDP?

面向无连接的报文传输协议

操作系统

  • 进程通信的方式有 哪些 ?

管道,消息队列,共享内存,信号量,信号,Socket

  • 线程同步的方式有哪些?

锁:如使用syconized控制多个线程线程对资源的访问,使得中只有一个线程可以访问资源。

信号量:使用信号量机制,可以防止多个线程同时访问共享 资源。

  • 进程的调度算法有哪些?

先来 先服务:那个进程就先执行哪一个

短作业优先:给执行时间按短优先服务

高响应比优先级调度:结合等待时间和运行时间,通一个进程,等待时间越久,优先权越高。

优先级调度:让优先级高的先执行

时间片轮转:给每个进程分配相同的时候,都执行相同的时间

多级反馈队列:结合优先权和运行 时间,动态修改优先权和执行时间。优先级高的先执行,但是一定时间内都没有

执行结束,就降低有优先级,放入下一个执行队列中,增加执行的时间。

  • 什么是死锁?

死锁是多个进程之间互相等待对方释放自己需要的资源,导致程序卡死,无法继续向下执行的过程

  • 死锁产生的四个条件?

互斥:即资源不是共享的,一个资源只能分配给一个线程使用。

非抢占:一个线程持有资源时,另外的线程只能等待其资源的释放,而不能去抢占资源。

占有并等待:当一个线程执行完后,没有得到下一个资源,就只能占有自己拥有的资源,然后等待 其他线程释放自己需要 的资源。

循环等待:当前进程执行的资源,可以被下一个进程进行请求并等待资源的释放。

  • 如何解决死锁的发生?

预防:破环死锁发生的四个必要条件即可

避免:在系统分配资源的时候,根据资源的使用情况做出提前预测,观察 剩下的资源是否满足下一个线程执行的要求,如果慢🐖可以进行实际分配,不满足就将试探性分配作废(银行家算法),继续等待资源的释放,直到其资源能够满足资源的分配。

就像银行放贷款一样。会先评估有有没有足够的资金给你,没有就先贷款给别人,等待银行从其他人收回本金加上利息后,如果有足够的资金 就放款给你。

JAVA基础知识

  • 说一说集合?

集合也叫容器,由两个接口派生而来,一个是Collection,,下面分别有Set,List,Queue.。

Set中没有重复元素 ,无序的,不可以通过下标访问。

List下面最常用的就有ArrayIist ,LinkedList。ArrayList是变长数组,可以有重复元素,能通过下标访问。LinkedList是链表,

也是变长的,不能通过下标访问,拥有指针进行前后结点的连接。

Queue是队列,下面 主要有Priotity,Queue,Dueue,具有先进先出的特点。

另外一个是Map,下面主要用的就是HashMap,HashTable,LinkedHashMap.是用来存储键值对的一种数据结构。

HashMap和LinkedHashMap的区别?

HashMap的元素输出顺序和我们 插入元素 时候的顺序 并不一致

LinkedHashMap的元素的输出顺序和输入循序是一致的

  • Collection有父类吗?

有Iterator

  • 数组和List的区别?

数组是定长的,一旦进行初始化就 不能改变其大小,

List是变长的,不用初始化大小

  • Integer和int类型的比较?

Integer与int进行比较的时候,Integer会自动进行拆箱为Int再和Int去比

两个new 出来的Integer,无论是什么数字的比较都不相等

两个不是new 出来的Integer,如果在数在-128~127之间,就相等,反之则不相等

new出来的Integer和不是new 出来的Integer也不会相等。

  • List和Set的区别?

List可以放入重复元素,Set是不可以放入重复元素的

List是有序集合,Set是无序集合

List可以通过下标进行访问,Set是不可以通过下标访问的

  • HashMap和CurrentHashMap的原理?

1.7的hashmap是基于数组加上链表实现的,线程不安全。

CurrentHashMap是通过Sement数组和链表实现的,保证线程安全是通过对每个Segment加锁,这个锁继承自RentenLock

1.8的HashMap是 数组加上链表和红黑树是是实现的,

CurrentHashMap是通过+Node数组+链表+红黑树是实现的,保证线程安全的方式是Synchonized和CAS进行的,

HashMap的问题?

多线程扩容的时候容易造成死循环。

多线程

  • 保证线程安全的方式有?

加锁:Sysconized,ReentenLock,ThreadLock

  • 什么是线程池?

线程线程是一种 池化管理线程的机制,主要用于控制线程的创建,运行和销毁,线程池中会维护一定数量的线程,当有新的任务需要执行时,可以直接使用线程池中的空闲线程,从而避免了因频繁创建 和销毁线程而产生的开销。池的原理 ?

  • 线程池的原理?

启动线程池的时候,创建一定数量的线程,先将其放到线程池中。

当收到任务的时候,就将任务提交给线程池。

线程池会根据线程的空闲情况和优先级因素,从线程池中挑选可以执行该任务的线程。

选中的线程从中得到任务并执行,

执行结束后,将结果返回给调用方。

  • 有哪几种先线程池?

newFixedThreaPoool:创建固定大小的线程池

newSingleThreadExecutor():创建一个线程的线程池

newCachedThreadPol:创建一个不限制上限的线程池,任何人提交就执行

newScheduleThreadPool :定时任务的线程池

  • 线程池的拒绝策略?

AbortPolicy:直接抛出异常,阻止系统继续接收新的任务。

CallRunsPolicy:将任务给当前提交任务的线程来执行

DiscardoldestPolicy:丢弃队列中最老的任务,为新的任务腾出位置

DiscardPolicy:直接丢弃新的任务,不做任何处理。

  • 线程池 的使用?

Java线程池详解 - CarpenterLee - 博客园 (cnblogs.com)

JVM

  • 对象的创建的过程?

1.类加载检查,检查整个指令的参数能否在常量池中和定位到这个类的引用,并且检查整个符号的代表的类是否被加载过

2.分配内存:给新生对象分配内存

3.初始化零值:保证对象不赋值的情况下 也能正常访问

4.设置对象头:存储这个类的元数据信息,表示这个对象是那个类的实例

5.执行init方法:按照程序员的意愿进行初始化。

  • Syconized关键字 的实现原理?

Syconized关键字在经过编译后,会在代码块的前后加上 MonitorEnter和MoniterExit字节码指令,当执行MonitorEnter指令的时候,会尝试去获取这个 锁,如果这个锁灭有被获取或者该线程已经获得过该锁,锁得计数器就会+1,当执行执行MoniterExit 指令 的时候,锁的计数器就-1,当 计数器为0时,表示释放掉这个锁了,其他线程就可以获取该锁。

对于可重入锁的理解?

就是一个线程获取到带锁的方法,当执行到一个需要相同锁的方法时,可以不再去获取锁,执行调用该方法即可。

Synchronized和RentrantLock的区别?

Synchronized是基于JVM层面的,RentrantLock是基于API接口层面的Lock,unlLock进行实现的

Syconized实现的是非公平锁,RentenLock可以实现公平锁。

RentantLock中的高级功能:等待可中断,实现公平锁,结合condiition实现“选择性通知”。

MYSQL

  • Innodb有哪些锁?

全局锁:主要 用于全局逻辑备份

表级锁:共享锁(读锁),独占锁(写 锁),元数据锁(DML读锁,DML写锁),意向锁(用于快速判断表中的记录是否被加过锁),AutoInc,会阻塞线程,尽量少用

行级别锁:RecordLock(记录 锁),Gap Lock(间隙锁)存在于可重复读的隔离级别,用于阻止幻读,Next-Lock(临键锁) ,插入意向锁(用于判断当前有线程因为间隙锁在等待 )

  • 聚簇索引与非聚簇索引?

聚簇索引的在叶子结点存储的是整个数据记录,innodb中一定会有一个聚簇索引,用于存储所有的数据

非聚簇索引(二级索引)的叶子结点存储主键,而不是实际的数据

  • 回表?

回表是指通过非聚簇索引查到主键值,然后通过聚簇索引查到整个数据记录的过程

  • 非聚簇索引一定要回表吗?

不一定,如果查询的数据就是主键值,就没必要再去聚簇索引 查找了。

  • 联合索引?

多个字段组成的索引,利用联合索引查询的 时候,请 遵循左匹配原则,也就是左边的优先匹配 ,因为排序的时候先左边排序,在左边相等的情况下,在根据右边排序

  • Mysql默认的存储引擎有哪些?

MyISAM:不支持外键,不支持事务,仅仅支持表级锁,访问速度快

Innodb::支持外键,支持事务,同时支持表级锁和行级锁

Achive:

Merge:基于MyIsam的聚合存储引擎,Merge表实际并没有数据,其实联合的是一系列的MyIsam表,对Myisam表进行操作

Memory:利用散列索引(Hash),对于等值查询速度快

  • 索引的底层实现?

Hash表:利用哈希函数完成索引到列的映射。

B树:不需要全表查询就可以获取数据,但效率不稳定,占用更多的资源,IO次数多

B+数:都从叶子结点获取数据,更有利于范围查询,IO的次数减少。

  • B数和B+树的区别?

b树的所有结点都存放数据,但是B+树只有叶子结点才存放数据。

  • MVCC机制?

即多版本并发控制,用于解决读写冲突,实现是通过3个隐式字段,undo日志,Read_virew.

  • 分库分表?

水平拆分:针对的是一张表的数据非常多的情况,就可以根据数其中的某些字段进行分表,能加快数据查询的速度,

比如根据时间,区域,性别才分。

垂直拆分:从 业务的角度出发。将多的字段拆分出来,划分 成不同的业务表。

  • 什么是事务?

Mysql事务是用来保证数据库一致性和可靠性的机制,是一组指令的集合。要么指令全部执行成功,要么指令全部执行失败,且回滚到执行之前的状态。

  • 事务的几大特性?

原子性:要么全部执行陈工,要莫全部执行失败

一致性:在执行事务的前后,数据保持一致,即数据的综合是保持不变的。

隔离性:事务之间的操作是相互独立的,不会相互影响

持久性:事务一旦被提交以后,在数据库中的修改是永久的

  • 特性的实现方式

持久性通过redo_log(重写日志)实现.

原子性通过undo_log(回滚日志)实现

隔离性 通过MVCC机制或则锁机制实现。

一致性 是 通过持久性+原子性,隔离性实现的

  • 并发事务带来的问题?

脏读 :一个事务读取了另外一个事务修改了但没有提交的数据,造成了读到了脏的数据。

丢失修改:两个事务同时读取数据,然后分别进行了修改,最终的显示只是其中的一个修改

不可重复读:一个事务多次读取同一个数据,但这个事务还没结束的时候,另外一个事务 对数据进行了修改,就造成了

对同一数据的读取值不同

幻读:一个事务多次读取数据,另外一个事务在中途增加了几条数据,造成了一下次读取时会莫名其妙的多出几条数据。

  • 事务的隔离级别?

读取未提交:会发生脏读的情况

读取已提交:可阻止脏读的发生

可重复读:可阻止不可重复读,脏读

可串行化:可阻止幻读,不可重复度,脏读

  • 几种隔离 级别的实现?

读取未提交,直接读取最新的修改数据

可串行化,是通过加锁实现的,每次修改的时候都加锁,等修改 完成了才释放锁,其他操作才能进行,这种方式的执行效率低,容易阻塞。

读取已提交:通过MVCC机制实现,每次读取的时候都生成一个Read_view,每次读取都只能读取其中已提交的数据,如果数据没有提交,就通过版本链读取之前的数据。

可重复读取:通过MVCC机制 实现的,启动事务的时候生成一个Read_view,每次读取的时候都是通过版本链读取的原始值。

  • 事务的底层原理?

开始事务的时候,数据库引擎生成一个唯一表示事务的ID,并把它写入到事务日志中

在事务执行的过程中,所有的操作都被记录咋在事务日志中,而数据库本身的更改仅仅只是暂时保存 在内存中,直到

事务提交时才将更改应用到数据库中

在事务提交之前,数据库引擎会根据隔离级别进行读取和锁定操作,以保证并发事务之间的隔离性和原子性

事务在提交之后,数据库引擎会把所有的更改应用到数据库中,并将事务日志从磁盘中删除,从而保证事务的持久性。

  • 共享锁与排它锁?

共享锁:又被称为读锁,事务进行数据读取的时候获取共享锁,允许多个事务同时获取共享锁

排他锁:又被称为写锁,事务在进行记录修改的时候,就获取锁,不允许多个事务同时获取锁,如果一个记录加上了排他锁,那么其他事务不能对他加上 任何类型的锁。

意向锁?

用于快速判断是否可以对这个表 使用表锁。因为使用表锁的时候,就需要先判断表中有没有行锁,如果单纯一行一行去遍历寻找锁的话 性能太差。

解决办法:

意向共享锁:事务有意向对表中的某些记录加上共享锁,加共享锁之前就必须先去获取改锁的意向共享锁。

意向排他锁:事务有意向对表中某些记录加上排他锁的时候,加锁前必须先后去获取该表的意向共享锁。

Redis

  • Redis有哪些数据类型?

String,List,set,zset,hash,BirMap,HyperLogLog

  • Redis的持久化机制?

RDB快照:将某一时刻的内存数据,以而进制的形式写入磁盘

AOF日志:没执行一条写命令,就把改命令追加的方式写入到一个文件里。

混合持久化方式:集成了AOF和RDB的优点。

  • RDB与AOF的缺点?

RDB优点是恢复数据速度块,但是快照的频率不好把握,频率太低 ,丢失的数据就会比较多,频率太高,就会影响性能

AOF的数据丢失较少,但是数据恢复不快,AOF文件过大还要进行重写

  • 混合持久化?

混合持久化,利用AOF重写日志,然后fork出一个子线程将 数据 以RDB的形式以RDB的形式写入AOF文件中,拷贝过程中的操作命令会被写入到重写缓冲区中,等到RDB拷贝结束,就将缓冲区中的命令写入到AOF文件中,然后将新的AOF文件替换掉旧的文件。这样既能使得数据加载的时候,加载的 速度很快,又能保证数据更新更少的丢失。

  • 过期 键的删除策略?

定时删除:在设置键的同时,创建于一个定时器,让定时器在键的过期时间来临的时候,立即执行对键的删除

惰性删除:放任过期键不管,但是每次获取键时间,都检查该键是否过期,如果过期的话,就删除该键,如果没有就返回该键

定期删除: 每隔一段时间,程序就对数据库进行一次检查,删除里面过期键,至于删除多少键,以及要检查多少数据库,由算法决定

  • 内存淘汰策略?

不淘汰数据策略:当超过最大内存的时候,不淘汰任何数据,而是 直接抛出错误,不让存入新的数据

淘汰数据的策略:

volatitle-random:随机淘汰设置了过期时间的键

volatitle-ttl:优先淘汰更早过期的键值

volatitle-lru:淘汰设置了过期间中最近未使用的键

volatitle-LFU:淘汰最少使用的键。

allkey-random:随机淘汰任意键

allkey-lru:淘汰最久未使用的键

allkey-lfu:淘汰最少使用的键

  • LRU算法和LFU算法的区别?

LRU是通过将最进一次使用的元素移动到链表头部,需要淘汰就把链表尾部的元素淘汰即可

LRU是通过统计一个元素的访问频数,淘汰的是频数的最低的。

Spring

  • 说一说IOC?

inversion if control 控制反转,也被称为依赖注入,通过将对象的创建和管理都交给Spring容器进行实现,能实现对象之间的“解耦”;

  • IOC的底层原理?

反射+代理

能解决对象之间的循环调用问题吗?

  • 说一说(AOP)面向切面编程?

Linux

GDB的常见调试命令?

run:启动调试

break:设置指定位置的断点

step:执行当前行,并进入函数的内部

next:不执行当前行

#常见面试题#
全部评论
待完善
1
送花
回复
分享
发布于 2023-06-10 20:02 四川
棒的
1
送花
回复
分享
发布于 2023-09-06 10:40 陕西
滴滴
校招火热招聘中
官网直投

相关推荐

10 70 评论
分享
牛客网
牛客企业服务