Java知识整理
2022-02-27 20:41:53 0 举报
AI智能生成
Java相关技术整理
作者其他创作
大纲/内容
Java必备
基础
内存分配策略
静态配分
栈内存分配
包
AWT
Swing
Integer
Integer i=59 的时候,会调用 Integer 的 valueOf 方法
当前 i 的值是否在 [-128,127] 区间,
且 IntegerCache 中是否存在此对象,
如果存在,则直接返回引用,否则,创建一个新的对象。
当前 i 的值是否在 [-128,127] 区间,
且 IntegerCache 中是否存在此对象,
如果存在,则直接返回引用,否则,创建一个新的对象。
1、使用int和Integer比较Integer会自动拆箱
进行值比较
进行值比较
2、Integer i = 59;
实际调用了 Integer.valueOf(59),
在-128 ~ 127之间就使用InterCache中
(没有就创建:new Integer(i))
实际调用了 Integer.valueOf(59),
在-128 ~ 127之间就使用InterCache中
(没有就创建:new Integer(i))
异常
Throwable
Exception
OtherException
RuntimeException
Error
try...catch...finally
类加载器
1、启动类加载器Bootstrap ClassLoader
2、扩展类加载器Extension ClassLoader
3、应用程序类加载器Application ClassLoader
String类
String
String 内容不可变,StringBuffer。StringBudiler可变
StringBuffer
同步的,数据安全,效率低。
StringBuilder
不同步的,数据不安全,效率高。1.5之后才有的
容器
Collection
List(有序可重复)
ArrayList(Object数组)
扩容机制
(默认扩容大小为1.5倍)
(默认扩容大小为1.5倍)
1、每次扩容都会检查是否需要扩容
2、第一次添加元素时,默认容量是10
3、三个构造方法
空构造器
默认容量为10
默认容量为10
赋予初始容量构造器
1)如果是0,直接返回一个空的数组
2)如果大于0,返回指定大小的数组的数组
3)否则的话,抛出异常
1)如果是0,直接返回一个空的数组
2)如果大于0,返回指定大小的数组的数组
3)否则的话,抛出异常
指定数组元素构造器
1)数组大于0,返回该大小的数组
1)数组长度为0,返回空数组
1)数组大于0,返回该大小的数组
1)数组长度为0,返回空数组
4、添加元素的两个方法
添加至数组尾部
1)检查是否需要扩容
2)在数组指定位置赋值
1)检查是否需要扩容
2)在数组指定位置赋值
添加至数组指定下标处
1) 检查是否需要扩容
2) 拷贝元素后移
3)指定位置添加元素
1) 检查是否需要扩容
2) 拷贝元素后移
3)指定位置添加元素
* 检查是否需要扩容
1、判断是否是初始为10的数组
LinkedList(双向循环链表)
Set(无序不可重复)
TreeSet(有序:二叉树)
HashSet
LinkedHashSet
Map
HashMap
(线程不安全)
(线程不安全)
LinkedHashMap
TreeMap
HashTable
(线程安全)
(线程安全)
HashMap和HashTable对比
线程安全
hashMap线程不安全
hashTable线程安全
hashMap线程不安全
hashTable线程安全
效率
HashMap效率跟高
HashTable基本被遗弃
HashMap效率跟高
HashTable基本被遗弃
对NUll <K,V>的支持
HashMap,K最多有一个Null,V可以有多个
HashTable,put的K为Null时,抛出空指针
HashMap,K最多有一个Null,V可以有多个
HashTable,put的K为Null时,抛出空指针
扩容大小不同
HashMap初始16,每次扩容为原来的2倍
HashTable初始11,每次扩容为原来的2n+1
HashMap初始16,每次扩容为原来的2倍
HashTable初始11,每次扩容为原来的2n+1
底层数据结构
JDK1.8以后
HashMap:链表长度大于8(默认大小)时,将链表转换为红黑树
HashTable:没有这样的机制
JDK1.8以后
HashMap:链表长度大于8(默认大小)时,将链表转换为红黑树
HashTable:没有这样的机制
HashMap和HashSet对比
实现接口不同
HashMap实现Map接口
HashSet实现Set接口
HashMap实现Map接口
HashSet实现Set接口
存储数据不同
HashMap存储键值对数据
HashSet仅存储对象
HashMap存储键值对数据
HashSet仅存储对象
添加数据方式不同
HashMap调用put存储数据
HashSet调用add存储数据
HashMap调用put存储数据
HashSet调用add存储数据
计算重复方式不同
HashMap使用K计算HashCode
HashSet使用成员对象来计算HashCode值,
对于对象来说,HashCode值可能相同,
所以equals()方法用来判断对象的相等性
HashMap使用K计算HashCode
HashSet使用成员对象来计算HashCode值,
对于对象来说,HashCode值可能相同,
所以equals()方法用来判断对象的相等性
并发
多线程
CopyOnWriteArraySet
CopyOnWriteArrayList
并发编程
特性
三要素
原子性
可见性
一致性
虚拟机
了解
Method Area(Non-Heap)(方法区)
Heap(堆)
VM Stack(虚拟机栈,也有翻译成JAVA 方法栈的)
Native Method Stack ( 本地方法栈 )
Program Counter Register(程序计数器)
流
字节流继承于InputStream OutputStream
字符流继承于InputStreamReader OutputStreamWriter
数据库
MYSQL
引擎
Innodb
InnoDB是事务型数据库的首选引擎,支持事务安全表(ACID),支持行锁定和外键,上图也看到了,InnoDB是默认的MySQL引擎
MyISAM
基于ISAM存储引擎,并对其进行扩展。它是在Web、数据仓储和其他应用环境下最常使用的存储引擎之一。MyISAM拥有较高的插入、查询速度,但不支持事务
事务
四大特性ACID
原子性
一致性
隔离性
读未提交
读已提交
可重复读
串行化
持久性
语法
BEGIN
ROLLBACK
COMMIT
事务隔离性问题
脏读:指一个线程中的事务读取到了另外一个线程中未提交的数据。
不可重复读(虚读):指一个线程中的事务读取到了另外一个线程中提交的update的数据。
幻读:指一个线程中的事务读取到了另外一个线程中提交的insert的数据。
索引
类型
主键索引 primary key
一般索引 key
组合索引
全文索引 fulltext key
唯一索引 unique key
语法
查询
show create table xxx
建立
key `key_name` (`field_name`)
primary key (`id`)
key `key_name` (`field_1`, `field_2`)
删除
alter table xxx drop key `key_name`
细节
where 条件顺序优先使用已建立索引字段
枚举值类使用索引可能比全表扫描低效,需要具体场景分析
避免使用select *, count(1)或count(列) 代替 count(*)
表的字段顺序固定长度的字段优先
组合索引代替多个单列索引(经常使用多个条件查询时)
使用连接(JOIN)来代替子查询(Sub-Queries)
尽量使用短索引
连表时注意条件类型需一致
存储类型
hash
类似键值对的形式, 可以一次定位,不需要像树形索引那样逐层查找,因此具有极高的效率, 这种高效是有条件的,即只在“=”和“in”条件下高效,对于范围查询、排序及组合索引仍然效率不高
btree
BTREE索引就是一种将索引值按一定的算法,存入一个树形的数据结构中(二叉树),每次查询都是从树的入口root开始,依次遍历node,获取leaf。这是MySQL里默认和最常用的索引类型
b+tree
RTREE在MySQL很少使用,仅支持geometry数据类型,支持该类型的存储引擎只有MyISAM、BDb、InnoDb、NDb、Archive几种。
相对于BTREE,RTREE的优势在于范围查找
相对于BTREE,RTREE的优势在于范围查找
FULLTEXT
只有MyISAM引擎支持。其可以在CREATE TABLE ,ALTER TABLE ,CREATE INDEX 使用,不过目前只有 CHAR、VARCHAR ,TEXT 列上可以创建全文索引, 解决 where like '%xxx%' 模糊查询问题
索引失效
索引左原则, like 'xxx%' 使用索引,'%xxx', '%xxx%'不使用
数据类型出现隐式转化。如varchar不加单引号的话可能会自动转换为int型,使索引无效,产生全表扫描。
or 需要左右均建立索引才会使用索引查询
组合索引,不是使用第一列索引,索引失效。左原则
在索引列上使用 IS NULL 或 IS NOT NULL操作。索引是不索引空值的,所以这样的操作不能使用索引,可以用其他的办法处理,例如:数字类型,判断大于0,字符串类型设置一个默认值,判断是否等于默认值即可。
在索引字段上使用not,<>,!=。不等于操作符是永远不会用到索引的,因此对它的处理只会产生全表扫描。
对索引字段进行计算操作、字段上使用函数。(索引为 emp(ename,empno,sal))
优化
作用
增加吞吐量
减少CPU处理压力
加快数据读写
设计
not null优先,null是特定数值,占用空间, 空字符串不占用空间, 且null计算逻辑较复杂
语义化字段名,适当注释,选用合适的字段类型
适当冗余字段,减少关联查询与重复查询
语义化字段名,适当注释,选用合适的字段类型
范式
第一范式
确保每列保持原子性
第二范式
确保表中的每列都和主键相关
第三范式
确保每列都和主键列直接相关,而不是间接相关
查询
版本特性
5.6
innodb后台线程独立出来
explain语句支持insert,update,delete,replace语句,并且支持JSON格式
5.7
安全性
JSON
默认启用 STRICT_TRANS_TABLES 模式。对 ONLY_FULL_GROUP_BY 模式实现了更复杂的特性支持,并且也被默认启用。
8.0
JSON扩展语法,新功能,改进排序和部分更新。使用JSON表函数,您可以使用JSON数据的SQL机制。
GIS地理支持。空间参考系统(SRS),以及SRS感知空间数据类型,空间索引和空间功能。
安全 OpenSSL改进,新的默认身份验证,SQL角色,分解超级特权,密码强度等等。
性能大幅提升, 比5.7 快2倍
前端
消息中间件
RocketMQ
作用
应用解耦
流量削峰
组成
Producer
Consumer
消费方式
拉取式消费
推动式消费
消费模式
集群消费
广播消费
消费顺序
普通顺序消息
严格顺序消息
BrokerServer
NameServer
主题(Topic)
标签(Tag)
消息(Message)
鉴权(ACL)
Redis
子主题
框架结构
spring
概述
优点
IOC
1、set注入方式
2、构造器注入方式
3、基于注解的方式
@Component 把对象加入ioc容器,对象引用名称是类名,第一个字母小写
@Component(“name”) 把指定名称的对象,加入ioc容器
@Repository 主要用于标识加入容器的对象是一个持久层的组件(类)
@Service 主要用于标识加入容器的对象是一个业务逻辑层的组件
@Controller 主要用于标识加入容器的对象是一个控制层的组件
@Resource 注入属性(DI), 会从容器中找对象注入到@Resource修饰的对象上
@Autowired 注入属性(DI), 会从容器中找对象注入到@Autowired修饰的对象上
@Component(“name”) 把指定名称的对象,加入ioc容器
@Repository 主要用于标识加入容器的对象是一个持久层的组件(类)
@Service 主要用于标识加入容器的对象是一个业务逻辑层的组件
@Controller 主要用于标识加入容器的对象是一个控制层的组件
@Resource 注入属性(DI), 会从容器中找对象注入到@Resource修饰的对象上
@Autowired 注入属性(DI), 会从容器中找对象注入到@Autowired修饰的对象上
4、静态工厂注入方式
AOP
AOP涉及名称
切面(Aspect):其实就是共有功能的实现。如日志切面、权限切面、事务切面等。在实际应用中通常是一个存放共有功能实现的普通Java类,之所以能被AOP容器识别成切面,是在配置中指定的。
通知(Advice):是切面的具体实现。以目标方法为参照点,根据放置的地方不同,可分为前置通知(Before)、后置通知(AfterReturning)、异常通知(AfterThrowing)、最终通知(After)与环绕通知(Around)5种。在实际应用中通常是切面类中的一个方法,具体属于哪类通知,同样是在配置中指定的。
连接点(Joinpoint):就是程序在运行过程中能够插入切面的地点。例如,方法调用、异常抛出或字段修改等,但Spring只支持方法级的连接点。
切入点(Pointcut):用于定义通知应该切入到哪些连接点上。不同的通知通常需要切入到不同的连接点上,这种精准的匹配是由切入点的正则表达式来定义的。
目标对象(Target):就是那些即将切入切面的对象,也就是那些被通知的对象。这些对象中已经只剩下干干净净的核心业务逻辑代码了,所有的共有功能代码等待AOP容器的切入。
代理对象(Proxy):将通知应用到目标对象之后被动态创建的对象。可以简单地理解为,代理对象的功能等于目标对象的核心业务逻辑功能加上共有功能。代理对象对于使用者而言是透明的,是程序运行过程中的产物。
织入(Weaving):将切面应用到目标对象从而创建一个新的代理对象的过程。这个过程可以发生在编译期、类装载期及运行期,当然不同的发生点有着不同的前提条件。譬如发生在编译期的话,就要求有一个支持这种AOP实现的特殊编译器;发生在类装载期,就要求有一个支持AOP实现的特殊类装载器;只有发生在运行期,则可直接通过Java语言的反射机制与动态代理机制来动态实现。
通知(Advice):是切面的具体实现。以目标方法为参照点,根据放置的地方不同,可分为前置通知(Before)、后置通知(AfterReturning)、异常通知(AfterThrowing)、最终通知(After)与环绕通知(Around)5种。在实际应用中通常是切面类中的一个方法,具体属于哪类通知,同样是在配置中指定的。
连接点(Joinpoint):就是程序在运行过程中能够插入切面的地点。例如,方法调用、异常抛出或字段修改等,但Spring只支持方法级的连接点。
切入点(Pointcut):用于定义通知应该切入到哪些连接点上。不同的通知通常需要切入到不同的连接点上,这种精准的匹配是由切入点的正则表达式来定义的。
目标对象(Target):就是那些即将切入切面的对象,也就是那些被通知的对象。这些对象中已经只剩下干干净净的核心业务逻辑代码了,所有的共有功能代码等待AOP容器的切入。
代理对象(Proxy):将通知应用到目标对象之后被动态创建的对象。可以简单地理解为,代理对象的功能等于目标对象的核心业务逻辑功能加上共有功能。代理对象对于使用者而言是透明的,是程序运行过程中的产物。
织入(Weaving):将切面应用到目标对象从而创建一个新的代理对象的过程。这个过程可以发生在编译期、类装载期及运行期,当然不同的发生点有着不同的前提条件。譬如发生在编译期的话,就要求有一个支持这种AOP实现的特殊编译器;发生在类装载期,就要求有一个支持AOP实现的特殊类装载器;只有发生在运行期,则可直接通过Java语言的反射机制与动态代理机制来动态实现。
设计模式
工厂设计模式
spring使用工厂模式通过BeanFactory、ApplicationContext创建Bean对象
代理设计模式
Spring AOP 功能的实现。
单例设计模式
Spring 中的 Bean 默认都是单例的。
模板方法模式
Spring 中 jdbcTemplate、hibernateTemplate
等以 Template 结尾的对数据库操作的类
它们就使用到了模板模式。
等以 Template 结尾的对数据库操作的类
它们就使用到了模板模式。
包装器设计模式
我们的项目需要连接多个数据库,
而且不同的客户在每次访问中根据需要会去访问不同的数据库。
这种模式让我们可以根据客户的需求能够动态切换不同的数据源。
而且不同的客户在每次访问中根据需要会去访问不同的数据库。
这种模式让我们可以根据客户的需求能够动态切换不同的数据源。
观察者模式
Spring 事件驱动模型就是观察者模式很经典的一个应用。
适配器模式
Spring AOP 的增强或通知(Advice)使用到了适配器模式、
spring MVC 中也是用到了适配器模式适配Controller
spring MVC 中也是用到了适配器模式适配Controller
事务
事务传播总类
PROPAGATION_REQUIRES_NEW
必须的。说明必须要有事物,没有就新建事物
PROPAGATION_SUPPORTS
支持。说明仅仅是支持事务,没有事务就非事务方式执行
PROPERGATION_MANDATORY
强制的。说明一定要有事务,没有事务就抛出异常
PROPAGATION_REQUIRES_NEW
必须新建事物。如果当前存在事物就挂起。
PROPAGATION_NOT_SUPPORTED
不支持事物,如果存在事物就挂起。
PROPAGATION_NEVER
绝不有事务。如果存在事物就抛出异常
PROPAGATION_NESTED
表示如果当前事务存在,则方法应该运行在一个嵌套事务中。否则,它看起来和 PROPAGATION_REQUIRED 看起来没什么俩样
七个模块
SpringCloudAlibaba
nacos
gateway
HTTP
Servlet
Servlet的生命周期
(1)加载:容器通过类加载器使用servlet类对应的文件加载servlet
(2)创建:通过调用servlet构造函数创建一个servlet对象
(3)初始化:调用init方法初始化
(4)处理客户请求:每当有一个客户请求,容器会创建一个线程来处理客户请求
(5)卸载:调用destroy方法让servlet自己释放其占用的资源
多线程下其本身并不是线程安全
请求
forward(请求转发)
服务端行为,服务器获取跳转页面内容传给用户,用户地址栏不变
redirect(请求重定向)
客户端行为,服务器向用户发送转向的地址,redirect后地址栏变成新的地址
doGet/doPost 则是在 javax.servlet.http.HttpServlet 中实现的
三次握手四次挥手
设计模式
0 条评论
下一页