Java基础
数组
一组连续空间,存储多个相同类型的值
特点
- 数据类型相同
- 长度固定
数组的扩容
- 创建一个新数组,使用For循环将元素逐一赋值
- System.arraycopy(原数组名,原数组起始下标,新数组名,新数组起始下标,复制的长度)
- Java.util.Arrays.copyOf(原数组名,新数组名)
排序
- 冒泡(相邻两个元素两两比较,互换位置)
- 选择(固定值和其他值依次比较,互换位置)
- 快速
查找
- 二分法查找【递归】
静态&最终&抽象
静态static
简述
- 可以修饰属性和方法
- 修饰属性——>静态属性(类属性)
- 修饰方法——>静态方法(类方法)
- 静态成员全类所有对象共享
- 全类就一份,不会因为创建多个对象而产生多份
- 不必创建对象,直接通过类名进行访问
特点
- 静态方法可以直接访问静态成员
- 静态方法不能直接访问非静态成员
- 可以继承,没有覆盖和多态
抽象Abstract
简述
- 修饰类——>称为抽象类,无法New对象
- 作用
- 为子类提供共性的属性和方法
- 可以声明引用,强制使用多态(分类引用指向子类对象)
- 作用
- 修饰方法——>称为抽象方法,无法直接使用
- 作用
- 强制子类覆盖父类中所有的抽象方法,如果不覆盖,该类必须声明为抽象类
- 作用
最终Final
简述
- 修饰类——>没有子类
- 修饰方法——>可以继承,不能覆盖
- 修饰变量——>只能赋值一次,不能改变,修饰变量我们称之为常量
- 实例变量:没有默认值,必须手动赋值,赋值的时机:
- 显示初始化
- 动态代码块
- 每一个构造方法
- 静态变量:没有默认值,必须手动赋值,赋值的时机:
- 显示初始化
- 静态代码块
- 局部变量
- 基本数据类型:数值不可变
- 引用数据类型:地址不可变
- 实例变量:没有默认值,必须手动赋值,赋值的时机:
类加载过程
https://blog.csdn.net/romantic_jie/article/details/91355437
JVM原理&调优【重点】
略(后面详细介绍)
Object类
所有的父类,如果没有显示继承,那么隐式存在
作用
- 作为形参——>可以接受所有对象
- 作为返回值类型——>可以返回所有对象
- Java中每一个对象多可调用Object类中的方法
Object类常用的方法有哪些低于5个)
- hashCode toString getClass equals wait notify notiyAll clone fianlize等
集合
简述
Java集合类存放在java.util包中,是一个用来存放对象的容器。
注意:
- 1.集合只能存放对象。比如你存入一个int型数据66放入集合中,其实它是自动转换成Integer类后存入的,Java中每一种基本数据类型都有对应的引用类型。
- 2.集合存放的都是对象的引用,而非对象本身。所以我们称集合中的对象就是集合中对象的引用。对象本身还是放在堆内存中。
- 3.集合可以存放不同类型,不限数量的数据类型。
集合和数组的区别
- 长度
- 数组不可变
- 集合可变
- 元素的数据类型
- 数组可以存储基本类型数据和引用数据类型
- 集合只能存储引用数据类型
集合类原理,尤其HashMap、HashTable、ConcurrentHashMap等
-
HashTable: KV都不允许为null,线程安全,效率低
-
HashMap(和HashTable相反):哈希表()、链表( 解决哈希冲突)、红黑树( 解决链表过长,效率过低问题)
-
ConcurrentHashMap:1.7版本之前 哈希表 + 链表 + 分段锁 1.8以后 哈希表 + 链表 + 红黑树
CAS(Compare And Set): 类似于乐观锁
面试题/h3>
List下有三个实现类的特点
set集合
HashSet
Map和Colleciton区别
IO
分类
- 方法:输入流和输出流
- 功能:节点流和过滤流
- 单位:字节流和字符流
使用
略
对象序列化和反序列化
络中传输的数据均为字节,保证数据能够进行 络传输
- 实现序列化接口
- 不需要参与对象的序列化
BIO、NIO、AIO/h3>
-
BIO:同步阻塞IO
-
NIO:同步非阻塞IO Netty
-
AIO:异步非阻塞IO
络编程
阻塞和非阻塞体现在线程利用率
阻塞:先有线程再有完整的IO操作,线程服务于一次完整的IO
非阻塞:关注的事件,事件发生后进行事件操作,线程利用率更高
同步和异步
BIO:同步阻塞IO
NIO:同步非阻塞IO Netty
AIO:异步非阻塞IO
络编程
阻塞和非阻塞体现在线程利用率
阻塞:先有线程再有完整的IO操作,线程服务于一次完整的IO
非阻塞:关注的事件,事件发生后进行事件操作,线程利用率更高
同步和异步
request.getInputStream
线程
进程:正在运行的程序。
cpu:单cpu一个时间点只能执行一个进程。
- 为什么我们感觉多个进程是同时执行的/li>
- 是因为cpu在做着程序之间的高效切换,让我们感觉是同时在执行。
线程:在一个进程中,包含多个任务,而每一个任务就是一个线程。
多线程:每一个进程想要执行必须抢到cpu才能执行,如果一个进程中线程的数量比较多,那么该进程抢到的概率就更大,但是不保证一定抢到,因为线程的执行是随机性的。
并发:在一段时间内多个线程切换执行。
并行:在一个时间点多个线程同时执行。
创建
- extend Thread
- implements Runnable
- 线程池
运行状态
- 初始化状态
- 就绪状态 thread.start()
- 运行状态
- 阻塞状态 sleep(不会释放锁) | wait(释放锁标记)
- 死亡状态
线程安全
多线程并发环境中操作临界资源,保证线程的安全,对临界资源加锁
同步锁
- 同步方法
- 同步代码块
线程池
将需要执行的任务交给线程池,线程池会分配线程去执行该任务,任务执行结束线程不会死亡,而是回到线程池中处于空闲状态,等待下一个任务。
- FixedThreadPool
- CachedThreadPool
反射
类对象
通过.class文件获取的对象,使用该对象中的构造方法,实例变量,实例方法。
- getClass
- Class.forName(推荐(将来可以将字符串写入到配置文件中))
- 对象.class
使用
- 反射调用方法、属性
设计模式
-
单例(静态内部类)
保证内存中只有一个对象
- 私有属性方法
- 本类提供一个对象
- 将该类对象提供给外界使用
-
工厂(好处 : 解耦合)
主要解决的是对象创建的问题,工厂的职责在于创建一个对象
-
代理(静态代理、动态代理)
客户端并不直接调用实际的对象,而是通过调用代理,来间接的调用实际的对象。
-
适配器
将一个类的接口转成客户期望的另外一个接口,使得原本由于接口不匹配而不能一起工作的那些类可以一起工作。
-
责任链
当系统需要嵌入多个独立功能模块时,可以使用责任链设计模式
- :主要负责实际功能实现。
- :用于协调责任调度,记录调度状态。
络
TCP/IP协议的三次握手和四次挥手
https://blog.csdn.net/qq_38950316/article/details/81087809
络七层模型
- 应用层 Http
- 会话层
- 表示层
- 传输层 TCP/UDP 文
- 络层
- 数据链路层
- 物理层
JavaWEB框架复习
Java 语法基础:HashMap结构,锁-分类,JVM GC策略,自定线程池参数含义,JVM内存分析指令-jmap,jstack,jstats, Java类加载策略, 络编程 阻塞IO和NIO – 高级Java开发工程师
Spring
概念:一款轻量级的javaEE解决方案,众多优秀设计模式的组合
IOC(控制反转)
控制:给属性赋值的权利
反转:把给属性赋值的权利由代码反转到了配置文件中
控制反转,有容器工厂负责对象的创建销毁(生命周期)
或者
DI(依赖注入)
当一个类型需要另一个类型时,可以把另一个类型作为该类型的属性,通过对应的注入方式进行赋值
、和
AOP(面向切面编程)
将代码中其它功能(事务、日志、性能等)剥离出来形成独立的功能方法或者功能类,如果使用到这些功能时,通过动态代理方式生成代理类,增强普通类功能
动态代理(字节码处理技术): 原始方法 + 额外功能 = 代理类
- JDK(默认):必须提供接口
- CGLIB(基于父子类继承关系):可以是接口也可以是普通类
使用
- 基于接口
- 基于注解: 和等
切入点表达式
- 通用表达式:
事务传播属性
解决事务嵌套问题
- SUPPORT(support):支持当前事务,如果无事务环境则以无事务方式运行
- REQUIRED(required):必须有事务,如果有事务则使用当前事务,如果无新建事务
- NOT_SUPPORT:外部有事务则挂起(以非事务的形式执行)
- MANDATORY(mandatory):外部必须有事务,没有事务就 错
- NEVER:外部必须没有事务,有事务 错
1.PROPAGATION(propagation)_REQUIRED – 如果存在当前事务则用当前事务;如果不存在当前事务,就新建一个事务。这是最常见的选择。
2.PROPAGATION_SUPPORTS – 支持当前事务,如果当前没有事务,就以非事务方式执行。
3.PROPAGATION_MANDATORY – 支持当前事务,如果当前没有事务,就抛出异常。
4.PROPAGATION_REQUIRES_NEW – 新建事务,如果当前存在事务,把当前事务挂起。开启一个新事务,新事务执行完毕后,唤醒之前挂起的事务,继续执行。如果不存在当前事务,则新建一个事务
5.PROPAGATION_NOT_SUPPORTED – 以非事务方式执行操作,如果当前存在事务,就把当前事务挂起。
6.PROPAGATION_NEVER – 以非事务方式执行,如果当前存在事务,则抛出异常。
7.PROPAGATION_NESTED – 如果当前存在事务,则在嵌套事务内执行。如果当前没有事务,则进行与PROPAGATION_REQUIRED类似的操作。
隔离属性
脏读: 一个事务读取了另一个事务尚未提交的数据
isolation=“READ_COMMITTED” 解决脏读问题
不可重复读:多次读取到的数据不一致
isolation=“REPEATABLE(repeatable)_READ” 解决不可重复读问题
幻影读:多次统计的结果不一致
isolation=“SERIALIZABLE(serializable)” 解决幻影读问题
安全:SERIALIZABLE>REPEATABLE_READ>READ_COMMITTED
性能:READ_COMMITTED>REPEATABLE_READ>SERIALIZABLE
isolation=“DEFAULT” 根据数据库默认隔离属性定
Oracle数据库隔离属性级别: READ_COMMITTED
Mysql数据库隔离属性级别: REPEATABLE_READ
传播属性 (补充)
作用:解决事务嵌套问题
propagation=“REQUIRED” 默认值 当外部有事务则融入到外部事务中,如果外部没有事务,则开启新的事务 (增删改)
propagation=“SUPPORTS” 当外部有事务则融入到外部事务中,如果外部没有事务,也不开启事务(查)
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-I5L3l4to-1586439809864)(D:java168java168三阶段资料框架阶段SpringSpring-Day4图片传播属性补充.png)]
只读属性
read-only=false 默认值 (增删改)
read-only=true 查询(提高查询效率)
超时属性
作用:决定释放锁标记的等待时长
time-out=-1 由数据库来决定
异常属性
作用:哪些异常进行提交些异常进行回滚/p>
默认对于未检查异常进行回滚操作,对已检查异常进行提交操作
rollback-for 指定哪些异常进行回滚操作
no-rollback-for 指定哪些异常进行提交操作
总结:实战开发中事务属性的应用
增删改: isolation=“default” propagation=“REQUIRED” read-only=“false” time-out=”-1″
异常属性默认 (全部用默认)
查询: isolation=“default” propagation=“SUPPORTS” read-only=“true” time-out=”-1″
异常属性默认
Spring工厂创建对象的生命周期
对象什么时候被创建/strong>
对象只创建一次时(scope=“singleton”):工厂被创建则对象被创建 饿汉式
对象每次创建新的(scope=“prototype”): 该对象使用时被创建 懒汉式
对象什么时候被销毁/strong>
工厂关闭时,对象被销毁 但是还与垃圾回收机制有关
init-method 指定对象创建调用的初始化方法
destory-method 指定对象销毁调用的销毁方法
SSM(Spring+Struts2+Mybatis)注解版
作用:替换配置文件中,复杂的配置
开发步骤:
1.把注解放置对应的位置上
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-c6e0pLf5-1586439809865)(C:Users战神AppDataRoamingTyporatypora-user-images1586434941807.png)]
2.告知Spring框架在哪一个包中使用了注解
常用注解:
-
@Component
放置位置:类上
作用:创建简单对象
注意:默认提供ID 类名首字母小写
-
@Service
位置:Service实现类上
作用:创建Service实现类对象
-
@Autowired
位置:属性上
作用:为属性做自动注入
前提:在Spring工厂中必须有为该属性注入的值
-
@Transactional
位置:方法 类
作用:为方法添加对应的事务
前提: 必须激活该注解
-
@Controller
位置:类
作用:自动创建Action对象
-
@Scope
位置:类
作用:决定对象创建的次数
singleton 只创建一次
prototype 每次创建新的
开发步
1.建表
2.写实体
3.定义DAO接口
4.Mapper文件实现DAO接口
5.Spring配置文件中配置mybatis相关的内容
6.定义Service接口
7.实现Service接口
i.@Service 自动创建Service实现类对象
ii.@Autowired 自动为DAO属性做注入
8.配置额外功能事务
i.@Transactional 给对应的方法添加事务
9.开发Action
i.@Controller 创建Action对象
ii.@Scope 决定创建对象的次数
iii.@Autowired 自动注入Service实现类对象
10.struts.xml中配置
11.告知Spring框架在那一个包下使用了注解
SpringMVC
概念:是一款控制层的框架,解决MVC分层开发中控制层的问题
好处:
-
SpringMVC框架是Spring全家桶体系的组成部分,与Spring体系做到无缝衔接
-
SpringMVC无论从开发效率还是运行效率都比Struts2高
作用
1.接收数据
2.调用业务
3.跳转页面
SpringMVC中的基础语法
@RequestMapping注解
作用:
1.指定后台Action的访问路径
2.指定该方法被访问的请求方式
位置:
类 相当于struts2中的namespace
方法 相当于struts2中的name
RequestMethod.GET 该方法只能被GET方式访问
RequestMethod.POST 该方法只能被POST方式访问
method ={RequestMethod.POST,RequestMethod.GET} 既可以被POST方式又可以被GET方式访问 (默认)
@RequestParam注解
i.解决传入的键与形参名不一致的问题
ii.可以设置接收数据的默认值
@DateTimeFormat注解
@DateTimeFormat(pattern = “yyyy-MM-dd”) 自定义接收数据类型
SpringMVC流程
1、 用户发送请求至前端控制器DispatcherServlet。
2、 DispatcherServlet收到请求调用HandlerMapping处理器映射器。
3、 处理器映射器找到具体的处理器(可以根据xml配置、注解进行查找),生成处理器对象及处理器拦截器(如果有则生成)一并返回给DispatcherServlet。
4、 DispatcherServlet调用HandlerAdapter处理器适配器。
5、 HandlerAdapter经过适配调用具体的处理器(Controller,也叫后端控制器)。
6、 Controller执行完成返回ModelAndView。
7、 HandlerAdapter将controller执行结果ModelAndView返回给DispatcherServlet。
8、 DispatcherServlet将ModelAndView传给ViewReslover视图解析器。
9、 ViewReslover解析后返回具体View。
10、DispatcherServlet根据View进行渲染视图(即将模型数据填充至视图中)。
11、 DispatcherServlet响应用户。
SpringBoot
介绍
简化Spring应用的初始搭建以及开发过程,内嵌WEB容器,提供自动配置,程序员只需要关注业务功能开发而不是Bean的配置;
springboot(微框架) = springmvc(控制器) + spring(项目管理)
特点
创建独立的Spring应用程序
嵌入的Tomcat,无需部署WAR文件
简化Maven配置
自动配置Spring
没有XML配置
Restful
软件设计风格
使用请求方式说明对资源操作;
自动配置
Spring4.0后提供配置注解
根据导入的依赖自动完成配置
切面编程
springboot是对原有项目中spring框架和springmvc的进一步封装,因此在springboot中同样支持spring框架中AOP切面编程,不过在springboot中为了快速开发仅仅提供了注解方式的切面编程.
相关注解
- @Aspect 用来类上,代表这个类是一个切面
- @Before 用在方法上代表这个方法是一个前置通知方法
- @After 用在方法上代表这个方法是一个后置通知方法
- @Around 用在方法上代表这个方法是一个环绕的方法
- @order(数字)用在类上,数字越小进入越早
重点注解
参考: https://www.cnblogs.com/tanwei81/p/6814022.html
- @RestController: 就是@Controller+@ResponseBody组合,支持RESTful访问方式,返回结果都是json字符串。
- @ResponsrBody:返回Json数据
- @Controller:用于定义控制器类
- @Autowired:自动导入依赖的bean
- @Service:修饰Server层的组件
- @SpringBootApplication 注解等价于:
- @Configuration 项目启动时自动配置spring 和 springmvc 初始搭建
- @EnableAutoConfiguration 自动与项目中集成的第三方技术进行集成
- @ComponentScan 扫描入口类所在子包以及子包后代包中注解(也可以从新指定要扫描哪些包)
MyBatis
优秀的持久层框架,对数据库进行访问和操作。
替换JDBC技术 —– 定制化SQL(动态SQL),高级映射关系,支持缓存。
核心组件
mybtis中代码的书写
JDBC —> 接口 Connection PreparedStatement ResultSet DrvierManager
Resources、SqlSessionFactory、SqlSession
Resources : 读取MyBatis的核心配置文件。
SqlSession : 类似连接Connection
将mapper.xml文件 转换成对应的DAO实现类(DAOImpl)
内部封装了Connection对象 使用SqlSession去访问数据库
sqlSession.commit(); sqlSession.rollback();
SqlSessionFactory :SqlSession的工厂 用来创建SqlSession对象。
缓存机制
应用优化策略,提高访问效率,大大减轻数据库的访问负载
-
一级缓存:SqlSession,缓存依赖于会话
-
二级缓存:NameSpace级别,所有的查询语句都会进行缓存,在调用增删改方法时所有的查询缓存会失效;
—> JVM
—> 保存第三方存储系统(内存 分布式)
基于Redis管理MyBatis二级缓存 构建分布式缓存服务;
动态SQL标签
- 略
MyBatis参数绑定机制
mapper文件中取值的语法: #{…} . ${} 存在SQL注入的风险 不建议使用
关系型数据库(MySQL)

基本SQL语法
DQL (Data Query Language) : 数据查询语言
DDL(创建表) : 数据的定义语言
DML(增删改) : 数据修改语言
- 基本Select、Update、Insert、Delete
- insert into 表名(列1,列2…) values (数据1,数据2…)
- update 表名 set 列名=数据,列名=数据… where 条件
- delete from 表名 where 条件
- 函数使用max、min、avg、now等
- 表连接查询
- 数据库
- 表
事务 【重点】
ACID四大特性/h5>
- 原子性:一个事务内,所有操作是一个不可分割的整体;
- 一致性:事务操作前后对数据的影响是一致的
- 隔离性:事务和事务的操作时隔离的,互不影响干涉;
- 持久性:事务操作一旦提交,对数据库影响是不可逆的
事务问题/h5>
脏读(A事务读取到了B事务未提交的数据)
不重复读(A事务内多次读取同一条数据,结果不一致)
幻影读(A事务多次读取结果的条数不一致)
事务隔离级别/h5>
- 读未提交:没有解决任何的事务问题
- 读已提交:解决脏读,Oracle默认
- 重复度:解决不可重复读,MySQL默认
- 序列化读: 解决所有的事务问题;
等级:由低到高
效率:由高到低
事务传播属性/h5>
等级:由低到高
效率:由高到低
参考Spring
索引 【重点】
常用索引类型
-
主键索引:约束,建议在查表时使用主键,因为这样做的话可以使用到主键索引
-
唯一索引:约束
-
复合索引:对多个字段创建一个索引;
-
普通索引:单字段创建一个索引
索引方法
-
Hash
-
BTree
https://blog.csdn.net/iteye_19269/article/details/82678056
视图(view)
简化SQL语句
数据库引擎 【重点】
-
Myisam 不支持事务和外键 适用于只读查询
-
Innodb 支持事务和外键 适用于读写查询
https://www.cnblogs.com/wangsen/p/10863405.html
https://www.cnblogs.com/klb561/p/10344364.html
存储过程 【一般】
https://www.runoob.com/w3cnote/mysql-stored-procedure.html
SQL优化
-
尽可能利用索引查询
-
尽量避免三张表以上的连接操作,可以使用子查询代替表连接
-
查询利用条件查询,避免全表的扫表
-
避免使用 ,建议使用字段方式
总结:上 资料 + 理解
设计范式
一、二、三范式
总结资料
https://www.cnblogs.com/wenxiaofei/p/9853682.html
悲观锁和乐观锁
- 乐观锁:数据改操作,查询当前数据的版本 ,应用更改,再结束后再次查询版本 ,如果版本 变化回滚事务,没有变化提交事务;
Struts2
解决现有MVC开发思想中 控制器的问题。 —> 替换Servlet技术
框架: framewrok 软件开发中的半成品!!!
解决了软件开发过程中的通用问题(代码冗余或设计的不合理),从而提高了开发效率。
Servlet(单例)
不能定义成员变量
Struts2(多例)
每一次请求访问都会创建一个全新的对象(构造方法被多次调用),可以定义成员变量
Struts2中的跳转
Servlet 中跳转 请求转发 / 重定向
forward: 一次请求使用request作用域传递数据,地址栏不发生改变。
redirect : 两次请求不能使用request作用域传递数据,地址栏发生改变。
Struts2 中依然保持这两种跳转方式,由原有的代码书写变成的Struts.xml的配置
声明:本站部分文章及图片源自用户投稿,如本站任何资料有侵权请您尽早请联系jinwei@zod.com.cn进行处理,非常感谢!