Java知识整理
2022-02-27 20:41:53 0 举报
AI智能生成
Java相关技术整理
作者其他创作
大纲/内容
Java必备
基础
内存分配策略
静态配分
栈内存分配
包
AWT
Swing
Integer
Integer i=59 的时候,会调用 Integer 的 valueOf 方法<br>当前 i 的值是否在 [-128,127] 区间,<br>且 IntegerCache 中是否存在此对象,<br>如果存在,则直接返回引用,否则,创建一个新的对象。<br>
1、使用int和Integer比较Integer会自动拆箱<br>进行值比较<br>
2、Integer i = 59;<br>实际调用了 Integer.valueOf(59),<br>在-128 ~ 127之间就使用InterCache中<br>(没有就创建:new Integer(i))<br>
异常
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(有序可重复)<br>
ArrayList(Object数组)
扩容机制<br>(默认扩容大小为1.5倍)
1、每次扩容都会检查是否需要扩容
2、第一次添加元素时,默认容量是10
3、三个构造方法
空构造器<br>默认容量为10
赋予初始容量构造器<br>1)如果是0,直接返回一个空的数组<br>2)如果大于0,返回指定大小的数组的数组<br>3)否则的话,抛出异常<br>
指定数组元素构造器<br>1)数组大于0,返回该大小的数组<br>1)数组长度为0,返回空数组
4、添加元素的两个方法
添加至数组尾部<br>1)检查是否需要扩容<br>2)在数组指定位置赋值
添加至数组指定下标处<br>1) 检查是否需要扩容<br>2) 拷贝元素后移<br>3)指定位置添加元素
* 检查是否需要扩容
1、判断是否是初始为10的数组
LinkedList(双向循环链表)
Set(无序不可重复)<br>
TreeSet(有序:二叉树)
HashSet
LinkedHashSet
Map
HashMap<br>(线程不安全)
LinkedHashMap
TreeMap
HashTable<br>(线程安全)
HashMap和HashTable对比
线程安全<br>hashMap线程不安全<br>hashTable线程安全
效率<br>HashMap效率跟高<br>HashTable基本被遗弃
对NUll <K,V>的支持<br>HashMap,K最多有一个Null,V可以有多个<br>HashTable,put的K为Null时,抛出空指针
扩容大小不同<br>HashMap初始16,每次扩容为原来的2倍<br>HashTable初始11,每次扩容为原来的2n+1<br>
底层数据结构<br>JDK1.8以后<br>HashMap:链表长度大于8(默认大小)时,将链表转换为红黑树<br>HashTable:没有这样的机制<br>
HashMap和HashSet对比
实现接口不同<br>HashMap实现Map接口<br>HashSet实现Set接口
存储数据不同<br>HashMap存储键值对数据<br>HashSet仅存储对象
添加数据方式不同<br>HashMap调用put存储数据<br>HashSet调用add存储数据
计算重复方式不同<br>HashMap使用K计算HashCode<br>HashSet使用成员对象来计算HashCode值,<br>对于对象来说,HashCode值可能相同,<br>所以equals()方法用来判断对象的相等性<br>
并发
多线程
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几种。<br>相对于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
消费方式
拉取式消费
推动式消费
消费模式
集群消费
广播消费<br>
消费顺序
普通顺序消息
严格顺序消息
BrokerServer
NameServer
主题(Topic)
标签(Tag)
消息(Message)
鉴权(ACL)
Redis
子主题
框架结构
spring
概述
优点
IOC
1、set注入方式
2、构造器注入方式
3、基于注解的方式
@Component 把对象加入ioc容器,对象引用名称是类名,第一个字母小写<br>@Component(“name”) 把指定名称的对象,加入ioc容器<br>@Repository 主要用于标识加入容器的对象是一个持久层的组件(类)<br>@Service 主要用于标识加入容器的对象是一个业务逻辑层的组件<br>@Controller 主要用于标识加入容器的对象是一个控制层的组件<br>@Resource 注入属性(DI), 会从容器中找对象注入到@Resource修饰的对象上<br>@Autowired 注入属性(DI), 会从容器中找对象注入到@Autowired修饰的对象上
4、静态工厂注入方式<br>
AOP
AOP涉及名称
切面(Aspect):其实就是共有功能的实现。如日志切面、权限切面、事务切面等。在实际应用中通常是一个存放共有功能实现的普通Java类,之所以能被AOP容器识别成切面,是在配置中指定的。<br><br>通知(Advice):是切面的具体实现。以目标方法为参照点,根据放置的地方不同,可分为前置通知(Before)、后置通知(AfterReturning)、异常通知(AfterThrowing)、最终通知(After)与环绕通知(Around)5种。在实际应用中通常是切面类中的一个方法,具体属于哪类通知,同样是在配置中指定的。<br><br>连接点(Joinpoint):就是程序在运行过程中能够插入切面的地点。例如,方法调用、异常抛出或字段修改等,但Spring只支持方法级的连接点。<br><br>切入点(Pointcut):用于定义通知应该切入到哪些连接点上。不同的通知通常需要切入到不同的连接点上,这种精准的匹配是由切入点的正则表达式来定义的。<br><br>目标对象(Target):就是那些即将切入切面的对象,也就是那些被通知的对象。这些对象中已经只剩下干干净净的核心业务逻辑代码了,所有的共有功能代码等待AOP容器的切入。<br><br>代理对象(Proxy):将通知应用到目标对象之后被动态创建的对象。可以简单地理解为,代理对象的功能等于目标对象的核心业务逻辑功能加上共有功能。代理对象对于使用者而言是透明的,是程序运行过程中的产物。<br><br>织入(Weaving):将切面应用到目标对象从而创建一个新的代理对象的过程。这个过程可以发生在编译期、类装载期及运行期,当然不同的发生点有着不同的前提条件。譬如发生在编译期的话,就要求有一个支持这种AOP实现的特殊编译器;发生在类装载期,就要求有一个支持AOP实现的特殊类装载器;只有发生在运行期,则可直接通过Java语言的反射机制与动态代理机制来动态实现。
设计模式
工厂设计模式
spring使用工厂模式通过BeanFactory、ApplicationContext创建Bean对象
代理设计模式
Spring AOP 功能的实现。
单例设计模式
Spring 中的 Bean 默认都是单例的。
模板方法模式
Spring 中 jdbcTemplate、hibernateTemplate <br>等以 Template 结尾的对数据库操作的类<br>它们就使用到了模板模式。<br>
包装器设计模式
我们的项目需要连接多个数据库,<br>而且不同的客户在每次访问中根据需要会去访问不同的数据库。<br>这种模式让我们可以根据客户的需求能够动态切换不同的数据源。<br>
观察者模式
Spring 事件驱动模型就是观察者模式很经典的一个应用。
适配器模式
Spring AOP 的增强或通知(Advice)使用到了适配器模式、<br>spring MVC 中也是用到了适配器模式适配Controller<br>
事务
事务传播总类
PROPAGATION_REQUIRES_NEW
必须的。说明必须要有事物,没有就新建事物
PROPAGATION_SUPPORTS
支持。说明仅仅是支持事务,没有事务就非事务方式执行
PROPERGATION_MANDATORY
强制的。说明一定要有事务,没有事务就抛出异常
PROPAGATION_REQUIRES_NEW
必须新建事物。如果当前存在事物就挂起。
PROPAGATION_NOT_SUPPORTED
不支持事物,如果存在事物就挂起。
PROPAGATION_NEVER<br>
绝不有事务。如果存在事物就抛出异常
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 条评论
下一页