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