数据库JDBC
1.数据库的三范式
- 第一范式-对列原子性,字段不能再拆分
- 第二范式-非主键依赖主键
- 第三范式-非主键直接依赖主键,不存在传递依赖,避免数据冗余
2.Mysql常用引擎
- InnoDB 5.1版本后,提供数据库事务支持,行级锁和外键约束,并发度高使用
- MyIASM 不提供事务支持,不支持行级锁和外键,读操作远多于写操作时使用
3.获取数据库版本
- select version()
4.ACID
- A(原子性) 一个事物的操作要么全部完成,要么全部不完成
- C(一致性) 事务开始前和结束后,数据库完整性不会被破坏
- I(隔离性) 允许多个并发事务同时进行读写修改能力
- D(持久性) 事务结束后的修改是永久的
5.char与varchar
- char 固定长度 varchar 可变长度
6.float与double
- float存储8位十进制数,内存占4字节
- double存储16位十进制数,内存占8字节
7.内连接,左连接,右连接
- 内连接 inner join 把匹配的关联数据显示出来
- 左连接 left join 把左表全部展示
- 右连接 right join 把右表全部展示
8.数据库的索引,实现方式,验证方式
- 普通索引 唯一索引 主键索引 联合索引
- 实现方式-B树
- 验证方式-explain语句
9.数据库事务隔离
- 读未提交
- 读已提交
- 可重复读
- 可串行化
- 脏读
- 不可重复读
- 幻读
10.行锁表锁 乐观锁悲观锁
- 表级锁 不会出现死锁 并发度最低
- 行级锁 会出现死锁并发度最高
- 乐观锁 每次用不上锁,更新提交后判断别人是否更新
- 悲观锁 每次用上锁,别人用不了直到锁释放
11.JDBC使用步骤
- 加载驱动
- 创建连接
- 创建命令
- 处理结果
12.Statement和PreparedStatement区别
- 预编译
- 支持?操作
- 防止SQL注入
13.SQL注入
- Web安全漏洞
- 交互时数据传入被拼接到SQL语句
- 相关参数未经过滤
14.MYSQL问题排查
- show processlist 查看所有连接信息
- explain 查询SQl语句执行计划
- 慢查询日志 查看慢查询
15.MYSQL性能优化
- 创建索引
- 不使用select *
- 垂直分割分表
- 存储引擎
JavaWeb
1.HTTP协议
- 超文本传输,规定浏览器-服务器之间的数据传输规则
- 基于TCP
- 基于请求
- 无状态协议
2.Http和Https的区别
- HTTP 不安全
- HTTPS 安全 对称加密 非对称加密
3.请求与响应
- 请求行,头,体
- 响应行,头,体
4.Get和Post区别
- 请求参数
- URL长度
- 安全性
5.Servlet执行流程,生命周期
- 初始化
- 提供服务
- 销毁
6.请求转发与重定向区别
- 请求转发 服务器跳转 产生一次请求 URL地址栏不可见 可共享请求对象
- 重定向 浏览器跳转 产生两次请求 URL地址栏可见 不可共享Request对象,需选择Session
7.四大作用域
- page jsp
- request 当前请求
- session 一次会话
- application web加载
8.Cookie和Session
- Cookie 为会话存储的键值信息 不可跨域名 有效期限制 不安全 不超过4K
- Session 服务器端基于内存的缓存技术 保存每个用户的会话数据 通过ID区分用户 也有失效时间
- 服务器设置Cookie -> 浏览器接收并保存,下次请求携带Cookie -> sessionID被服务器设置进cookie 以后浏览器请求携带id,服务器进行检索对应session
9.Servlet和Jsp区别
- Servlet 服务器端小应用程序
- Jsp 服务器端页面技术
- 联系 都是服务器处理动态资源技术(Tomcat) 接收HTTP请求,返回HTTP应答 JSP实现转化Servlet
- 区别 Servlet强调类,控制转发 JSP强调页面,显示页面 JSP是Servlet简化
10.JSP九大内置对象
- request 请求对象
- response 响应对象
- session 用户会话
- application 应用全局对象
- out 输出对象
- page 当前页面对象
- pageContext 页面上下文对象
- config 应用配置对象
- exception 应用异常对象
11.Servlet和Filter的区别?
- Servlet 服务器小应用程序 继承HttpServlet 处理业务 后执行
- Filter 过滤器 实现Filter接口 辅助过滤 先执行
12.MVC
-
分层开发模式
-
M Model 业务模型,处理业务
-
V View 视图 ,界面展示
-
C Controller 控制器,处理请求和视图
-
控制器(serlvlet)用来接收浏览器发送过来的请求,控制器调用模型(JavaBean)来获取数据,比如从数据库查询数据;控制器获取到数据后再交由视图(JSP)进行数据展示。
-
优点 职责单一互不影响,各司其职 利于分工协作 利于组件重用
13.三层架构
- 表现层 接受请求,封装数据,调用业务逻辑层,响应数据
- 业务逻辑层 对业务逻辑封装,组合数据访问层中基本功能
- 数据访问层 对数据库的基本操作
14.Tomcat优化
- 去除web.xml监视
- 将JSP提前编译成Servlet
- 加大Tomcat的JVM使用内存
- 解决JRE内存泄漏
- 线程池
- 缓存压缩
- 采用集群
Java基础
1.面向对象
- 面向对象:注重参与者,各自需要做的事,易于复用、扩展和维护
- 面向过程:注重步骤及顺序,更加高效直接
2.三大特征
- 封装 明确标识允许外部使用的所有成员函数和数据项
- 继承 继承基类方法,并作出自己的改变和扩展
- 多态 基于对象所属类的不同,外部对同一方法的调用
3.JDK JRE JVM
- JDK java 开发工具
- JRE java 运行环境
- JVM java 虚拟机
4.==与equals
- ==对比栈中值,基本数据类型是变量值,引用类型比较地址
- equals:object默认采用==比较,重写后比较内容
5.hashCode和equals
- hashCode获取哈希码(散列表),返回一个int整数,确定对象在哈希表中索引位置
- 散列表存储的是键值对,特点:依据键快速检索对应的值
- 如果equals比较两个对象相等,那么调用hashCode一定会生成相同整数 必须同时被覆盖
6.final
- 最终的 修饰类:类不可被继承 修饰方法:方法不可被子类覆盖,可以重载 修饰变量:变量一旦赋值就不可改变
- 类变量-只能在静态初始化块中指定初始值或声明该类时指定 成员变量-可以在非静态初始化块,声明该变量或者构造器中执行初始值
- 局部变量-可以定义时指定默认值(后续不能赋值),也可以不指定默认值,在后面对final赋值(仅一次)
- 基本数据类型变量-初始化后不可更改 引用类型-初始化后不能指向另一对象,但值可变
7.string stringbuffer stringbuilder
- string final修饰 不可变 每次操作生成一个新的string对象 性能差
- stringbuffer 操作原对象 线程安全 都是synchronized修饰 性能好
- stringbuilder 操作原对象 线程不安全 性能最好
8.重写和重载
- 重载 同一个类中 方法名必须相同 参数类型,个数,顺序不同 方法返回值和访问修饰符在编译时可以不同
- 重写 发生在父子类中 方法名,参数列表必须相同 返回值,抛出异常的范围小于父类 访问修饰符范围大于父类 若父类修饰符private不能重写
9.抽象类 接口
- 抽象类 可以定义构造器 可以有抽象方法和具体方法 成员类型不限 可以定义成员变量 包含静态方法 若含有抽象方法则必须声明抽象类 有抽象类的未必是抽象方法 一个类只能继承一个抽象类
- 接口 不能定义构造器 方法都是抽象方法 成员全是public 成员变量实际都是常量 不能有静态方法 一个类可以实现多个接口
10.List Set
- List 有序 可重复 允许多个Null对象
- Set 无序 不可重复 最多只允许一个Null对象
11.ArrayList LinkedList
- ArrayList 基于动态数组 连续内存存储 适用大量数据读取
- LinkedList 基于链表 遍历基于指针 适用于频繁的新增和插入
12.HashMap HashTable
- HashMap没有synchronized修饰,线程非安全 允许key和value为null
- HashTable 线程安全 不允许key和value为空
13.HashMap 原理
- 1.5 引入ConcurrentHashMap
- 1.6 对synchronized锁进行优化,锁升级
- 1.7 数据结构-数组+链表
- 1.8 新增红黑树
14.字节码
- 虚拟机理解的代码(.class文件)只面向虚拟机
- 优点 程序运行更加高效,可在多种不同计算机运行
15.异常体系
- 顶级父类 Throwable
- 子类 Exception 异常 RunTimeException 运行期异常-导致执行失败 CheckedException 编译器异常-导致程序不通过
- 子类 Error 错误 程序无法处理
16.Throw Throws finally
- Throw 作为方法中的内容 执行一定抛出某种异常
- Throws 在方法外声明 表示出现异常的可能
- finally 无论是否抛出异常都执行
17.IO流
- 字节流 - InputStream : OutputStream
- 字符流 - Reader : Writer
- 缓冲流 - BufferedInputStream BufferedReader : BufferedOutputStream BufferedWriter
- 数据流 - DataInputStream : DataOutputStream
- 对象流 - ObjectInputStream : ObjectOutputStream
18.线程创建
- 继承Thread类
- 实现Runnable接口
- 实现Callable接口
- 基于线程池
19.线程的生命周期
- New 新建 创建新线程
- Runnable 就绪 位于可运行线程池中,等待获取CPU
- Running 运行 获取CPU 执行程序代码
- Blocked 阻塞 因某种原因放弃CPU使用权,暂停运行
- Waiting 等待 等待其他线程执行某一特定动作
- Dead 死亡 执行完毕或因异常退出
20.进程与线程
- 进程让操作系统的并发性成为可能 线程让进程内部并发成为可能
- 一个进程包括多个线程,共占进程占有的内存地址空间和资源
- 进程是操作系统资源分配的基本单位 线程是操作系统调度的基本单位
21.start run
- start() 执行thread线程 创建新的子线程并使用 真正实现多线程
- run() 执行main线程 方法的普通调用
22.锁池 等待池
- 锁池 竞争同步锁的线程都会放进锁池
- 等待池 调用wait方法后,线程进入等待池,不会竞争同步锁,只通过notify()或notifyAll()才会释放进入锁池去竞争锁
23.sleep wait
- sleep是Thread类静态本地方法 wait是Object类的本地方法
- sleep不会释放lock wait会释放,并加入等待队列
- sleep不依赖同步器synchronized wait需要依赖synchronized关键字
- sleep不需要被唤醒 wait需要
- sleep一般用于线程休眠,轮循暂停 wait用于线程通信
- sleep会让出CPU执行时间强制上下文切换 wait不一定
24.yield join
- yield 让步 执行后线程直接进入就绪状态 释放CPU执行权,但依然保留执行资格
- join 执行后线程进入阻塞状态 直至调用的线程结束
25.线程安全
- 当多个线程访问一个对象时,如果不用进行额外同步控制或其他协调操作,调用这个对象的行为都可以获得正确结果,就是线程安全的
- 堆 共有的空间 所有线程都能访问该区域 造成问题的潜在原因
- 栈 独有的 在线程开始时初始化 相对独立 线程安全
26.Thread Runable
- Thread和Runable存在继承关系
- Thread适用于复杂的线程操作需求
- Runable适用简单执行一个任务
27.守护线程
- 后台线程 为所有非守护线程提供服务的线程
- 程序结束时必须正常且立刻关闭
- 必须在线程启动前设置
- 垃圾回收线程
28.ThreadLocal
- 每一个Thread都含有ThreadLocalMap类型的成员变量threadlocals,用来存储线程中所有的ThreadLocal对象及其对应值
- 用于 对象跨层传递 线程间的数据隔离了 事务操作存储线程事务信息 数据库连接 Session会话管理
- 正确使用方法 每次使用后调用remove()清除数据 将ThreadLocal定义为private static
29.并发 并行 串行
- 串行 时间上不重叠 前一任务没结束 下个任务只能等待
- 并行 时间上重叠 两个任务同一时刻互不干扰进行
- 并发 两个任务比此干扰 同一时间点只有一个任务运行 交替运行
30.并发三大特性
- 原子性 一个操作必须全部执行完毕,否则都不执行
- 可见性 多线程访问同一变量时 一个线程修改 其他线程都能看到修改的值
- 有序性 虚拟机编译代码时可能会对改变顺序但不影响最终结果的代码进行重排序
31.线程池
- 避免线程频繁创建和销毁带来的性能消耗建立的一种池化技术
- 优点 降低资源消耗,提高利用率 提高响应速度 提高可管理性 限制最大并发
32.线程池拒绝策略
- AbortPolicy 直接抛异常 组织线程运行
- DiscardPolicy 丢弃当前线程任务不做任何处理
- DiscardOldestPolicy 移除线程队列最早的线程任务并尝试重新提交当前任务
- CallerRunsPolicy 如果被丢弃的线程任务未关闭则执行该线程任务
33.线程池阻塞队列
- 是一个支持两个附加操作的队列
- 在队列为空时,获取元素的线程会等待队列变为非空
- 当队列满时,存储元素的线程会等待队列可用
- 阻塞队列通过阻塞保留当前想要继续入队的任务 当任务对列没有任务时再获取任务的线程 使得线程进入wait状态释放CPU
- 自带阻塞和唤醒功能
34.线程复用
- 将线程与任务解耦
- 在线程池中 同一个线程可以从阻塞队列不断获取新任务执行
- 核心原理:对Thread封装 调用任务中的run方法
35.锁
- 悲观锁 认为其他线程会修改数据,因此在修改时会锁定线程 容易造成死锁
- 乐观锁 认为数据修改不会发生冲突 只是在数据提交更改时才会对数据检测 不会造成死锁
- 独占锁 只能被单线程持有 悲观锁
- 共享锁 只能被多线程持有 乐观锁
- 可重入锁 递归锁 外层拥有内层依然可以继续获取
36.synchronized Lock
- Lock 一个接口 发生异常时需要在finally中手动释放 可以让等待锁的线程中断 可以提高多个线程读操作的效率
- synchronized 一个关键字 有C语言实现 发生异常会自动释放线程锁不会发上死锁 只能让等待的线程一直等待下去
37.synchronized volatile
- volatile可以保证内存可见性 禁止指令重排 用于多线程下的一写多读
- volatile 是变量修饰符 仅能实现变量修改可见性 不能保证原子性 不会造成线程阻塞
- synchronized 是修饰类 方法 代码段 可以保证可见性和原子性 会造成线程阻塞
38.TCP
- 面向连接网络通信协议 传输数据前在发送端和接收端建立逻辑连接再传输数据
- 三次握手 一握 客户端向服务器发送请求等待确认 二握 服务器给出响应,通知客户端收到请求 三握 客户端再次发送请求确认连接
- 四次挥手 一挥 TCP客户端发送数据请求关闭到服务器的传输 二挥 服务器接受数据后发回确认序号为收到序号+1 三挥 服务器关闭连接 发送数据给客户端 四挥 客户端发回数据确认,将确认序号设置为序号+1
39.tcp udp
- tcp 面向连接 数据传输慢
- udp 面向非连接即发送数据前不需要建立连接 数据传输快
40.JVM
- 可运行Java代码的虚拟计算机 包括一套字节码 一组寄存器 一个栈 一个堆 一个垃圾回收 一个存储方法域
- 运行过程 Java源文件->编译器->字节码文件->JVM->机器码
- 线程分类 主线程(main) 用户线程(Thread) 守护线程(系统线程)GC线程
- 类加载机制:加载 验证 准备 解析 初始化
- 双亲委派机制 一个类收到加载请求,先将其委派给父类
41.反射
- 在运行状态中,对任意一个类都能知道这个类所有的属性和方法;并且能够调用它的任意方法
- API Class类 反射核心 可以获取类属性 方法等信息 Field类 表示类的成员变量 用来获取和设置类中属性值 Methods类 表示类的方法 可以用来获取和设置类之中的属性值 Constructor 表示类的构造方法
- 反射是框架 开发的基础
42.动态语言
- 程序运行时可以改变其结构
- JavaScript ruby python
- 从反射角度Java属于半动态语言
43.获取Class对象
- 调用某个对象的getClass()方法
- 调用某个类的class属性获取该类对应的Class对象
- 使用Class类中的forName()静态方法(最安全,性能最好)
44.注解
- Annotation 是Java提供的一种对元程序中元素关联信息和元数据的途径和方法
- 是一个接口 程序通过反射获取指定对象 再通过该对象获取注解中的元信息
- 分类 容器提供 自定义
45.数据结构
46.算法
47.设计模式
- 分类 创造型模式 结构型模式 行为型模式
- 单例模式 一个类有且只有一个实例,并且自行实例化,向整个系统提供
- 饿汉式 创建对象实例直接初始化 空间换时间
- 懒汉式 类内实例对象创建时不初始化,知道第一次调用get方法 时间换空间
框架
MyBaits
- 采用实体关系映射并可以自定义SQL持久层框架
- 缓存 一级缓存 放在sqlsession默认就有 二级缓存 放在命名空间中 使用二级缓存属性类需要实现序列化接口 可在映射文件中配置
- 分页 使用RowBounds对象 或直接编写sql 也可以使用分页插件-PageHelper
- 动态SQl 可以在Xml映射中以标签形式编写动态sql 完成逻辑判断与动态拼接sql功能
9种动态标签:where set foreach choose when otherwise bind trim
执行原理 使用OGNL从sql中计算表达式值 根据值动态拼接sql -
{}预编译动态传参 可以防止SQL注入提高系统安全
${}字符串替换
- 好处 把sql语句独立 放在单独XML文件 便于维护
封装底层API 简化数据库编程的重复工作
可自定义sql语句 提高效率和完成复杂查询 - 通过
配置 执行一对一 在类中配置类型属性
通过配置 执行一对多 在类中配置List集合 - 调用要求 Mapper接口方法名和xml种sql的id相同
输入参数类型和sql的parameterType类型相同
输出参数类型和sql的resultType类型相同
xml中的namesapce就是接口的类路径
Spring
- 分层的开源框架 以IOC和AOP为内核
- IOC 控制反转 由传统手工管理new对象 反转成Spring容器管理 应用IOC后容器主动将需要依赖Bean对象推送给它所管理的组件 叫依赖注入 可以降低代码耦合度
- AOP 面向切面 将日志记录 安全控制事务处理异常处理等代码划分形成切面类,可以在运行主要业务时通过代理自动添加方法 扩展方法功能
SpringMVC
- Spring的一个模块基于MVC的一个web框架
- 流程 1.用户发送请求经过Filter至前端控制器
2.前端收到请求调用HandlerMapping处理器映射器
3.处理器映射器找到具体的处理器,生成处理器对象及处理器拦截器返回前端控制器
4.前端控制器调用HandlerAdapter处理器适配器
5.HandlerAdapter经配置调用后端控制器
6.后端控制器执行完成返回ModelAndView
7.HandlerAdapter将结果返回给前端控制器
8.前端控制器将结果传给视图解析器
9.视图解析后返回具体View
10.前端控制器根据View渲染视图响应给用户