背书大纲(面试用)
这个没有先后顺序,就是个背书大纲
数据库部分(持续更新)
什么是SQL
结构化查询语言SQL,是一种数据库查询语言的作用,用于存取数据,查询,更新和管理关系型数据库系统
数据库三大范式是
- 1NF :每个列不可以再分(原子性)
- 2NF :在1NF的基础上,非主键列完全依赖于主键(部分依赖)
- 3NF :在2NF的基础上,非主键列不依赖于其他非主键列(传递依赖)
什么是索引
索引是一种特殊的文件,索引是一种数据结构,数据库索引,是数据库管理系统中一个排序的数据结构。更通俗的说,索引就相当于目录,为了方便查找书中的内容,通过对内容建立索引形成目录
它是一个文件,要占据物理空间的。
索引按功能特性分为:主键索引,唯一索引,普通索引,全文索引
索引按索引列分类:单列索引,组合索引
什么是左前缀原则?什么是最左匹配原则
在创建多列索引时,要根据业务需求,where字句中使用最频繁的一列放在最左边
什么是数据库事务
事物是一个不可分割的数据库操作序列,也是数据库并发控制的基本单位,其执行的结果必须使数据库从一种一致性状态变为另一张的一致性状态。事务是逻辑上的一组操作,要么都执行要么都不执行
事务的四大特性
- 原子性:事务是最小的执行单位,不允许分割。事务的原子性确保动作要么全部完成,要么完全不起作用
- 一致性:执行事务前后,数据保持一致,多个事务对同一个数据读取的结果是相同的
- 隔离性:并发访问数据库时,一个用户的事物不被其他事务所干扰,各并发事物之间的数据库是独立的
- 持久性:一个事物被提交后,它对数据库中的数据的改变是持久的,即使数据库发生故障也不应该对其有任何影响。
事物的隔离级别(需要理解顺序)
读未提交级别最低,串行化级别最高
- 读未提交:允许读取未提交的数据,可能导致脏读、幻读或不可重复读
- 读已提交:允许读取已提交的数据,避免脏读,但幻读和不可重复读仍可能发生
- 可重复度:对同一字段的多次读取结果都是一致的,除非数据被本身事务修改
- 串行化:最高的隔离级别,强制事务排序,避免幻读、不可重复读和脏读,但性能开销较大
mysql中的锁分为三类
全局锁,表级锁,行级锁
若是从锁的类别上来分,又可以分为共享锁和排他锁(可以称为读锁和写锁)
什么是死锁
多个事务在同一资源上相互占用,并请求锁定对方的资源,导致恶性循环的现象。
为什么要用视图?什么是视图?
所谓视图,本质上是个一种虚拟表,在物理上是不存在的,其内容和真实的表相似,用于提高复杂查询的效率和安全性。
视图有哪些特点
视图的列可以来自不同的表,是表的抽象和逻辑意义上建立的新关系,是由基本表(实表)产生的表(虚表),并且视图的建立和删除不影响基本表
SQL语句主要分为哪几类
- DDL:数据定义语言,用来操作数据库对象(数据库,表,字段)
- DML:数据操作语言,用来对数据库中表的数据进行增删改
- DQL:数据查询语言,用来对数据库中表的数据进行查询操作
- DCL:数据控制语言,用来创建数据库用户,控制访问权限
超键,候选键,主键,外键分别是啥
- 超键:在关系中能够唯一标识元组的属性集称之为超键
- 候选键:小超键,没有冗余元素的超键
- 主键:数据库表中对储存数据对象予以唯一和完整标识的数据列或者属性的集合,一个数据列只可以有一个
- 外键:一个表中存在的另一张表的主键
六种关联查询
- 交叉连接查询(笛卡尔积)
- 内连接查询
- 隐式内链接
- 显示内连接
- 外连接查询
- 左外连接
- 右外连接
- 子查询
- 标量子查询
- 列子查询
- 行子查询
- 表子查询
- 并集查询
- 交集查询
什么是子查询
子查询是指一条SQL语句的查询结果是另一条SQL语句的查询条件或者查询结果
子查询的三种情况
- 单行单列
- 多行单列
- 多行多列
java部分
JVM,JRE,JDK的关系
- JVM:Java虚拟机,是Java程序运行的环境,它是Java实现跨平台的核心
- JRE:Java运行时环境,包含JVM和Java的核心类库
- JDK:Java开发工具包,包含JRE和开发人员使用的工具
java的数据类型有哪些
基本数据类型:
- 数值型
- 整数型(byte,short,int,long)
- 浮点型(float,double)
- 字符型(char)
- 布尔型(boolean)
引用数据类型:
- 类
- 接口
- 数组
访问修饰符
- public:公共的,任何类都可以访问
- private:私有的,只有当前类可以访问
- protected:保护的,只有当前类和子类可以访问
- 默认:没有修饰符,只有当前包可以访问
最高的访问修饰符是public,最低的访问修饰符是private
final有什么用
用于修饰类,属性,方法,被final修饰的类不能被继承,修饰的方法不能被重写,修饰的变量只能赋值一次
this关键字的用法
this是自身的一个对象,代表对象本身大致有以下几种用法
1.普通的直接引用,this相当于是指向当前对象本身
2.形参与成员名字重名,用this来区分
3.引用本类的构造函数
super关键字的用法
super是指向自己超(父)类对象的一个指针,而且指的是离自己最近的一个父类,大致有以下几种用法
1.普通的直接引用,super相当于是指向当前对象的父类
2.子类的构造函数调用父类的构造函数,super(参数)
3.子类重写父类的方法,用super来调用父类的方法
this和super的区别
this和super均需要放在构造方法第一行
1.super是指向父类对象的一个指针,this指向自身对象的一个指针
2.super调用父类的方法和属性,this调用自身的方法和属性
3.super调用父类的构造函数,this调用自身的构造函数
4.super在子类中使用,this在自身中使用
5.super调用父类的方法和属性时,不能调用父类的私有方法和属性,this可以调用自身的私有方法和属性
static关键字的用法
static的主要意义是在于创建独立于具体对象的域变量或者方法。以至于即使没有创建对象,也能使用属性和调用方法。
并且它还可以形成静态代码块以优化程序性能,这个static块可以置于类的任何地方,类中可以有多个static块,执行顺序是最上面的先执行,然后执行每一个static块,并且只会执行一次
static的独特之处
1.static修饰的属性和方法不需要创建对象就可以调用
2.static修饰的属性和方法可以被多个对象共享,避免了浪费内存空间
3.static修饰的属性和方法可以直接通过类名来调用,也可以通过对象名来调用
4.static修饰的属性和方法在类加载时就会被加载,而普通的属性和方法在对象创建时才会被加载,所以static修饰的属性和方法的加载顺序优先于普通的属性和方法
static注意事项
1.静态只能访问静态
2.非静态既可以访问静态,也可以访问非静态
3.静态方法中不能使用this和super关键字
break和continue和return的区别
break:跳出当前循环
continue:跳出本次循环,继续执行下次循环
return:程序返回,不再执行下面的代码
面向对象的和面向过程的区别
1.面向过程:强调的是功能行为,以函数为最小单位,考虑怎么做
2.面向对象:将功能封装进对象,强调具备了功能的对象,以类/对象为最小单位,考虑谁来做
优缺点:
- 面向过程:性能较高,因为类调用时需要实例化,开销比较大,比较消耗资源;比如单片机、嵌入式开发、Linux/Unix等一般采用面向过程开发,性能是最重要的因素。
- 面向对象:易维护、易复用、易扩展,由于面向对象有封装、继承、多态性的特性,可以设计出低耦合的系统,使系统更加灵活、更加易于维护。
面向对象的三大特性
封装,继承,多态
抽象:抽象是将一类对象的共同特征总结出来构造类的过程,包括数据抽象和行为抽象两方面,抽象只关注对象有哪些属性和行为,并不关注这些行为的细节是什么。
- 封装 :在面向对象程序设计模式中,封装是隐藏对象的属性和实现细节,仅对外公开接口,然后通过设置属性访问控制级别来控制属性的读写。
- 继承 :一个类可以继承另一个类的属性和方法。多个类存在相同的属性和方法时,可以从这些类中派生出一个新类,这个新类能吸收了它们的属性和方法。并能拓展新的能力。
- 子类可以继承父类的属性和方法。
- 子类可以拓展自己的属性和方法。
- 子类可以重写父类的方法。
- 多态 :多态(对象的多种状态)同一个行为具有不同的表现形态的能力,对象多种表现形态的能力
多态性:父类或接口定义的引用变量可以指向子类或具体实现类的实例对象。提高了程序的拓展性。
在java中有两种形式可以实现多态,继承(多个子类对同一个方法的重写)和接口(实现类对接口中方法的重写)。
要实现多态,必须具备以下三个条件:
1.继承或实现
2.方法重写
3.父类或接口的引用指向子类或具体实现类的实例对象(向上转型)
什么是多态机制
所谓多态机制就是指程序中定义的引用变量所指向的具体类型和通过该引用变量发出的方法调用在编程时并不确定,而是在程序运行期间才确定,即一个引用变量倒底会指向哪个类的实例对象,该引用变量发出的方法调用到底是哪个类中实现的方法,必须在由程序运行期间才能决定。
面向对象五大基本原则
1.单一职责原则
2.开放封闭原则
3.里氏替换原则
4.依赖倒置原则
5.接口隔离原则
抽象类和接口的对比
抽象类是用来捕捉子类的通用特性的,接口是抽象方法的集合。
从设计层面来说,抽象类是对类的抽象,是一种模板设计,接口是行为的抽象,是一种行为的规范。
相同点:
1.都不能被实例化
2.都可以包含抽象方法
3.都可以有默认实现的方法(java8中可以有静态方法和默认方法)
不同点:
声明:抽象类使用abstract关键字声明,接口使用interface关键字声明
实现:子类使用extends关键字来继承抽象类。如果子类不是抽象类的话,它需要提供抽象类中所有声明的方法的实现。子类使用关键字implements来实现接口。它需要提供接口中所有声明的方法的实现
构造:抽象类可以有构造函数,接口不能有构造函数
访问修饰符:抽象类中的方法可以是public,protected和默认的,接口中的方法默认是public。接口是公开的,不能使用private访问修饰符。
多继承:抽象类可以继承一个类,并且可以继承多个接口。接口只能继承一个接口,但是可以继承多个接口。
字段声明:抽象类可以有字段声明,接口不能有字段声明。
普通类和抽象类的区别
普通类不能包含抽象方法,抽象类可以包含抽象方法。
普通类可以实例化,抽象类不能实例化。
抽象类能被final修饰吗?
不能,因为final修饰的类不能被继承,而抽象类必须被子类继承,所以不能被final修饰。
内部类的分类
成员内部类,静态内部类,局部内部类,匿名内部类
重载和重写的区别
重载:在同一个类中,方法名相同,参数列表不同(参数类型、参数个数、参数顺序),与返回值类型和访问修饰符无关。
重写:在子类中,方法名、参数列表必须与父类相同,返回值类型小于等于父类,抛出的异常小于等于父类,访问修饰符大于等于父类。
—————————————-施工中———————————————