Skip to content

Commit

Permalink
update article
Browse files Browse the repository at this point in the history
  • Loading branch information
WL2O2O committed Dec 6, 2023
1 parent 96b5de9 commit a1b71cc
Show file tree
Hide file tree
Showing 5 changed files with 391 additions and 4 deletions.
226 changes: 226 additions & 0 deletions src/Java SE.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,226 @@
## Java概述

什么是 Java 语言?

Java 语言的特点?

JVM、JDK、JRE?

## Java基础

1. Java有几种数据类型?分别是哪些?
2. 怎么理解`&``&&`
3. 自增运算是怎么理解的?
```java
int i = 1;
i = i++;
System.out.println(i);
```
## 面向对象

1. 什么是面向对象?有哪些特性?
2. 什么是多态?怎么理解多态?
3. `==``equals`的区别?
4. 重写过`equals``hashcode`吗?为什么要重写?
5. 解释一下深拷贝和浅拷贝。
6. Java创建对象的几种方式?
1. new
2. 反射
3. clone
4. 序列化

## String

1. 说说`String`,是基本数据类型吗?
2. String、StringBuffer、StringBuilder有什么区别?
3. 了解`intern`方法吗?

## Integer

1. String怎么转Integer?原理?
1.

## Object

1. 了解过`Object`类吗?都有什么方法?你怎么理解`finalize`方法?

![](https://cs-wlei224.obs.cn-south-1.myhuaweicloud.com/blog-imgs/202312070047276.png)

2.


## 异常处理

1. Java中的异常体系

![](https://cs-wlei224.obs.cn-south-1.myhuaweicloud.com/blog-imgs/202312070047393.png)

2. 怎么处理异常?
1. 捕获try{}catch{}finalize{}
2. 抛出throw、throws
## I/O



| BIO--Blocking IO | 同步阻塞IO(一个连接一个线程,发起请求一直阻塞,一般通过连接池改善) | ![image.png](https://cs-wlei224.obs.cn-south-1.myhuaweicloud.com/blog-imgs/202312070047025.png) |
|--- | --- | --- |
| NIO--Non-blocking IO | 同步非阻塞IO(多个连接复用一个线程,一个请求一个线程) | ![image.png](https://cs-wlei224.obs.cn-south-1.myhuaweicloud.com/blog-imgs/202312070047309.png) |
| AIO--Asynchronous IO | 异步非阻塞IO(一个有效请求一个线程,IO请求立即返回,操作结束后,回调通知) | ![image.png](https://cs-wlei224.obs.cn-south-1.myhuaweicloud.com/blog-imgs/202312070047677.png) |



1. IO流体系结构

![](https://cs-wlei224.obs.cn-south-1.myhuaweicloud.com/blog-imgs/202312070047942.jpeg)

2. 什么是装饰器模式?
> 我对装饰器的理解就是继承,然后增加新功能,但它们的核心区别在于装饰器模式是通过“添加”新的功能,而不是通过“重写”原有功能来实现扩展的。
在IO流中,这种模式被广泛应用。例如,在java.io包中,InputStream和OutputStream是两个基础的输入输出流类,它们定义了输入输出流的基本行为和接口。然后,有许多其他的类和接口继承自InputStream和OutputStream,并添加了新的功能。这些新类可以看作是装饰器,它们可以增强原有类(被装饰类)的功能。例如,BufferedInputStream和BufferedOutputStream可以在原有类的基础上添加缓冲功能,提高IO性能。
总的来说,装饰器模式是一种灵活且强大的设计模式,它允许我们在运行时动态地添加或删除功能,而无需修改原始的类。这种设计模式提高了代码的复用性和可扩展性。
_**手撸装饰器模式:**_
```java
public interface Printer {
void print();
}

public class StandardPrinter implements Printer {
@Overvide
public void print() {
System.out.println("Standard print!");
}
}

public class ColorPrinter implements Printer {
private Printer printer;

public ColorPrinter(Printer printer){
this.printer = printer;
}

@Overvide
public void print() {
System.out.print("Color print!");
Printer.print();
}
}

public class Main {
public static void main(String[] args) {
Printer sPrinter = new StandardPrinter();
sPrinter = new ColorPrinter(sPrinter);
sPrinter.print();
}
}
```

## 序列化

1. 什么是序列化与反序列化
2. 序列化有哪几种方式?
1. Java对象流序列化

一般会用Java原生IO 进行转化,一般会用ObjectIO

2. JSON序列化

JSON序列化的方式有很多,一般会选择使用`jackson`包中的`ObjectMapper`类来将Java对象转化为byte数组或将json串转化为对象

3. ProtoBuff序列化

是一种轻便高效的结构化数据存储格式,通过其序列化对象可以很大程度的把对象进行压缩,大大减小数据传输大小,提高性能。

## 泛型

1. 什么是泛型?
2. 什么是类型擦除?为什么要擦除?
3. 为什么泛型不可以被重载?

## 注解

1. 什么是注解?注解的生命周期?
2. 说说`@Override``@Autowired`的源码

## 反射

1. 怎么理解反射?

通过new来创建对象就是正射,是在编译时就会确定创建的对象类型;而反射就是动态地获取类信息、构造器进而`newInstance`创建对象的过程。

2. 怎么通过反射来创建一个对象?

无参实例化:`Object obj = Class.forName(类名).getConstructor().newInstance();`
有参实例化:`Object obj = Class.forName(类名).getConstructor(String.class).newInstance("汪汪");`
```java
public class Main {
public static void main(String[] args) {
try {
// 获取Dog类的Class对象
Class<?> dogClass = Class.forName("Dog");

// 获取Dog类的构造器
Constructor<?> dogConstructor = dogClass.getConstructor();

// 通过构造器创建Dog对象
Object dog = dogConstructor.newInstance();

// 如果需要初始化参数,可以使用带有参数的构造函数
Constructor<?> dogConstructorWithParams = dogClass.getConstructor(String.class);
Object dogWithName = dogConstructorWithParams.newInstance("旺财");

} catch (ClassNotFoundException | NoSuchMethodException | IllegalAccessException | InstantiationException | InvocationTargetException e) {
e.printStackTrace();
}
}
}
class Dog {
private String name;

public Dog() {
name = "小黄学长";
}

public Dog(String name) {
this.name = name;
}

public String getName() {
return name;
}
}
```

## 源码

1. 说说你对 HashMap 数据结构的理解?

首先,hashmap 的数据结构是基于数组和链表的,如图:

![img](https://cs-wlei224.obs.cn-south-1.myhuaweicloud.com/blog-imgs/202312070046177.png)

so,既然是基于数组和链表的,那就说明数组和链表的特点也就是 HashMap 的特点:

**数组:寻址快,直接根据索引访问元素,插入和删除慢;**

**链表:寻址慢,需要从头节点开始遍历,插入和删除快。**



说到 HashMap 就要说到 Java 8 了,Java 8 之前,HashMap 使用一个数组加链表的结构来存储 【K,V】 键值对。

如果发生 hash 冲突,那么

这将导致在处理 hash 冲突的时候性能不高,尤其是链表很长的时候。因此,Java 8 中的 HashMap 引入了红黑树来替代链表,这样当链表变长的时候,会自动转换为红黑树,从而提高了增删改查的性能。



2. 什么是 Hash 冲突?怎么解决?
3. 为什么阿里巴巴Java开发者手册中有一条建议是**强制禁止**使用构造方法把 BigDecimal(double) 的方式把 double 的值转化为 BigDecimal 对象?

> 说明:因为会存在精度损失风险,如:BigDecimal(0.1F),实际存储值为0.10000000149,
>
> 正确的方法应该怎么做?
>
> 一:String入参:BigDecimal bd = new BigDecimal("0.1")
>
> 二:使用内部的 valueOf 方法:BigDecimal bd1 = BigDecimal.valueOf(0.1);
163 changes: 163 additions & 0 deletions src/MySQL.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,163 @@
## 基础篇
> ### Q:什么是数据库第一二三范式?
A:

- 第一范式:又称专一范式,字段不能再拆分;
- 第二范式:又称 MySQL 家规,必须完全依赖顺从主键,若有与主键无关字段者,设置为联合主键;
- 第三范式:又称恋爱脑范式,遵守家规,远离小三。

![你的库表设计遵守范式吗?](https://cs-wlei224.obs.cn-south-1.myhuaweicloud.com/blog-imgs/202312070058965.jpeg "你的库表设计遵守范式吗?")
一般来说,“`小企`”这个渣男(也可能不止`小企`)在日常开发中都是违反`范式家规`标准的,要为了性能,通过一些冗余的数据,空间换时间。

> ### Q:MySQL 有几种字段类型?
A:字段类型大致可以分为三类:数值类型、字符类型、时间类型

- 数值类型:
- 整数类型:微小TYNYINT、小SMALLINT、中等MEDIUMINT、INT、大整型BIGINT;
- 小数类型:FLOAT、DUBBLE、DECIMAL、NUMERIC
- 字符类型:(还有好几种)
- CHAR
- VARCHAR
- BINARY
- VARBINARY
- BLOB
- 二进制大对象类型,用于存储二进制数据(如文档、图像、音频等),有两个分支,小TINYBLOB和长LONGBLOB
- TEXT
- 文本类型,不许预设长度,可根据需要动态划分空间。也分为 TINYTEXT 和 LONGTEXT,以适应不同大小的文本数据
- ENUM
- 枚举类型,限制了字段存储的值
- SET
- 集合类型,不可重复
- 日期/时间类型
- DATE
- TIME
- DATETIME
- TIMESTAMP
> ### Q:CHAR 和 VARCHAR 字符类型的区别?
A:

- `char`长度固定,所以存取速度快,甚至快varchar一半;如果长度没有达到预设值,用空格补充。因为定长,所以浪费一些空间,属于空间换时间。最多可存`255`个字符;
- `varchar`字符长度可变,所以不浪费空间,属于时间换空间。最多可存放`65532`个字符串,至于为什么是`65532`,那就需要看相关存储引擎`InnoDB`的知识了。
> ### Q:说一说两个时间类型的区别
A:

- 时间起始范围不同,`TIMESTAMP``1970-2028``datetime``1000-9999`
- 存储空间不同,`TIMESTAMP`存储空间为`4字节``DATETIME`存储空间为`8字节`
- 时区,`TIMESTAMP`存储时间依赖于时区显示,`DATETIME`存储时间与时区无关
- 默认值,`TIMESTAMP`不为空,后者为空
> ### Q:什么类型可以用于存储二进制数据?
A:blob,Blob常常是数据库中用来存储二进制文件的字段类型。通常用于存储大量的数据,例如音频、视频、图片等文件,由于它们的大小,必须使用特殊的方式来处理(例如:上传、下载或者存放到一个数据库)。
> ### Q:怎么存储`emoji`表情?
A:
> ### Q:你了解 SQL 的执行流程吗?
A:为了更加直观,借用`三元表达式`的语法来描述一条 SQL 执行的流程。

1. 首先检查 SQL 是否有执行的权限? 查询结果缓存 :返回报错信息;
2. 是否有缓存? 直接返回结果 :检查 SQL 是否有语法错误;
3. 语法正确? MySQL 的服务器对语句进行优化,确定执行方案 :
4. 确定方案?调用数据库引擎接口,执行方案,返回执行结果。
> ### Q:什么是 DDL 与 DML ?
A:是 DBMS 中的不同类型的语言指令集。

- DDL:database definition language,定义或修改数据库结构的命令,例如:CREAT、ALTER、DROP、TRUNCATE(截断,命令用于快速删除表中的所有数据但不删除表本身。)
- DML:database manipulation language,用于操作数据库中的数据的命令,例如CURD
> ### Q:MySQL 怎么进行优化?
A:

1. **索引优化:**基于最经常查询的字段或数据,合理的进行创建索引。例如一个用户表(id, name, email),其中基于 email 查询的语句很多,所以可以在 email 字段上创建一个索引:`CREATE INDEX idx_email ON user(email);`
2. **查询优化:**尽量避免全表扫描、减少表连接的操作。例如 `SELECT * FROM user WHERE name = '张三' LIMIT 1;`
3. **数据库设计优化:**根据数据访问模式和业务需求设计数据库结构,如何选择合适的数据类型、如何进行数据规范化、什么时候需要反范式设计?

**实际上,一般互联网公司的设计都是反范式的,通过冗余一些数据,避免跨表跨库,利用空间换时间,提高性能。**

4. **分区:**对于大数据量的表,我们可以使用分区技术提高查询效率。分区就是把大表拆分为一个个小表,减少单次查询数据量,提高单次查询的效率 --> 进而提高效率!
5. **硬件和配置优化:**除了 SQL 语句和数据库设计,硬件和 MySQL 的配置也会对性能造成影响。所以我们可以根据服务器的硬件状况和业务需求对MySQL的连接数以及内存使用进行配置。

> ### Q:MySQL 数据类型有哪些?Java 中有哪些字段与之对应?


## 架构篇

首先,收起你自认为架构篇很难理解的想法,我们还是从 MySQL 是一个房子入手。

> Q:你是怎么理解 MySQL 的架构的?
A:MySQL 就相当于一个档案室,存放不同的档案,一个数据库好用,肯定有原因,架构也就是构成。那么一个快递驿站肯定包括下面这三部分:

- 快递驿站APP--客户端(与用户交互的关键)
- 工作人员--存储引擎(我 MySQL 学的不好,我猜应该是与存储规则相关的)
- 快递货架--服务层(堆放数据,索引数据)

{{{{{{待画图!!!}}}}}}
MySQL 逻辑架构图主要分为三层:客户端、存储引擎、服务层

1. 客户端层:这是与 MySQL 服务器交互的接口,它提供了用户与服务器进行通信的手段。客户端层处理连接请求、处理查询请求、认证用户权限以及执行与服务器之间的通信。此外,这一层还负责处理与服务相关的各种任务,例如管理连接、处理错误、诊断和调试等。
2. Server 层:这一层是 MySQL 的核心,它包含了大多数 MySQL 的服务功能。这包括解析查询语句、分析查询计划、优化查询计划以及执行查询计划等。此外,Server 层还负责处理内置函数,如日期、时间、数学和加密函数等。对于跨存储引擎的功能,如存储过程、触发器和视图等,也都在这一层实现。这些功能对于整个数据库系统来说是至关重要的。
3. 存储引擎层:这一层负责数据的存储和提取。存储引擎负责与底层操作系统交互,管理数据的存储位置、文件格式和索引等。不同的存储引擎具有不同的特点和性能,可以根据应用的需求选择适合的存储引擎。MySQL 支持多种存储引擎,如 InnoDB、MyISAM、Memory 等。存储引擎通过 API 与 Server 层进行通信,这些接口屏蔽了不同存储引擎之间的差异,使得上层的应用程序可以透明地访问底层的数据存储方式。

![MySQL 架构图](https://cs-wlei224.obs.cn-south-1.myhuaweicloud.com/blog-imgs/202312070058321.png)

> Q:数据库调优,你是怎么做的
A:以下回答来自文心一言,待优化,回答要结合MySQL的**架构以及存储引擎**来说,以及自己的见解
数据库调优的方法有很多,以下是一些常见的调优方法:

1. 定期优化重建数据库:定期对数据库进行优化和重建,可以消除数据库中的碎片和冗余数据,提高数据库的性能和稳定性。
2. 减少磁盘写入操作:通过使用缓存技术、优化数据插入和更新操作、避免频繁的磁盘操作等手段,可以减少磁盘的写入操作,提高数据库的性能。
3. 合理使用索引:索引是提高查询速度的重要手段,通过添加合适的索引可以加速查询操作。需要根据查询语句和表结构来确定需要添加的索引。
4. 优化SQL语句:通过优化SQL语句,可以减少数据库的负载和提高查询效率。例如,避免使用SELECT * 语句,只查询需要的数据字段;避免在查询中使用复杂的子查询和连接查询等。
5. 调整数据库参数:根据实际需求和性能测试结果,调整数据库的参数可以提高数据库的性能和响应速度。
6. 使用存储过程和触发器:存储过程和触发器可以减少数据库的负载和提高数据处理效率。通过将常用的数据处理逻辑封装到存储过程和触发器中,可以减少对数据库的频繁操作。
7. 数据库分区:对于大型数据库,可以采用分区技术将数据分散到不同的磁盘上,提高I/O处理能力和并发性能。
8. 使用RAID技术:RAID技术可以提供高性能、高可靠性和高容错的存储系统,通过将数据分散到多个磁盘上,可以提高I/O处理能力和数据安全性。
9. 使用缓存技术:缓存技术可以减少磁盘访问次数和提高数据处理速度。例如,使用内存缓存来存储经常访问的数据,减少对磁盘的访问次数。
10. 定期备份数据:定期备份数据可以防止数据丢失和灾难性故障,同时也可以提高数据处理效率和安全性。

这些方法可以根据实际情况选择使用,但需要注意的是,数据库调优是一个复杂的过程,需要综合考虑系统硬件、应用程序和数据等方面的因素。因此,在进行数据库调优时,建议根据实际情况进行测试和评估,以确保达到最佳的效果。

> Q:你知道三种存储引擎的区别吗?
A:

| 功能 | MlSAM | MEMORY | InnoDB |
| ------------ | ----- | ------ | ------ |
| 存储限制 | 256TB | RAM | 64TB |
| 支持事务 | No | No | Yes |
| 支持全文索引 | Yes | No | Yes |
| 支持树索引 | Yes | Yes | Yes |
| 支持哈希索引 | No | Yes | Yes |
| 支持数据缓存 | No | N/A | Yes |
| 支持外键 | No | No | Yes |

怎么选择存储引擎的使用?

1. 想用事务安全,并要求实现并发控制,用InnoDB
2. 主要用来查询与插入记录,用MyISAM
3. 临时存放数据,不考虑安全,用MEMORY

**tips:存储引擎是基于数据表**的,所以一个数据库的多个表**可以根据实际业务**,来**使用不同的存储引擎**,以此**提高**整个数据库的**性能**

| 区别 | MyISAM | InnoDB |
| ------------------ | ------------------------------------------------------------ | -------------------------------- |
| 存储结构 | 每个表存储成3个文件: | |
| 表定义文件(.frm) | | |
| 数据文件(.MYD) | | |
| 索引文件(.MYI) | 所有表存放于同一数据文件,也可能多个文件或者独立的表空间文件,表的大小一般为2G | |
| 事务 | 不支持 | 支持 |
| 最小锁粒度 | 表级锁,更新会锁表,导致其他查询与插入阻塞 | 行级锁 |
| 索引类型 | 非聚簇索引,B树 | 聚簇索引,B+树 |
| 主键 | 可无 | 如未设置,自动生成(用户不可见) |
| 外键 | 不支持 | 支持 |
| 表行数 | 存有缓存,直接取出 | 需要遍历整个表 |

_🆗架构篇就到这里,有没发现,似乎MySQL的基础架构也就这回事,也没啥难点。最后强调一点,当我们试图学会一门知识的时候,不要机械记忆,重要的是融会贯通(内心OS:啥子贯通?不就是理论翻译成人话吗?),找到适合自己记忆的方法。_
Loading

0 comments on commit a1b71cc

Please sign in to comment.