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