面经之背NM
2021-10-09 23:23:53 30 举报
AI智能生成
哈哈哈哈哈哈呀
作者其他创作
大纲/内容
面、跨、多线程、垃圾、网络
java语言的特点
运算符==与equals
toString、hashCode()
为什么重写 equals 方法必须重写 hashcode 方法
简述Object类的常用方法
成员变量、成员方法可以在没有 所属的类的实例变量 的情况下 被访问
修饰成员变量、成员方法、代码块、内部类
静态方法 不能 引用非静态资源
static
变量、方法、类
final
final、finally(异常处理)、finalize(垃圾回收)的区别?
用于从子类访问父类的变量和方法
super
关键字
自动装箱拆箱
静态代码块->代码块->构造函数->普通代码块
java代码的执行顺序
原对象 和 拷贝对象 是否指向同一地址
深拷贝和浅拷贝的区别?
面向对象易维护、易复用、易扩展
面向过程性能比面向对象高 单片机、嵌入式开发、Linux/Unix
面向对象和面向过程
客观事物抽象成类,隐藏属性和方法的细节,对外提供访问接口
封装
访问修饰符public、private、default、protected
语法层面
设计层面
接口和抽象类的区别
继承
Java语言是如何实现多态的?重写与重载
多态
面向对象的三大特性
构造方法
new、反射、clone、
四种
java 创建对象有哪几种方式?
节省空间(常量池共享)、安全、提高效率(线程同步)
为什么要把String设计为不变量?
获取任意一个类的所有属性和方法,你还可以调用这些方法和属性。
什么是反射?
优缺点
三种
简述Java中Class对象 获取Class对象的方法:
Java反射机制
附加在代码中的一些元信息,用于一些工具在编译、运行时进行解析和使用,起到说明、配置的功能
简述注解
Exception
Error
子主题
在以下 3 种特殊情况下,finally 块不会被执行:
try-catch-finally
Java异常的分类
实现Serializable接口
java对象<->字节序列
对于不想进行序列化的变量,使用 transient 关键字修饰。
序列化与反序列化及实现方式
Collections是一个包装类
Collection是一个集合接口
Collection和Collections
JAVA基础
LinkedHashSet
HashSet
TreeSet
比较 HashSet、LinkedHashSet 和 TreeSet 三者的异同
计算hashcode相同 再使用equals方法
HashSet 如何检查重复
Set
ArrayList
LinkedList
Arraylist 与 LinkedList 区别?
Vector线程安全
Arraylist 和 的区别?
计算出新的扩容数组的size后实例化,并将原有数组内容复制到新数组中去。**默认情况下,新的容量会是原容量的1.5倍**。
ArrayList 的扩容机制吧
List
LinkedHashMap
HashMap
HashTable
线程是否安全、效率、null值、底层数据结构
HashMap 和 Hashtable 的区别
HashSet 底层就是基于 HashMap 实现的
HashMap 和 HashSet 区别
TreeMap 主要多了对集合中的元素根据键排序的能力以及对集合内元素的搜索的能力。
HashMap 和 TreeMap 区别
HashMap 的put方法流程?
在容量超过负载因子所定义的容量之后,就会扩容调用resize
扩大为原来数组的两倍,并将原来的对象放入新的数组中。
HashMap 的扩容方式?
覆盖导致元素丢失 or 头插法 形成环链表 导致死循环
HashMap为什么线程不安全?
0.75是对空间和时间效率的一个平衡选择
HashMap默认加载因子是多少?为什么是 0.75
HashMap 的底层实现
ConcurrentHashMap 的 put 方法执行逻辑是什么
ConcurrentHashMap 线程安全的具体实现方式/底层具体实现
锁的粒度 前者每个数组元素 后者 整个哈希表
ConcurrentHashMap 和 Hashtable 的区别
Map
排序、反转、查找
第一种,实体类实现Comparable接口,并实现 compareTo(T t) 方法,称为内部比较器。
Collection框架中实现比较要怎么做?
Collections 工具类
JAVA集合
管道 消息队列 共享内存 信号量 信号 socket
进程通信的几种方式
join() 方法
管道通信
volatile 共享内存
join方法
等待通知机制
线程通信的几种方式
什么是线程和进程? 区别 及 联系
并发与并行的区别?
原因
内存泄漏、死锁、线程不安全
问题
为什么要使用多线程呢? 使用多线程可能带来什么问题?
6种
说说线程的生命周期和状态?
线程在执行过程中会有自己的运行条件和状态(也称上下文)
保存当前线程的上下文,留待线程下次占用 CPU 的时候恢复现场
什么是上下文切换?
多个线程同时被阻塞,它们中的一个或者全部都在等待某个资源被释放。由于线程被无限期地阻塞,因此程序不可能正常终止。
什么是线程死锁?如何避免死锁?
破坏死锁的产生的必要条件
预防
在资源分配时,借助于算法(比如银行家算法)对资源分配进行计算评估,使其进入安全状态。
避免
如何预防和避免线程死锁?
sleep() 方法没有释放锁,而 wait() 方法释放了锁
两者都可以暂停线程的执行
说说 sleep() 方法和 wait() 方法区别和共同点?
调用 start() 方法方可启动线程并使线程进入就绪状态,直接执行 run() 方法的话不会以多线程的方式执行。
为什么我们调用 start() 方法时会执行 run() 方法,为什么我们不能直接调用 run() 方法?
暂停当前正在执行的线程对象,让其它有相同优先级的线程执行
礼让线程,让当前正在执行的线程暂停,但不阻塞将线程从运行状态转为就绪状态
yield方法
继承了Thread类,所以不能再继承其他父类。
继承Thread类
run方法不可以抛出异常
不能返回值的。
(重写)的方法是run()。
实现Runnable
Call方法可以抛出异常
执行后可返回值
(重写)的方法是call()
实现Callable接口
创建线程的三种方式
解决的是多个线程之间访问资源的同步性
可以保证被它修饰的方法或者代码块在任意时刻只能有一个线程执行
进入同步代码前要获得 当前对象实例的锁
修饰实例方法
给当前类加锁,会作用于类的所有对象实例 ,进入同步代码前要获得 当前 class 的锁。
修饰静态方法
指定加锁对象,对给定对象/类加锁。
修饰代码块
三种使用方式
讲一下 synchronized 关键字的底层原理
synchronized 关键字
synchronized和ReentrantLock 的区别
锁
实现了有序性。
禁止指令进行重排序优化
volatile 关键字只能用于变量
volatile保证变量对所有线程的可见性
volatile 关键字
synchronized 关键字和 volatile 关键字的区别
实现每一个线程都有自己的专属(私有的)本地变量
Executors.newCachedThreadPool(); :可缓存线程池
ThreadLocal
主要是为了减少每次获取资源的消耗,提高对资源的利用率。
3 个最重要的参数:
Executors.newSingleThreadExecutor(); :单例线程池
Executors.newScheduledThreadPool(); :可定时线程池
Executors.newFixedThreadPool(); :可定长度线程池
可以通过 Executors 的静态⼯⼚⽅法创建线程池
new ThreadPoolExecutor
如何创建线程池
execute() vs submit()
shutdown() VS shutdownNow()
关闭线程池
直接在程序中抛出RejectedExecutionException异常
默认采用的是AbortPolicy拒绝策略
DiscardPolicy和DiscardOldestPolicy拒绝策略将任务丢弃也是可以的
如果任务不是特别重要
拒绝策略
线程池
一个操作是不可中断的,具有原子/原子操作特征的类
基本类型
数组类型
引用类型
对象的属性修改类型
JUC 包中的原子类是哪 4 类?
Atomic 原子类
一个用来构建锁和同步器的框架,使用 AQS 能简单且高效地构造出应用广泛的大量的同步器
AQS
JAVA并发
保存当前线程下一条指令要执行的地址
上下文切换:记录当前线程执行的位置
程序计数器
每一次函数调用都会有一个对应的栈帧被压入 Java 栈,每一个函数调用结束后,都会有一个栈帧被弹出。
由一个个栈帧组成
StackOverFlowError
OutOfMemoryError
Java 虚拟机栈会出现两种错误
java虚拟机栈
虚拟机栈为虚拟机执行 Java 方法 (也就是字节码)服务,而本地方法栈则为虚拟机使用到的 Native 方法服务。 在 HotSpot 虚拟机中和 Java 虚拟机栈合二为一
本地方法栈
内存中最大的一块、线程共享、存放对象实例、圾收集器管理的主要区域
Eden 空间(首先创建时分配)
From Survivor、To Survivor 空间(第一次垃圾回收后进入)
新生代
老年代
细分
堆
用于存储已被虚拟机加载的类信息、常量、静态变量、即时编译器编译后的代码等数据。
线程共享的内存区域
为什么要将永久代 (PermGen) 替换为元空间 (MetaSpace) 呢?
常量池表(用于存放编译期生成的各种字面量和符号引用)
方法区的一部分
运行时常量池
方法区
直接内存 (非运行时数据区的一部分)
内存区域
引用代表的类是否已被加载过,如果没有,那必须先执行相应的类加载过程
Step1:类加载检查
虚拟机将为新生对象分配内存
指针碰撞
空闲列表
分配方式
Step2:分配内存
虚拟机需要将分配到的内存空间都初始化为零值
Step3:初始化零值
类的元数据信息、对象的哈希码、对象的 GC 分代年龄等信息。 这些信息存放在对象头中
Step4:设置对象头
初始化成员变量,执行普通代码块和构造器
Step5:执行 init 方法
Java 对象的创建过程
使用句柄
直接指针
对象的访问定位的两种方式
对象优先在 eden 区分配
大对象直接进入老年代
长期存活的对象将进入老年代
动态对象年龄判定
主要进行 gc 的区域
空间分配担保
堆 内存中对象的分配策略
Minor Gc 回收新生代
Full GC 回收老年代 /回收堆和方法区。
Minor Gc 和 Full GC 有什么不同呢?
引用计数法
根搜索(可达性分析)算法(主流的虚拟机所采用)
判断算法
强软弱虚引用
如何判断对象已经死亡?可回收?
分为“标记”和“清除”阶段:首先标记出所有不需要回收的对象,在标记完成后统一回收掉所有没有被标记的对象。
标记清除
将内存分为大小相同的两块,每次使用其中的一块。 当这一块的内存使用完后,就将还存活的对象复制到另一块去, 然后再把使用的空间一次清理掉。这样就使每次的内存回收都是对内存区间的一半进行回收。
标记复制
让所有存活的对象向一端移动,然后直接清理掉端边界以外的内存。
标记整理
效率高
“标记-清除”或“标记-整理”
根据各个年代的特点选择合适的垃圾收集算法。
分代回收
垃圾回收算法
单线程收集器
进行垃圾收集工作的时候必须暂停其他所有的工作线程
新生代采用标记-复制算法,老年代采用标记-整理算法。
Serial(串行)
Serial 收集器的多线程版本
ParNew
关注点是吞吐量(高效率的利用 CPU)
Parallel Scavenge
Serial 收集器的老年代版本
Serial Old
Parallel Scavenge 收集器的老年代版本
Parallel Old
span style=\
仅标记出GC Roots能直接关联的对象
初始标记
从标记的直接关联的GC Roots对象(引用指向的对象)开始遍历对象,用户线程同时执行
并发标记
将没有被标记的对象(垃圾,待清除的对象)进行修正,看看有的对象是不是不需要被GC(比如finalize()复活了),也就是没标记的给标记上。
重新标记
并发的将垃圾GC。
并发清除
“标记-清除”算法
主要优点:并发收集、低停顿
CMS 收集器
可预测的停顿
空间整合
分代收集
并行与并发
特点
初始标记并发标记最终标记筛选回收
大致分为以下几个步骤:
“标记-整理”“标记-复制”
G1 收集器
常见的垃圾回收器有哪些?
垃圾回收
根据类的全限定名获取该类的二进制流,并将其转换为JVM内存方法区中的Class对象。
加载
验证.class文件字节码的合法性,对字节码格式进行校验。
验证
为类变量分配内存并设置类变量初始值
准备
虚拟机将常量池内的 符号引用 替换为 直接引用
解析
链接
执行静态代码块的语句并和对静态变量的赋值进行合并
执行初始化方法 <clinit> ()方法
初始化
即该类的 Class 对象被 GC。
卸载
类加载过程
所有的类都由类加载器加载,加载的作用就是将 .class文件加载到内存。
最顶层的加载类
BootstrapClassLoader(启动类加载器) :
ExtensionClassLoader(扩展类加载器)
AppClassLoader(应用程序类加载器)
自定义类加载器
首先,检查请求的类是否已经被加载过
如果父加载器不为空,递归访问父类加载器,
父加载器为空,说明是启动类加载器 BootstrapClassLoader
如果父类加载器无法完成加载请求,则自己加载
介绍
可以避免类重复加载,且保证核心API不会被覆盖篡改。可以通过重写loadClass()打破双亲委派(默认的loadClass会递归找父类加载)。
JVM 区分不同类的方式不仅仅根据类名,相同的类文件被不同的类加载器加载产生的是两个不同的类
双亲委派模型的好处
双亲委派模型
类加载器总结
JVM
保证一个类仅有一个实例,并提供一个访问它的全局访问点
概念
保证了不能通过构造函数来创建对象实例
私有构造函数
只能通过公有静态函数返回唯一的私有静态变量
公有静态函数
私有静态变量
实现条件
线程安全,浪费内存空间
实例在初始化时就已经创建好了。
饿汉式
效率高,节约资源,但线程不安全
用到时才去检测有没有实例,有则返回,没有则新建。
懒汉式
懒加载,效率高,线程安全
双重校验锁
静态内部类
枚举
实现类型
简书
单例模式
专门定义一个类用来负责创建其他类的实例 被创建的实例通常都具有共同的父类
把实例化的操作单独放到一个类中,这个类就成为简单工厂类,由⼀个⼯⼚对象来创建实例,客户端不需要关注创建逻辑,只需提供传⼊⼯⼚的参数
简单工厂模式
定义一个创建对象的工厂接口,将类的实际化工作 推迟到 具体子工厂类 当中。
工厂方法模式
指提供⼀个创建⼀系列相关或相互依赖对象的接⼝,⽆需指定它们的具体类
当产品种类过多时,可以定义一个工厂接口,通过多个工厂实现类 来处理不同的产品
抽象工厂模式
将一个复杂对象的构造与它的表示分离,使同样的构建过程可以创建不同的表示。
建造者模式
用一个已经创建的实例作为原型,通过复制该原型对象来创建一个和原型相同或相似的新对象。
原型模式
创建型模式
把一个类接口转换成另一个用户需要的接口,使得原本由于接口不兼容而不能一起工作的那些类能一起工作。
适配器模式
将抽象与实现分离,使它们可以独立变化。
(它是用组合关系代替继承关系来实现,从而降低了抽象和实现这两个可变维度的耦合度。)
桥接模式
将对象组合成树状的层次结构的模式,用来表示“部分-整体”的关系,使用户对单个对象和组合对象具有一致的访问性。
组合模式
在不改变现有对象结构的情况下,动态地给该对象增加一些职责(即增加其额外功能)的模式。
装饰器模式
通过为多个复杂的子系统提供一个一致的接口,而使这些子系统更加容易被访问的模式。
外观模式
运用共享技术来有效地支持大量细粒度对象的复用。
(通过共享已经存在的对象来大幅度减少需要创建的对象数量、避免大量相似类的开销)
享元模式
给某对象提供一个代理,以控制对该对象的访问。
(访问对象不适合或者不能直接引用目标对象,代理对象作为访问对象和目标对象之间的中介。)
静态代理
在程序运⾏时通过反射创建具体的代理类,代理类和被代理类的关系在运⾏前是不确定的
动态代理
适用场景
CGLIB代理
博客
代理模式
结构型模式
为了避免请求发送者与多个请求处理者耦合在一起,将所有请求的处理者通过前一对象记住其下一个对象的引用而连成一条链;当有请求发生时,可将请求沿着这条链传递,直到有对象处理它为止。
责任链模式
将一个请求封装为一个对象,使发出请求的责任和执行请求的责任分割开。
(两者之间通过命令对象进行沟通,这样方便将命令对象进行储存、传递、调用、增加与管理。)
命令模式
给分析对象定义一个语言,并定义该语言的文法表示,再设计一个解析器来解释语言中的句子。
解释器模式
提供一个对象来顺序访问聚合对象中的一系列数据,而不暴露聚合对象的内部表示。
迭代器模式
定义一个中介对象来封装一系列对象之间的交互,使原有对象之间的耦合松散,且可以独立地改变它们之间的交互。
中介者模式
在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态,以便以后当需要时能将该对象恢复到原先保存的状态。
备忘录模式
多个对象间存在一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并被自动更新。
观察者模式
对有状态的对象,把复杂的“判断逻辑”提取到不同的状态对象中,允许状态对象在其内部状态发生改变时改变其行为。
状态模式
该模式定义了一系列算法,并将每个算法封装起来,使它们可以相互替换,且算法的变化不会影响使用算法的客户。
(通过对算法进行封装,把使用算法的责任和算法的实现分割开来,并委派给不同的对象对这些算法进行管理。)
策略模式
定义一个操作中的算法骨架,而将算法的一些步骤延迟到子类中,使得子类可以不改变该算法结构的情况下重定义该算法的某些特定步骤。
模板模式
封装一些作用于某种数据结构中的各元素的操作,它可以在不改变这个数据结构的前提下,定义作用于这些元素的新操作。
访问者模式
行为型模式
设计模式|菜鸟教程
GOF23种设计模式
数据冗余、更新异常、插入异常、删除异常
数据重复浪费存储空间、数据不一致、应该插入的数据没有被插入、不该删除的数据被删除了
关系模式存在的问题
数据库中数据的物理独立性和逻辑独立性
细说数据库三范式
一些 SQL 语句的集合
存储过程?
drop、delete 与 truncate 区别?
WHERE在数据分组前进行过滤,HAVING在数据分组后进行过滤。
having和where区别?
exists 会遍历外表,将外查询表的每一行,代入内查询进行判断。
exists 用于对外表记录做筛选。
in 是先把后边的语句查出来放到临时表中,然后遍历临时表,将临时表的每一行,代入外查询去查找。
exist和in的区别?
实体完整性、参照完整性、用户自定义完整性
数据库完整性
数据库设计通常分为哪几步?
超键、候选键、主键、外键
MySQL 中的 varchar 和 char 有什么区别?
**MySQL建表的约束条件有哪些**?
并发控制的基本单位,逻辑上的一组操作,要么都执行,要么都不执行。
什么是事务?
redo log(重做日志) 保证事务的持久性
undo log(回滚日志) 来保证事务的原子性。
锁机制、MVCC 等手段来保证事务的隔离性
如何保证ACID or 实现原理
事务及其ACID特性
并发事务带来哪些问题?事务隔离级别有哪些?
表级锁
Record lock:记录锁,单个行记录上的锁
Gap lock:间隙锁,锁定一个范围,不包括记录本身
Next-key lock:record+gap 临键锁,锁定一个范围,包含记录本身
行级锁
锁机制
事务
MySQL 支持哪些存储引擎?MySQL中myisam与innodb的区别?
一种用于快速查询和检索数据的数据结构
什么是索引?
加快检索速度
创建索引和维护 空间资源消耗
索引有哪些优缺点?
核心 数据库索引 要求IO次数少 即树的高度越低越好
为什么索引结构默认使用B+Tree,而不是B-Tree或Hash,二叉树,红黑树?
MyISAM B+Tree叶节点的data域存放的是数据记录的地址
InnoDB
索引文件和数据文件是否分离
MyISAM和InnoDB实现B+Tree索引方式的区别
B 树的所有节点既存放键(key) 也存放 数据(data),而 B+树只有叶子节点存放 key 和 data,其他内节点只存放 key。
B 树的叶子节点都是独立的; B+树的叶子节点有一条引用链指向与它相邻的叶子节点。
B 树的检索的过程相当于对范围内的每个节点的关键字做二分查找,可能还没有到达叶子节点,检索就结束了。而 B+树的检索效率就很稳定了,任何查找都是从根节点到叶子节点的过程,叶子节点的顺序检索很明显。
B 树& B+树两者有何异同呢?
不支持顺序查找和范围查找
Hash索引
索引的底层数据结构
BTree索引(B-Tree或B+Tree索引)
full-index全文索引
R-Tree索引
从存储结构上来划分
普通索引
唯一索引
复合索引。
应用层次
索引结构和数据一起存放
索引结构和数据分开存放
聚集索引与非聚集索引的区别
数据的物理顺序与键值的逻辑
索引分类
一般在数据库中,会利用联合索引加快查询的速度,要想利用到联合索引,必须遵循最左匹配原则
指在联合索引中,如果你的 SQL 语句中用到了联合索引中的最左边的索引,那么这条 SQL 语句就可以利用这个联合索引去进行匹配
也就是说通过最左匹配原则你可以定义一个联合索引,但是使得多中查询条件都可以用到该索引。
值得注意的是,当遇到范围查询(>、<、between、like)就会停止匹配。
最左匹配原则
先通过普通索引定位到主键值
在通过聚集索引定位到行记录
通常情况下,需要扫码两遍索引树。
普通索引的查询过程
这就是所谓的回表查询,先定位主键值,再定位行记录,它的性能较扫一遍索引树更低。
回表查询
将被查询的字段,建立到联合索引里去
效率较高,无需回表
索引覆盖
索引
MVCC在MySQL InnoDB中的实现主要是为了提高数据库并发性能,用更好的方式去处理读-写冲突,做到即使有读写冲突时,也能做到不加锁,非阻塞并发读
MVCC是 MySQL 的 InnoDB 存储引擎实现隔离级别的一种具体方式,用于实现提交读和可重复读这两种隔离级别。
创建版本号< 当前事务版本号<删除版本号 (保证事务能够查询)
SELECT
将 当前系统版本号 作为数据行快照的创建版本号
INSERT
将 当前系统版本号 作为数据行快照的删除版本号
DELETE
将当前系统版本号作为更新前的数据行快照的删除版本号
可以理解为先执行 DELETE 后执行 INSERT。
并将当前系统版本号作为更新后的数据行快照的创建版本号
UPDATE
每次对该记录进行修改的事务id
trx_id
存储上一个版本的地址
回滚指针
roll_pointer
两个隐藏列
用一个列表来存储我们系统中当前活跃着的读写事务,也就是begin了还未提交的事务。通过 这个列表 来判断记录的某个版本 是否对当前事务可见。
ReadView
例子
MVCC机制的实现就是通过read-view机制与undo版本链比对机制,使得不同的事务会根据数据版本链对比规则读取同一条数据在版本链上的不同版本数据。
形成版本链-undo日志
实现
多版本并发控制
MVCC
MySQL 执行查询的过程
使用!= 或者 <>
类型不一致导致的索引失效
函数导致的索引失效
运算符导致的索引失效
OR引起的索引失效
SELECT * FROM `user` WHERE `name` LIKE '%冰';
当`%`放在匹配字段前是不走索引的,放在后面才会走索引。
like
模糊搜索导致的索引失效
NOT IN、NOT EXISTS导致索引失效
索引失效
一般需要创建多列索引,可以加快查询速率
优选把区分度高的放在前面
多列索引的顺序如何选择?
都可能导致无法使用索引。
避免使用范围查询
优化查询
索引优化
使得数据可以从一个数据库服务器复制到其他服务器上,
在复制数据时,一个服务器充当主服务器(master),其余的服务器充当从服务器(slave)。
读写分离,使数据库能支撑更大的并发。
在主服务器上生成实时数据,而在从服务器上分析这些数据,从而提高主服务器的性能。
数据备份,保证数据的安全。
为什么要做主从同步?
什么是MySQL主从同步?
当单表的数据量达到1000W或100G以后,优化索引、添加从库等可能对数据库性能提升效果不明显
此时就要考虑对其进行切分了。切分的目的就在于减少数据库的负担,缩短查询的时间。
根据业务(字段列)进行划分,按列拆分成多个数据库或者多个子表
例如购物场景,可以将库中涉及商品、订单、用户的表分别划分出成一个库
分库
例如商品基本信息和商品描述,商品基本信息一般会展示在商品列表,商品描述在商品详情页,可以将商品基本信息和商品描述拆分成两张表。
分表
垂直划分
横向拆分数据,但拆分后的数据库结构相同,从而提查询升性能。
单库(表)的数据量得以减少,提高性能;
切分出的表结构相同,程序改动较少。
优点
分片事务一致性难以解决
跨节点join性能差,逻辑复杂
数据分片在扩容时需要迁移
缺点
水平划分
分库分表
数据库
MYsql优化
数据库MYSQL
链接、可靠性、传输速度、有序性、一对一(多)
HTTP FTP SMTP TELNET
TCP可靠
DNS、SNMP
UDP实时
对应的应用场景是什么?
TCP和UDP的区别
什么是 SYN洪泛攻击?如何防范?
三次握手连接阶段,最后一次ACK包丢失,会发生什么?
为什么客户端的 TIME-WAIT 状态必须等待 2MSL ?
三次握手和四次挥手的过程?为什么?
检验和、序列号/确认应答、超时重传、滑动窗口、拥塞控制和 流量控制等方法实现了可靠性传输
如何保证可靠性?
TCP/IP
常见的状态码
作用、参数位置、长度、安全
本质区别 幂等性
GET请求和POST请求的区别
HTTPS 的优缺点?
讲一讲HTTPS 的原理?
端口、安全性、资源消耗
HTTP 与 HTTPS 的区别?
在浏览器中输入www.baidu.com后执行的全部过程?
位置、有效时间、存储大小、安全
Cookie 和 Session 是如何配合的呢?
什么是 Cookie 和 Session ? 区别?
分布式拒绝服务攻击
DDOS
引入**带有<script>标签的代码**,导致恶意代码的执行
跨站脚本
XSS
恶意拼接
是在用户输入的字符串中加入 SQL 语句
SQL注入
DDos攻击、XSS攻击、SQL注入
身份证号
URI(Uniform Resource Identifier) 是统一资源标志符,可以唯一标识一个资源
家庭住址
URL(Uniform Resource Locator) 是统一资源定位符,可以提供该资源的路径
URI 和 URL 的区别是什么?
HTML
HTTP请求
TCP连接
IP
域名解析
DNS的寻址过程
常见的对称加密算法与非对称加密算法
对称加密与非对称加密
HTTP
计算机网络
进程和线程的区别
5 种
进程有哪几种状态?
进程间的通信方式
信号量
互斥量
临界区
进程间的同步方式
什么是临界区,如何解决冲突?
临界区 互斥量 信号量 事件
线程间的同步的方式
对长作业有利,对短作业不利
非剥夺算法
每次从就绪队列中选择最先进入该队列的进程
先到先服务(FCFS)
导致长作业饥饿
短作业优先(SJF)的调度算法
时间片过大退化为FCFS 过小导致处理机频繁的切换
时间片内 按FCFS
适用于分时系统
时间片轮转调度算法 :
时间片轮转+优先级调度
多级反馈队列调度算法 :
优先级调度 :
相应比 = (等待时间+要求运行时间)/要求运行时间
高响应比优先调度算法
进程的调度算法 ★★★
死锁是指两个或两个以上的进程在执行过程中,由于竞争资源或者由于彼此通信而造成的一种阻塞的现象,若无外力作用,它们都将无法推进下去。此时称系统处于死锁状态或系统产生了死锁,这些永远在互相等待的进程称为死锁进程
什么是死锁
互斥
请求和保持
不可剥夺
环路等待
死锁的四个条件性★
主要负责内存的分配与回收
单一连续分配
内部碎片
分区大小相等
分区大小不等
固定分区分配
外部碎片
动态分区分配
连续分配管理方式
页式管理
段式管理
段页式管理机制
非连续分配管理方式
常见的几种内存管理机制
快表和多级页表
分页机制和分段机制的共同点和区别
逻辑(虚拟)地址和物理地址
时间局部性
空间局部性
局部性原理
请求分页
请求分段
请求段页
虚拟内存的技术实现
OPT 页面置换算法(最佳页面置换算法)
基于队列
可能出现Beldy异常
FIFO(First In First Out) 页面置换算法(先进先出页面置换算法)
基于堆栈
LRU (Least Recently Used)页面置换算法(最近最久未使用页面置换算法)
Clock LFU (Least Frequently Used)页面置换算法(最少使用页面置换算法)
页面置换算法★★★
什么是虚拟内存(Virtual Memory)?
内存管理介绍
先来先服务FCFS
选择 与当前所在磁道距离最近的磁道
可能会导致饥饿现象
最少寻找时间优先 SSTF
磁头 当前移动方向上 选择与当前磁头所在磁道距离最近的请求作为下一次服务的对象
规定了磁头运动的方向
扫描算法 scan
在SCAN的基础上,规定了磁头的单向运动,当磁头到达一端时,会快速移动至起始段而不服务任何请求
循环扫描 C-SCAN
磁盘调度算法★★★
文件管理
操作系统
cd ls ll mkdir rmdir touch
cp mv rm tar
打包
-cvf
解打包
-xvf
打包并压缩
-zcvf
tar
文件操作
文件目录
-n :打印出行号
cat
和 cat 不同的是它可以一页一页查看文件内容,比较适合大文件的查看
more
和 more 类似,但是多了一个向前翻页的功能。
less
取得文件前几行。
head
只是取得是后几行。
tail
查看文件内容
可以使用文件的属性和权限进行搜索。
find / -name file1 从 '/' 开始进入根文件系统搜索文件和目录
find / -user user1 搜索属于用户 'user1' 的文件和目录
find
文件搜索
按esc
命令行
i
插入
底行
三种模式
打开文件:vi file
修改文件:输入i进入插入模式
保存并退出:esc ->:wq
Vim
文件编辑
chmod a+w jyf.txt
chmod 777 jyf.txt
chmod [ugoa] [+-=] [rwx] dirname/filename
chmod
chown root jyf.txt
改变文件的所有者
chown
文件的权限
使用正则表示式进行全局查找并打印。
查找文件里符合条件的字符串。
grep [-acinv] [--color=auto] 搜寻字符串 filename
grep
awk
正则表达式
ps -l
查看自己的进程
ps aux
查看系统所有进程
ps -ef
表示查看全格式的全部进程。
ps aux | grep java
ps -ef| grep java
查看特定的进程
ps
pstree -A
pstree
查看进程树
两秒钟刷新一次
top -d 2
实时显示系统中各个进程的资源占用状况
top
查看占用端口的进程
netstat -nap | grep port
查看特定端口的进程
lsof -i | grep pid
netstat
查看进程
kill -9 pid
killall -9 程序的名字
pkill 程序的名字
杀死进程
进程相关
Linux
一款Java的轻量级开发框架,能够降低企业级应用开发的复杂程度,同时能够提高开发人员的开发效率
将原本创建对象的工作,交由 Spring 框架来管理。
构造方法注入
setter ⽅法注⼊
接⼝注⼊
@Autowired
@Qualifier
@Resource
@Value
相关注解
依赖注入(Dependency Injection,简称 DI)。
实现方式
Spring IOC
将代码中重复的部分抽取出来,在需要执行的时候使用动态代理的技术,在不修改源码的基础上对方法进行增强。
优点是可以减少代码的冗余,提高开发效率,维护方便。
Spring AOP
什么是 Spring 框架?
代指的就是那些被 IoC 容器所管理的对象。
什么是 bean?
所需的依赖项和服务在 XML 格式的配置文件中指定
XML
需要在使用它之前在 Spring 配置文件中启用它
注解
创建 Bean 的方式?
singleton : 唯一 bean 实例,Spring 中的 bean 默认都是单例的,对单例设计模式的应用。
prototype : 每次请求都会创建一个新的 bean 实例。
其他
bean 的作用域有哪些?
注解作用于类,而@Bean注解作用于方法。
@Component
对应持久层即 Dao 层,主要用于数据库相关操作
@Repository
对应服务层,主要涉及一些复杂的逻辑,需要用到 Dao 层。
@Service
对应 Spring MVC 控制层,主要用于接受用户请求并调用 Service 层返回数据给前端页面。
@Controller
将一个类声明为 bean 的注解有哪些?
通用的注解,可标注任意类为 Spring 组件。
@Component
@Component 和 @Bean 的区别是什么?
bean 的生命周期?
是一个 Bean 工厂,实现了工厂模式,是 Spring IoC 容器最顶级的接口,可以理解为含有 Bean 集合的工厂类
BeanFactory 实例化后并不会自动实例化 Bean,只有当 Bean 被使用时才会对其进行实例化与依赖关系的装配,属于延迟加载,适合多例模式。
BeanFactory
是一个工厂 Bean,作用是生产其他 Bean 实例
FactoryBean
提供了支持国际化的文本消息
统一的资源文件读取方式
事件传播以及应用层的特别配置等
容器会在初始化时对配置的 Bean 进行预实例化,Bean 的依赖注入在容器初始化时就已经完成属于立即加载,适合单例模式,一般推荐使用 ApplicationContext。
是 BeanFactory 的子接口,扩展了 BeanFactory 的功能
ApplicationConext
BeanFactory、FactoryBean 和ApplicationContext 的区别?
单例 bean 的线程安全问题了解吗?
Spring bean
核心思想 是通过将业务逻辑、数据、显示分离来组织代码。
SpringMVC 中的前端控制器,是整个流程控制的核心,负责接收请求并转发给对应的处理组件。
DispatcherServlet
完成URL 到 Controller映射的组件
HandlerMapping
处理器,完成具体业务逻辑,相当于 Servlet 或 Action
Handler
处理器拦截器,是一个接口,如果需要完成一些拦截处理,可以实现该接口。
HandlerInterceptor
处理器执行链,包括两部分内容:Handler 和 HandlerInterceptor。
HandlerExecutionChain
处理器适配器,Handler执⾏业务⽅法前需要进⾏⼀系列操作,包括表单数据验证、数据类型转换、将表单数据封装到JavaBean等
HandlerAdapter
装载了模型数据和视图信息,作为 Handler 的处理结果返回给 DispatcherServlet。
ModelAndView
视图解析器,DispatcherServlet 通过它将逻辑视图解析为物理视图,最终将渲染的结果响应给客户端。
ViewResolver
概述 组件
在类定义处添加,将类交给IoC容器管理。
@Controller :
将URL请求和业务方法映射起来
@RequtestMapping
如果 Controller 方法的形参和 URL 参数名一致可以不添加注解,如果不一致可以使用该注解绑定
@RequestParam
将controller的方法返回的java对象转换为json格式并返回
@responseBody
MVC 常用注解?
Web 容器启动时会通知 Spring 初始化容器,加载 Bean 的定义信息并初始化所有单例 Bean,建立URL 和对应的 Controller 的映射,并保存到⼀个 Map 集合中。
DispatcherServlet 前端处理器处理收到Http请求,DispatcherServlet 会请求 HandlerMapping找到对应的 Handler 和 HandlerInterceptor 并以⼀个 HandlerExcutionChain 处理器执⾏链的形式返回。
DispatcherServlet 使⽤ Handler 找到对应的 HandlerApapter,通过 HandlerApapter 调⽤Handler 的⽅法,将请求参数绑定到⽅法的形参上,执⾏⽅法处理请求并得到 ModelAndView。
最后 DispatcherServlet 根据使⽤ ViewResolver 试图解析器对得到的 ModelAndView 逻辑视图进⾏解析得到 View 物理视图,然后对视图渲染,将数据填充到视图中并返回给客户端。
SpringMVC 工作原理了解吗?
SpringMVC
工厂设计模式 : Spring 使用工厂模式通过 BeanFactory、ApplicationContext 创建 bean 对象。
代理设计模式 : Spring AOP 功能的实现。
单例设计模式 : Spring 中的 Bean 默认都是单例的。
Spring 框架中用到了哪些设计模式?
编程式事务
在 XML 配置文件中配置或者直接基于注解(推荐使用) : 实际是通过 AOP 实现(基于@Transactional 的全注解方式使用最多)
声明式事务
Spring 事务
Spring
Mybatis
SSM
面经之背NM
0 条评论
回复 删除
下一页