[笔记]后端面试知识点准备

(以下仅仅是我在预习时通过各种地方总结的知识点,所以可能有些内容是copy别人博文但是因为时间久远而没能标出出处,故对应原文版权仍为原作者所有。此外,以下内容的总结并不保证正确性,希望能理解。)

Java基础

========================================================================

语言基础


ArrayList LinkList的区别、插入删除会不会收到位置影响

  • 前者是基于动态数组实现,后者基于双向链表实现

  • 前者适合索引,后者适合插入删除

  • 二者都不是线程安全的,所以可以使用synchronizedList来同步,或者vector

  • 当在遍历时改变其结构,会出现failfast异常

hashmap在jdk1.7和1.8版本中有哪些改动、HashMap实现原理

参考:https://blog.csdn.net/qq_38685503/article/details/88430788

  1. 最重要的一点是底层结构不一样,1.7是数组+链表,1.8则是数组+链表+红黑树结构;

  2. jdk1.7中当哈希表为空时,会先调用inflateTable()初始化一个数组;而1.8则是直接调用resize()扩容;

  3. 插入键值对的put方法的区别,1.8中会将节点插入到链表尾部,而1.7中是采用头插;

  4. jdk1.7中的hash函数对哈希值的计算直接使用key的hashCode值,而1.8中则是采用key的hashCode异或上key的hashCode进行无符号右移16位的结果,避免了只靠低位数据来计算哈希时导致的冲突,计算结果由高低位结合决定,使元素分布更均匀;

  5. 扩容时1.8会保持原链表的顺序,而1.7会颠倒链表的顺序;而且1.8是在元素插入后检测是否需要扩容,1.7则是在元素插入前;

  6. jdk1.8是扩容时通过hash&cap==0将链表分散,无需改变hash值,而1.7是通过更新hashSeed来修改hash值达到分散的目的;

  7. 扩容策略:1.7中是只要不小于阈值就直接扩容2倍;而1.8的扩容策略会更优化,当数组容量未达到64时,以2倍进行扩容,超过64之后若桶中元素个数不小于7就将链表转换为红黑树,但如果红黑树中的元素个数小于6就会还原为链表,当红黑树中元素不小于32的时候才会再次扩容。

为什么JDK1.8要用尾插法?

使用头插会改变链表的上的顺序,但是如果使用尾插,在扩容时会保持链表元素原本的顺序,就不会出现链表成环的问题了。

https://blog.csdn.net/qq_38525526/article/details/99300602

java都有哪些方式创建类的对象

https://cloud.tencent.com/developer/article/1497720

new关键字

Class.newInstance

Constructor.newInstance

Clone方法

反序列化

jdk中有哪些代理模式

静态代理、动态代理invoke、cglib

(cglib -> AOP编程)

Integer比较大小要注意什么?

直接使用==比较的是引用地址,应该使用intvalue()方法,但是如果值为 -128-127 之间就是比较值

多线程、并发等操作


说一说volatile关键字的底层原理

https://blog.csdn.net/u013568373/article/details/94477266

volatile 是轻量级的 synchronized,它在多处理器开发中保证了共享变量的 “可见性”。可见性的意思是当一个线程修改一个共享变量时,另外一个线程能读到这个修改的值

0x01a3deld: movb $0x0,0x1104800(%esi);0x01a3de24: lock add1 $0x0,(%esp);

有 volatile 变量修饰的共享变量进行写操作的时候会多出第二行汇编代码,Lock 前缀的指令在多核处理器下会引发两件事情:

  • 将当前处理器缓存行的数据写回到系统内存。

  • 这个写回内存的会使在其他 CPU 里缓存了该内存地址的数据无效。

正是这两个额外的事件,使得 volatile 保证了共享变量的 “可见性”。

创建线程都有哪些方式

  • 继承Thread类

  • 实现Runnable接口

  • 实现Callable接口+Future管理

  • Executors.newFixedThreadPool(n)线程池

线程池的工作原理

https://blog.csdn.net/fighting_yu/article/details/89473175

  • 线程池的五个状态:running,stutdown,stop,tidying,terminated

  • 核心线程数、最大线程数

  • 线程池工厂

  • 阻塞队列

  • 新增任务的整个流程

说一下synchronized?锁升级哪阶段可能会出现内存溢出?轻量级锁的时候,因为每个线程都要自旋所以可能会出现这个问题

synchronized可以用在如下地方

修饰实例方法,对当前实例对象this加锁

修饰静态方法,对当前类的Class对象加锁

修饰代码块,指定加锁对象,对给定对象加锁

synchronized锁有四种状态,无锁,偏向锁,轻量级锁,重量级锁,这几个状态会随着竞争状态逐渐升级,锁可以升级但不能降级,但是偏向锁状态可以被重置为无锁状态

具体内容

synchronized和reentrantlock的区别

这两种方式最大区别就是对于Synchronized来说,它是java语言的关键字,是原生语法层面的互斥,需要jvm实现。而ReentrantLock它是JDK 1.5之后提供的API层面的互斥锁,需要lock()和unlock()方法配合try/finally语句块来完成

便利性:很明显Synchronized的使用比较方便简洁,并且由编译器去保证锁的加锁和释放,而ReenTrantLock需要手工声明来加锁和释放锁,为了避免忘记手工释放锁造成死锁,所以最好在finally中声明释放锁。

锁的细粒度和灵活度:很明显ReenTrantLock优于Synchronized

https://blog.csdn.net/zxd8080666/article/details/83214089

threadlocal介绍一下?要注意什么?

ThreadLocal的作用是提供线程内部的局部变量,这种变量只存在线程的生命周期

  • ThreadLocal引起脏数据

  • ThreadLocal引起的内存泄漏

https://blog.csdn.net/huyunqiang111/article/details/90602943

https://blog.csdn.net/qq_42742861/article/details/90649837

如何减少线程上下文切换

https://www.cnblogs.com/scru/p/14506703.html

  1. 无锁并发编程。多线程竞争锁,会引起上下文切换。如果是多线程处理数据时,可以根据hash分段处理数据,避免锁竞争

  2. CAS算法。java的 atomic原子类 ,compare and swap,比较再交换,也是一直无锁算法。内存值V,旧的预期值A,要修改的新值B。如果内存值和A相同,则修改成B,否则什么都不做。CAS算法与sychronized相对,算是乐观锁。

3 减少不必要的线程数量

4.协程,在单线程里实现多任务的调用。协程是运行在线程之上,当一个协程完成后,可以主动让出,让另一个协程运行在上面

讲一下BIO, NIO, IO多路复用

https://www.cnblogs.com/study-makes-me-happy/p/9603290.html

BIO:同步阻塞式IO,服务器实现模式为一个连接一个线程,即客户端有连接请求时服务器端就需要启动一个线程进行处理,如果这个连接不做任何事情会造成不必要的线程开销,当然可以通过线程池机制改善。

NIO:同步非阻塞式IO,服务器实现模式为一个请求一个线程,即客户端发送的连接请求都会注册到多路复用器上,多路复用器轮询到连接有I/O请求时才启动一个线程进行处理。

AIO(NIO.2):异步非阻塞式IO,服务器实现模式为一个有效请求一个线程,客户端的I/O请求都是由OS先完成了再通知服务器应用去启动线程进行处理。

用没用过线程池,介绍一下线程池的参数

https://blog.csdn.net/pi31415926535x/article/details/115818490#t29

容器用过哪些

ConcurrentHashMap:并发版HashMap

CopyOnWriteArrayList:并发版ArrayList

CopyOnWriteArraySet:并发Set

ConcurrentLinkedQueue:并发队列(基于链表)

ConcurrentLinkedDeque:并发队列(基于双向链表)

ConcurrentSkipListMap:基于跳表的并发Map

ConcurrentSkipListSet:基于跳表的并发Set

ArrayBlockingQueue:阻塞队列(基于数组)

LinkedBlockingQueue:阻塞队列(基于链表)

LinkedBlockingDeque:阻塞队列(基于双向链表)

PriorityBlockingQueue:线程安全的优先队列

SynchronousQueue:读写成对的队列

LinkedTransferQueue:基于链表的数据交换队列

DelayQueue:延时队列

JVM


说一说jvm工作流程

jvm怎么判断哪些对象应该回收

https://www.cnblogs.com/thisiswhy/p/12354864.html

引用计数算法和可达性分析

在对象中添加一个引用计数器,每当一个地方引用它时,计数器就加一;当引用失效时,计数器值就减一;任何时刻计数器为零的对象就是不可能再被使用的。不能解决循环依赖的问题

可达性分析算法的思路就是通过一系列的“GC Roots”,也就是根对象作为起始节点集合,从根节点开始,根据引用关系向下搜索,搜索过程所走过的路径称为引用链,如果某个对象到GC Roots间没有任何引用链相连。

  • 哪些对象可作为GC Roots?

虚拟机栈(栈帧中的本地变量表)中引用的对象;

方法区中类静态属于引用的对象;

方法区中常量引用的对象;

本地方法栈中JNI(即一般说的Native方法)引用的对象。

  • java里面有哪几种引用

强引用,软引用,弱引用,虚引用

强引用:是指创建一个对象并把这个对象赋给一个引用变量

软引用:SoftReference aSoftRef=new SoftReference(aRef); 如果一个对象具有软引用,内存空间足够,垃圾回收器就不会回收它;

弱引用:弱引用也是用来描述非必需对象的,当JVM进行垃圾回收时,无论内存是否充足,都会回收被弱引用关联的对象。

虚引用:如果一个对象与虚引用关联,则跟没有引用与之关联一样,在任何时候都可能被垃圾回收器回收。

  • 引用不可达的对象什么时候才会被真正回收?

至少要 经历两次标记过程:

第一次标记:如果对象在进行可达性分析后发现没有与GC Roots相连接的引用链,那它将会被第一次标记。

第二次标记:经过第一次标记后的对象,根据 此对象是否有必要执行finalize()方法 进行筛选,随后会由收集器对F-Queue中的对象进行第二次小规模的标记。具体如下:

双亲委派机制

  • 三种类型类加载器

引导类加载器jvm、扩展类加载器jre、系统类加载器jdk、(自定义类加载器)

  • 双亲委派机制描述

某个特定的类加载器在接到加载类的请求时,首先将加载任务委托给父类加载器,依次递归,如果父类加载器可以完成类加载任务,就成功返回;只有父类加载器无法完成此加载任务时,才自己去加载。

jmm内存模型

https://zhuanlan.zhihu.com/p/29881777

对象头中有什么内容?

https://zhuanlan.zhihu.com/p/124278272

Java对象创建的过程

https://zhuanlan.zhihu.com/p/143743569

讲解一下CMS垃圾回收器的具体回收过程以及特点

java.class是在哪种类加载器里面

新生代survivor为什么要分两部分

老年代的回收算法有什么

cms介绍一下

full gc发生在什么时候

多线程如果多次调用start会怎么样

什么情况下会触发full gc

Java web框架

============================================================================

spring


AOP IOC 的原理

看过Spring的源代码吗(了解很少)

spring注解

https://blog.csdn.net/u010648555/article/details/76299467

@Component :标准一个普通的spring Bean类。 @Repository:标注一个DAO组件类。 @Service:标注一个业务逻辑组件类。 @Controller:标注一个控制器组件类。 这些都是注解在平时的开发过程中出镜率极高,@Component、@Repository、@Service、@Controller实质上属于同一类注解,用法相同,功能相同,区别在于标识组件的类型。 @Component可以代替@Repository、@Service、@Controller,因为这三个注解是被@Component标注的。如下代码

@Target({ElementType.TYPE})

@Retention(RetentionPolicy.RUNTIME)

@Documented

@Component

public @interface Controller {

String value() default “”;

}

spring 生命周期(不会),spring循环引用(不会),mybatis底层流程(没搞懂问题,不会)

拦截器和过滤器的区别?

②拦截器不依赖与servlet容器,过滤器依赖与servlet容器。

③拦截器只能对action请求起作用,而过滤器则可以对几乎所有的请求起作用。

④拦截器可以访问action上下文、值栈里的对象,而过滤器不能访问。

⑥拦截器可以获取IOC容器中的各个bean,而过滤器就不行,这点很重要,在拦截器里注入一个service,可以调用业务逻辑。

权限管理问了一个小问题,表示不会。

controller层,访问一个url的过程是怎样的

bean的生命周期、bean互相依赖怎么实现

说一下spring,把你了解的都说一下(说了自己的理解、spring的优点、注解、@autowired@resource区别、IOC、AOP等)

两种动态代理的区别

MVCC


https://juejin.cn/post/6871046354018238472

Spring中的三级反转

怎么通过注解注入的@Autowird,@Resource等

接口和抽象类的设计思路(面试官提到Spring中的约定大于配置)

Spring-bean的循环依赖以及解决方式

dispatcherservlet流程

mybatis


说一下Mybatis(说了优点、resultMap/resultType区别,#/$)

为什么要用Mybatis,最大的好处是什么

Tomcat


类加载以及双亲委派介绍一下,tomcat类加载器了解吗(不了解)

https://www.cnblogs.com/aspirant/p/8991830.html

不遵循双亲委派

数据库

=====================================================================

https://blog.csdn.net/qq_17623363/article/details/115014444

mysql读的时候加锁么(我说读锁,面试官说读的是快照,不加锁,我就又提到MVCC)

https://cloud.tencent.com/developer/article/1169873

B+树相对B树的优势?


联合索引的底层实现是?

主键索引、二级索引、联合索引的区别;

假设有联合索引(a,b,c),判断下面哪些用到联合索引

select * from A where a=x and b=x;

select * from A where a=x and c=x;

select * from A where b=x and c=x;

下面两个查找那个效率高?这题我直接不知道

select * from A where a=x and b=x order by c;

select * from A where a=x and c=x order by b;

使用explain解析sql,里面的using where 和using index分别是什么意思?

选择索引的时候,mysql如何决定使用哪一个索引?

linux里面死锁了,有什么方法可以解决?

什么是事务


数据库的隔离级别


怎样防止大事务,及处理办法


如何防止sql注入


mysql的存储引擎


mysql有哪些索引


聚集索引和非聚集索引的区别

https://blog.csdn.net/riemann_/article/details/90324846

说一说联合索引和覆盖索引

InnoDB和MyISAM的区别

mysql使用B+树索引而不使用B树或者hash索引

事务隔离级别,脏读和幻读如何解决的。

数据库隔离级别以及可能产生的问题

分别解释脏读,不可重复度,幻读(不可重复读和幻读的区别在哪里)

数据库中的聚合函数

innoDB底层索引和行锁、表锁的关系

B+树和B树的区别,为什么要使用B+树不用B树?

红黑树有了解吗,和平衡二叉树有什么区别

mysql的innodb引擎吗?相比于其他引擎有什么优缺点

索引的底层实现是怎么样的

为什么用B+树,其他的哈希数组或者其他树不能存储吗

MySQL的binlog undo redolog

为什么innodb是RR的级别

有一个很大的表,有客户id和订单号两列,需要分表 现在我主要的功能是要查看每个客户ID有什么订单,还有就是订单号属于哪个用户,我怎么分表合适

了解缓存嘛

联表查询sql语句

介绍一下数据库的聚簇索引和非聚簇索引的区别,它们底层的数据结构是什么?为什么不用B树?

介绍一下数据库的四种隔离机制以及他们能分别解决什么并发事务带来的问题?什么是幻读,什么是不可重复读?

数据库是如何解决幻读的?原理是什么?(这里要深入回答MVCC实现原理和间隙锁)

如果说缓存了一个热数据,突然过期失效了。请求全部打在了数据库上会导致服务器崩溃,这里有什么比较好的解决办法?(先说一下这种情况是缓存击穿,然后我的回答是设置热数据永不过期)

乐观锁和悲观锁

数据库的乐观锁怎么实现(具体一点)

mysql主从复制说一下,为什么这样做

long sql怎么优化,比如:分页查询速度很慢

用主键索引和唯一索引有什么区别

加很多间隙锁的问题

如果解决mysql中的死锁问题(面试官的意思是用队列控制,相当于公平锁)

计网

====================================================================

TCP


https://luo-shaoxiong.gitee.io/erxiong-demo/#/./docs/%E7%BD%91%E7%BB%9C

TCP协议是如何保证可靠的

https://blog.csdn.net/liuchenxia8/article/details/80428157

校验和

序列号

确认应答

超时重传

连接管理

流量控制

拥塞控制

time-wait作用?用哪个命令可以查看?

  • 可靠地实现了TCP全双工连接的终止

  • 为使旧的数据包在网络因过期而消失

负载均衡


负载均衡有哪些算法

https://zhuanlan.zhihu.com/p/151835622

hash 随机 轮询 权重轮询 权重交叉轮询

Nginx 默认的负载均衡策略就是一种改进的加权轮询策略

其他


cookie session区别 用户信息存在哪

https://blog.csdn.net/chen13333336677/article/details/100939030

讲一下https。为什么要采用混合加密的方式?相对于直接采用非对称加密效率是快了还是慢了

https://luo-shaoxiong.gitee.io/erxiong-demo/#/./docs/%E7%BD%91%E7%BB%9C

用户在浏览器发起HTTPS请求(如 https://www.mogu.com/),默认使用服务端的443端口进行连接;

HTTPS需要使用一套CA数字证书,证书内会附带一个公钥Pub,而与之对应的私钥Private保留在服务端不公开;

服务端收到请求,返回配置好的包含公钥Pub的证书给客户端;

客户端收到证书,校验合法性,主要包括是否在有效期内、证书的域名与请求的域名是否匹配,上一级证书是否有效(递归判断,直到判断到系统内置或浏览器配置好的根证书),如果不通过,则显示HTTPS警告信息,如果通过则继续;

客户端生成一个用于对称加密的随机Key,并用证书内的公钥Pub进行加密,发送给服务端;

服务端收到随机Key的密文,使用与公钥Pub配对的私钥Private进行解密,得到客户端真正想发送的随机Key;

服务端使用客户端发送过来的随机Key对要传输的HTTP数据进行对称加密,将密文返回客户端;

客户端使用随机Key对称解密密文,得到HTTP数据明文;

后续HTTPS请求使用之前交换好的随机Key进行对称加解密。

RSA

http状态码3xx是什么?302和303的区别是什么

常见的HTTP相应状态码:

200:请求被正常处理

204:请求被受理但没有资源可以返回

206:客户端只是请求资源的一部分,服务器只对请求的部分资源执行GET方法,相应报文中通过Content-Range指定范围的资源。

301:永久性重定向

302:临时重定向

303:与302状态码有相似功能,只是它希望客户端在请求一个URI的时候,能通过GET方法重定向到另一个URI上

304:发送附带条件的请求时,条件不满足时返回,与重定向无关

307:临时重定向,与302类似,只是强制要求使用POST方法

400:请求报文语法有误,服务器无法识别

401:请求需要认证

403:请求的对应资源禁止被访问

404:服务器无法找到对应资源

500:服务器内部错误

503:服务器正忙

HTTP协议了解吗?说一下请求头有哪些内容

HTTP Request Header 请求头

Accept:指定客户端能够接收的内容类型。

Accept-Charset:浏览器可以接受的字符编码集。

Accept-Encoding:指定浏览器可以支持的web服务器返回内容压缩编码类型。

Accept-Language:浏览器可接受的语言。

Accept-Ranges:可以请求网页实体的一个或者多个子范围字段。

AuthorizationHTTP:授权的授权证书。

Cache-Control:指定请求和响应遵循的缓存机制。

Connection:表示是否需要持久连接。(HTTP 1.1默认进行持久连接)

CookieHTTP:请求发送时,会把保存在该请求域名下的所有cookie值一起发送给web服务器。

Content-Length:请求的内容长度。

Content-Type:请求的与实体对应的MIME信息。

Date:请求发送的日期和时间。

Expect:请求的特定的服务器行为。

From:发出请求的用户的Email。

Host:指定请求的服务器的域名和端口号。

If-Match:只有请求内容与实体相匹配才有效。

If-Modified-Since:如果请求的部分在指定时间之后被修改则请求成功,未被修改则返回304代码。

If-None-Match:如果内容未改变返回304代码,参数为服务器先前发送的Etag,与服务器回应的Etag比较判断是否改变。

If-Range:如果实体未改变,服务器发送客户端丢失的部分,否则发送整个实体。

If-Unmodified-Since:只在实体在指定时间之后未被修改才请求成功。

Max-Forwards:限制信息通过代理和网关传送的时间。

Pragma:用来包含实现特定的指令。

Proxy-Authorization:连接到代理的授权证书。

Range:只请求实体的一部分,指定范围。

Referer:先前网页的地址,当前请求网页紧随其后,即来路。

TE:客户端愿意接受的传输编码,并通知服务器接受接受尾加头信息。

Upgrade:向服务器指定某种传输协议以便服务器进行转换(如果支持。

User-AgentUser-Agent:的内容包含发出请求的用户信息。

Via:通知中间网关或代理服务器地址,通信协议。

Warning:关于消息实体的警告信息

HTTP Responses Header 响应头

Accept-Ranges:表明服务器是否支持指定范围请求及哪种类型的分段请求。

Age:从原始服务器到代理缓存形成的估算时间(以秒计,非负)。

Allow:对某网络资源的有效的请求行为,不允许则返回405。

Cache-Control:告诉所有的缓存机制是否可以缓存及哪种类型。

Content-Encodingweb:服务器支持的返回内容压缩编码类型。。

Content-Language:响应体的语言。

Content-Length:响应体的长度。

Content-Location:请求资源可替代的备用的另一地址。

Content-MD5:返回资源的MD5校验值。

Content-Range:在整个返回体中本部分的字节位置。

Content-Type:返回内容的MIME类型。

Date:原始服务器消息发出的时间。

ETag:请求变量的实体标签的当前值。

Expires:响应过期的日期和时间。

Last-Modified:请求资源的最后修改时间。

Location:用来重定向接收方到非请求URL的位置来完成请求或标识新的资源。

Pragma:包括实现特定的指令,它可应用到响应链上的任何接收方。

Proxy-Authenticate:它指出认证方案和可应用到代理的该URL上的参数。

refresh:应用于重定向或一个新的资源被创造,在5秒之后重定向(由网景提出,被大部分浏览器支持)

Retry-After:如果实体暂时不可取,通知客户端在指定时间之后再次尝试。

Serverweb:服务器软件名称。

Set-Cookie:设置Http Cookie。

Trailer:指出头域在分块传输编码的尾部存在。

Transfer-Encoding:文件传输编码。

Vary:告诉下游代理是使用缓存响应还是从原始服务器请求。

Via:告知代理客户端响应是通过哪里发送的。

Warning:警告实体可能存在的问题。

WWW-Authenticate:表明客户端请求实体应该使用的授权方案。

一次TCP连接上能传多少个http请求?(实际上问的就是长连接短连接,分类讨论即可)

在 HTTP/1.1 中 Connection 默认是 keep-alive 故可以进行多个http请求(长连接)

https://blog.csdn.net/ywlmsm1224811/article/details/96436768

用UDP进行传输的话,假设要发送1000M的文件,但是接收限制是800M,能传成功吗?如果能成功,怎么传?如果不成功,说出不成功的理由。(这里我答的是不成功,回答的理由是UDP是没有拆包功能的,所以会直接传输失败。面试官点头说了个好的,我也不知道对不对)。

为什么要CA认证,这么做的意义是?

  • HTTPS需要使用一套CA数字证书,证书内会附带一个公钥Pub,而与之对应的私钥Private保留在服务端不公开;

  • 客户端收到证书,校验合法性,主要包括是否在有效期内、证书的域名与请求的域名是否匹配,上一级证书是否有效(递归判断,直到判断到系统内置或浏览器配置好的根证书),如果不通过,则显示HTTPS警告信息,如果通过则继续;

  • 借助CA机构和系统根证书的机制保证了HTTPS证书的公信力。

拥塞控制

输入url发生了什么

https://zhuanlan.zhihu.com/p/43369093

IP地址和MAC地址关系,为何需要两个地址

https://blog.csdn.net/zs18753479279/article/details/115611132

os

===

进程和线程的通信(管道,信号量等)

管道的区别

信号量底层是如何工作的(没答出来,估计特别扣分,因为楼主是典型的八股文选手,操作系统能问这么多是我没想到的)

内存溢出和内存泄漏

内存泄漏memory leak :是指程序在申请内存后,无法释放已申请的内存空间,一次内存泄漏似乎不会有大的影响,但内存泄漏堆积后的后果就是内存溢出。

内存溢出 out of memory :指程序申请内存时,没有足够的内存供申请者使用,或者说,给了你一块存储int类型数据的存储空间,但是你却存储long类型的数据,那么结果就是内存不够用,此时就会报错OOM,即所谓的内存溢出。

二者的关系

内存泄漏的堆积最终会导致内存溢出

内存溢出就是你要的内存空间超过了系统实际分配给你的空间,此时系统相当于没法满足你的需求,就会报内存溢出的错误。

内存泄漏是指你向系统申请分配内存进行使用(new),可是使用完了以后却不归还(delete),结果你申请到的那块内存你自己也不能再访问(也许你把它的地址给弄丢了),而系统也不能再次将它分配给需要的程序。就相当于你租了个带钥匙的柜子,你存完东西之后把柜子锁上之后,把钥匙丢了或者没有将钥匙还回去,那么结果就是这个柜子将无法供给任何人使用,也无法被垃圾回收器回收,因为找不到他的任何信息。

内存溢出:一个盘子用尽各种方法只能装4个果子,你装了5个,结果掉倒地上不能吃了。这就是溢出。比方说栈,栈满时再做进栈必定产生空间溢出,叫上溢,栈空时再做退栈也产生空间溢出,称为下溢。就是分配的内存不足以放下数据项序列,称为内存溢出。说白了就是我承受不了那么多,那我就报错。

讲一下死锁的条件;讲一下破坏死锁的条件;口头描述一个死锁例子

僵尸进程和孤儿进程

设计模式

======================================================================

说一说有哪些常用的设计模式

单例模式


(注意多线程中的实现)

策略模式


适合多个算法的程序设计:

https://www.runoob.com/design-pattern/strategy-pattern.html

分布式框架

=======================================================================

redis


redis的基本数据类型

为什么要使用redis

怎么样能确保缓存中数据和主存中数据的一致性

redis速度为什么这么快

redis内存模型?(回答的很浅)

Redis清理过期数据的机制是什么

项目当中我是如何保证缓存和数据库的一致性的?(延时双删策略)延时双删中为啥要延时?第二次删除为什么不在写完直接删除?如何应对缓存删除失败的情况?(这里我答了用中间件消息队列)

缓存穿透是什么

如何避免缓存穿透

布隆过滤器

怎么保证缓存和数据库的一致性

zookeeper

消息队列考点


为什么使用MQ?MQ的优点

消息中间件包括哪些?有什么区别?

消息队列有什么优缺点?

如何防止消息的重复消费

如何保证消息队列高可用

算法题

=====================================================================

反转链表

判断链表是否有环

两个有序数组间相加和的Topk问题(时间复杂度要求O(KlogK))

顺时针旋转n*n的矩阵—分治 删除链表倒数第n个节点

不用加法实现两数之和:其实是将加法的加和进位分成两步来做;

环形链表

跳台阶,可以跳1阶 2阶 3阶,如果跳到n阶有多少种方法

找出数组中是否有元素个数大于一半的元素 若有 请输出 没有就输出0哈希的空间复杂度高,用candidate的方法做,排序加判断中位数

算术平方根和翻转链表

无序数组找出重复数字,要求时间复杂度O(n),空间复杂度O(1)大概想了5分钟,虽然记得以前看到过这个方法,但是还是忘了想不出来了。。。(后来查了下是原地置换法去重)说实话没想到会考这个去重算法。

n!末尾0的个数。算是比较简单的,半分钟写完了之后面试官看了眼没问题之后开始问问题。

链表中固定区间反转

场景题

=====================================================================

怎么存储十万个QQ好友用什么数据结构,考虑到哪些问题?

当时想了5分钟后,说了下HashMap的实现思想,并用hashMap的数据结构去存储。将姓氏的第一个字母归类存储,用26个hash桶来存,每个桶大概存3800个用户,这样查找通过hash算法直接定位到一个桶,比遍历查找肯定快很多。然后后面用链表加红黑树的方式来实现。考虑的问题是查找好友时比较快,当用户多时查找是O(logn)级别(红黑树),然后增加删除元素稍微慢一点,因为涉及到红黑树自平衡的左旋和右旋操作。所以这种适合于查询好友大得业务,只能应对小数据增删。然后就结束了。当时说的挺乱的没有现在这么冷静,面完后觉得自己没有机会了,没想到隔了两天就来二面邮件了。

10个文件,每个文件1G,存储用户的query,找出查询重复top10的query,怎么设计?(不同文件中的query有重复)

64匹马,8条赛道,保证找出跑的最快的4匹,最少需要多少次?

其他

====================================================================
说一下自己的优缺点
反问,介绍了部门情况
工作中任务完不成了,你会怎么做?

  • 12
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值