add logseq-java

This commit is contained in:
Lostecho
2024-02-02 00:12:49 +08:00
parent 1cd5bb460f
commit c7947017c3
875 changed files with 57100 additions and 0 deletions

View File

@@ -0,0 +1,9 @@
- Application Programming Interface
- 应用编程接口
- 在Java中提供了大量的类接口函数等一系列基础工具
- 目的
- 简化程序员开发
- JDK1.8 API文档
- [JDK1.8.CHM](../assets/JDK1.8_1649904511236_0.CHM)
-
-

View File

@@ -0,0 +1,14 @@
- Java中所有[[类]]都是Class类型的[[对象]]
- 类加载器负责加载所有的类,class字节码文载入到内存中载入到内存的类[[JVM]]会创建一个Java.lang.Class对象
- 通过该class对象可以访问该类的所有方法
- 获取该类的class对象
- 1. 访问类的class属性
2. 调用对象的getClass()方法
先new
3. 通过类的全限定名字符串加载
- java.lang.reflect包
- 通过[[反射]]调用该类的构造方法
- 通过getConstructor()
- 1. 获取该类的Class对象
2. getConstructor()获取构造器
3. 通过newInstance() 新建对象

View File

@@ -0,0 +1,17 @@
- Java中所有[[类]]都是Class类型的[[对象]]
- 类加载器负责加载所有的类,class字节码文载入到内存中载入到内存的类[[JVM]]会创建一个Java.lang.Class对象
- 通过该class对象可以访问该类的所有方法
- 获取该类的class对象
- 1. 访问类的class属性
2. 调用对象的getClass()方法
先new一个对象再使用
3. 通过类的全限定名字符串加载
- java.lang.reflect包
- 通过[[反射]]调用该类的构造方法
- 通过getConstructor()
- 1. 获取该类的Class对象
2. getConstructor()获取构造器
3. 通过newInstance() 新建对象
- getConstructors()
- 获取所有构造器
- getDeclaredConstructor()

View File

@@ -0,0 +1,21 @@
- 重要程度:中
- 目标
- 掌握常用的DOS命令
- window快捷键
- ### DOS命令
- DOS窗口
- win+R --> CMD
- [[cd命令]]
- 进入到某一个目录
- [[dir命令]]
- 列出所有文件及子目录
- 跳转盘符 d:
- 跳转到其它磁盘
- [[cls清屏]]
- 清空屏幕
- [[ping测试]]
- 测试网络是否连通
- [[ipconfig]]
- 获得本机的ip地址信息
- [[exit]]
- 退出DOS窗口

View File

@@ -0,0 +1,21 @@
- 重要程度:中
- 目标
- 掌握常用的DOS命令
- window快捷键
- ### DOS命令
- DOS窗口
- win+R --> CMD
- [[cd命令]]
- 进入到某一个目录
- [[dir命令]]
- 列出所有文件及子目录
- 跳转盘符 d:
- 跳转到其它磁盘
- [[cls清屏]]
- 清空屏幕
- [[ping测试]]
- 测试网络是否连通
- [[ipconfig]]
- 获得本机的ip地址信息
- [[exit]]
- 退出DOS窗口

View File

@@ -0,0 +1,21 @@
- 重要程度:中
- 目标
- 掌握常用的DOS命令
- window快捷键
- ### DOS命令
- DOS窗口
- win+R --> CMD
- [[cd命令]]
- 进入到某一个目录
- [[dir命令]]
- 列出所有文件及子目录
- 跳转盘符 d:
- 跳转到其它磁盘
- [[cls清屏]]
- 清空屏幕
- [[ping测试]]
- 测试网络是否连通
- [[ipconfig]]
- 获得本机的ip地址信息
- [[exit]]
- 退出DOS窗口

View File

@@ -0,0 +1 @@
- id:: 6241c20a-25e8-4aa6-85a3-502943039b86

View File

@@ -0,0 +1,46 @@
- Ctrl+S 保存
- Ctrl+Y 回撤
- Ctrl+Z 撤销
- Ctrl+D 删除一行
- Ctrl+X 剪切
- Ctrl+V 粘贴
- Ctrl+C 复制
- 快捷键
- 1. 新建项目
2. 输入项目名称
3. 项目结构
4. 新建java程序
5. Package位置输入包名
6. 右侧代码编辑区域写代码
7. 点击工具运行按钮
8. 点击下方Console界面查看结果
- 使用Eclipse新建项目完成HelloWorld
- 修改默认编码模式
- 改变默认字体大小
- 初始设置
- 界面
- 打开
- Eclipse基本介绍
collapsed:: true
- 打开
- 界面
- 初始设置
- 改变默认字体大小
- 修改默认编码模式
- 使用Eclipse新建项目完成HelloWorld
- 1. 新建项目
2. 输入项目名称
3. 项目结构
4. 新建java程序
5. Package位置输入包名
6. 右侧代码编辑区域写代码
7. 点击工具运行按钮
8. 点击下方Console界面查看结果
- 快捷键
- Ctrl+C 复制
- Ctrl+V 粘贴
- Ctrl+X 剪切
- Ctrl+D 删除一行
- Ctrl+Z 撤销
- Ctrl+Y 回撤
- Ctrl+S 保存

View File

@@ -0,0 +1 @@
- HyperText Mark Language

View File

@@ -0,0 +1,14 @@
- HyperText Markup Language
- 结构
- 声明`<DOCTYPE html>`
- 完整HTML页面`<html>`
- 头部`<head>`
- 页面内容<body>
- 标题
- 通过<h1> - <h6>定义
- 段落
- 通过<p>标签定义
- 链接
- 通过<a>标签定义
- 图像
- 通过<img>标签

View File

@@ -0,0 +1,49 @@
- 重要程度:中
- 课程目标
- 掌握Java程序执行步骤
- 了解Java类的结构
- ### 执行步骤
- Hello代码
```java
public class HelloWorld{
public static void main(String[] args) {
System.out.println("Hello World");
}
}
```
- 编译步骤
- > 编译:相当于英文书籍的中文翻译,一定会出来一个新的文件
- > 解释:国家领导人参与国际会议,戴的同声传译
- Java是一种半编译,半解释性语言
- 字节码信息,配合JVM虚拟机,就可以做到跨平台
- Java源代码文件基本结构
- Java程序依靠类来组织自己的代码
- [[类class]]
- **类的类名要跟源代码的文件名保持一致**
- ```java
public class 类的类名{
/*
Java程序中主函数/主入口
一个程序要跑起来,一定要有一个主入口
主函数的结构是固定的
*/
public static void main(String[] arg){
//其它代码
}
}
```
- 比如
- ```java
public class SelfIntroduce{
public static void main(String[] args){
System.out.println("My name is ***")
}
}
```
- **SelfIntroduce** 类名,和文件名保持一致
- **main** 函数方法
- **System.out.println("")** 程序输出方

View File

@@ -0,0 +1 @@
- [[IDE]]全称Integrated Development Environment(集成开发环境),是用于卡法

View File

@@ -0,0 +1,7 @@
- [[IDE]]全称Integrated Development Environment(集成开发环境),是用于开发程序的软件
- 常见IDE
- **[[Eclipse]]**
- Myeclipes
- STS
- VS
- **[[]]IEDA**

View File

@@ -0,0 +1,8 @@
- [[IDE]]全称Integrated Development Environment(集成开发环境),是用于开发程序的软件
- 常见IDE
- **[[Eclipse]]**
- Myeclipes
- STS
- VS
- **[[IEDA]]**
-

View File

@@ -0,0 +1,14 @@
- [[IDE]]全称Integrated Development Environment(集成开发环境),是用于开发程序的软件
- 常见IDE
- **[[Eclipse]]**
- Myeclipes
- STS
- VS
- **[[IEDA]]**
- Eclipse基本介绍
- 打开
- 界面
- 初始设置
- 改变默认字体大小
- 修改默认编码模式
-

View File

@@ -0,0 +1,23 @@
- [[IDE]]全称Integrated Development Environment(集成开发环境),是用于开发程序的软件
- 常见IDE
- **[[Eclipse]]**
- Myeclipes
- STS
- VS
- **[[IEDA]]**
- Eclipse基本介绍
- 打开
- 界面
- 初始设置
- 改变默认字体大小
- 修改默认编码模式
- 使用Eclipse新建项目完成HelloWorld
- 1. 新建项目
2. 输入项目名称
3. 项目结构
4. 新建java程序
5. Package位置输入包名
6. 右侧代码编辑区域写代码
7. 点击工具运行按钮
8. 点击下方Console界面查看结果
- 查看

View File

@@ -0,0 +1,31 @@
- [[IDE]]全称Integrated Development Environment(集成开发环境),是用于开发程序的软件
- 常见IDE
- **[[Eclipse]]**
- Myeclipes
- STS
- VS
- **[[IEDA]]**
- Eclipse基本介绍
- 打开
- 界面
- 初始设置
- 改变默认字体大小
- 修改默认编码模式
- 使用Eclipse新建项目完成HelloWorld
- 1. 新建项目
2. 输入项目名称
3. 项目结构
4. 新建java程序
5. Package位置输入包名
6. 右侧代码编辑区域写代码
7. 点击工具运行按钮
8. 点击下方Console界面查看结果
- 快捷键
- Ctrl+C 复制
- Ctrl+V 粘贴
- Ctrl+X 剪切
- Ctrl+D 删除一行
- Ctrl+Z 撤销
- Ctrl+Y 回撤
- Ctrl+S 保存
-

View File

@@ -0,0 +1,31 @@
- [[IDE]]全称Integrated Development Environment(集成开发环境),是用于开发程序的软件
- 常见IDE
- **[[Eclipse]]**
- Myeclipes
- STS
- VS
- **[[IEDA]]**
- Eclipse基本介绍
- 打开
- 界面
- 初始设置
- 改变默认字体大小
- 修改默认编码模式
- 使用Eclipse新建项目完成HelloWorld
- 1. 新建项目
2. 输入项目名称
3. 项目结构
4. 新建java程序
5. Package位置输入包名
6. 右侧代码编辑区域写代码
7. 点击工具运行按钮
8. 点击下方Console界面查看结果
- 快捷键
- Ctrl+C 复制
- Ctrl+V 粘贴
- Ctrl+X 剪切
- Ctrl+D 删除一行
- Ctrl+Z 撤销
- Ctrl+Y 回撤
- Ctrl+S 保存
-

View File

@@ -0,0 +1,31 @@
- [[IDE]]全称Integrated Development Environment(集成开发环境),是用于开发程序的软件
- 常见IDE
- **[[Eclipse]]**
- Myeclipes
- STS
- VS
- **[[IEDA]]**
- Eclipse基本介绍
- 打开
- 界面
- 初始设置
- 改变默认字体大小
- 修改默认编码模式
- 使用Eclipse新建项目完成HelloWorld
- 1. 新建项目
2. 输入项目名称
3. 项目结构
4. 新建java程序
5. Package位置输入包名
6. 右侧代码编辑区域写代码
7. 点击工具运行按钮
8. 点击下方Console界面查看结果
- 快捷键
- Ctrl+C 复制
- Ctrl+V 粘贴
- Ctrl+X 剪切
- Ctrl+D 删除一行
- Ctrl+Z 撤销
- Ctrl+Y 回撤
- Ctrl+S 保存
- [[java程序注释]]

View File

@@ -0,0 +1,31 @@
- [[IDE]]全称Integrated Development Environment(集成开发环境),是用于开发程序的软件
- 常见IDE
- **[[Eclipse]]**
- Myeclipes
- STS
- VS
- **[[IEDA]]**
- Eclipse基本介绍
- 打开
- 界面
- 初始设置
- 改变默认字体大小
- 修改默认编码模式
- 使用Eclipse新建项目完成HelloWorld
- 1. 新建项目
2. 输入项目名称
3. 项目结构
4. 新建java程序
5. Package位置输入包名
6. 右侧代码编辑区域写代码
7. 点击工具运行按钮
8. 点击下方Console界面查看结果
- 快捷键
- Ctrl+C 复制
- Ctrl+V 粘贴
- Ctrl+X 剪切
- Ctrl+D 删除一行
- Ctrl+Z 撤销
- Ctrl+Y 回撤
- Ctrl+S 保存
- [[Java程序注释]]

View File

@@ -0,0 +1,8 @@
- [[IDE]]全称Integrated Development Environment(集成开发环境),是用于开发程序的软件
- 常见IDE
- **[[Eclipse]]**
- Myeclipes
- STS
- VS
- **[[IEDA]]**
- [[Java程序注释]]

View File

@@ -0,0 +1,31 @@
- [[IDE]]全称Integrated Development Environment(集成开发环境),是用于开发程序的软件
- 常见IDE
- **[[Eclipse]]**
- Myeclipes
- STS
- VS
- **[[IEDA]]**
- Eclipse基本介绍
- 打开
- 界面
- 初始设置
- 改变默认字体大小
- 修改默认编码模式
- 使用Eclipse新建项目完成HelloWorld
- 1. 新建项目
2. 输入项目名称
3. 项目结构
4. 新建java程序
5. Package位置输入包名
6. 右侧代码编辑区域写代码
7. 点击工具运行按钮
8. 点击下方Console界面查看结果
- 快捷键
- Ctrl+C 复制
- Ctrl+V 粘贴
- Ctrl+X 剪切
- Ctrl+D 删除一行
- Ctrl+Z 撤销
- Ctrl+Y 回撤
- Ctrl+S 保存
- [][java程序注释]

View File

@@ -0,0 +1,32 @@
- [[IDE]]全称Integrated Development Environment(集成开发环境),是用于开发程序的软件
- 常见IDE
- **[[Eclipse]]**
- Myeclipes
- STS
- VS
- **[[IEDA]]**
- Eclipse基本介绍
collapsed:: true
- 打开
- 界面
- 初始设置
- 改变默认字体大小
- 修改默认编码模式
- 使用Eclipse新建项目完成HelloWorld
- 1. 新建项目
2. 输入项目名称
3. 项目结构
4. 新建java程序
5. Package位置输入包名
6. 右侧代码编辑区域写代码
7. 点击工具运行按钮
8. 点击下方Console界面查看结果
- 快捷键
- Ctrl+C 复制
- Ctrl+V 粘贴
- Ctrl+X 剪切
- Ctrl+D 删除一行
- Ctrl+Z 撤销
- Ctrl+Y 回撤
- Ctrl+S 保存
- [[Java程序注释]]

View File

@@ -0,0 +1,32 @@
- [[IDE]]全称Integrated Development Environment(集成开发环境),是用于开发程序的软件
- 常见IDE
collapsed:: true
- **[[Eclipse]]**
- Myeclipes
- STS
- VS
- **[[IEDA]]**
- Eclipse基本介绍
- 打开
- 界面
- 初始设置
- 改变默认字体大小
- 修改默认编码模式
- 使用Eclipse新建项目完成HelloWorld
- 1. 新建项目
2. 输入项目名称
3. 项目结构
4. 新建java程序
5. Package位置输入包名
6. 右侧代码编辑区域写代码
7. 点击工具运行按钮
8. 点击下方Console界面查看结果
- 快捷键
- Ctrl+C 复制
- Ctrl+V 粘贴
- Ctrl+X 剪切
- Ctrl+D 删除一行
- Ctrl+Z 撤销
- Ctrl+Y 回撤
- Ctrl+S 保存
- [[Java程序注释]]

View File

@@ -0,0 +1,9 @@
- [[IDE]]全称Integrated Development Environment(集成开发环境),是用于开发程序的软件
- 常见IDE
collapsed:: true
- **[[Eclipse]]**
- Myeclipes
- STS
- VS
- **[[IEDA]]**
- [[Java程序注释]]

View File

@@ -0,0 +1,33 @@
- [[IDE]]全称Integrated Development Environment(集成开发环境),是用于开发程序的软件
- 常见IDE
collapsed:: true
- **[[Eclipse]]**
- Myeclipes
- STS
- VS
- **[[IEDA]]**
- Eclipse基本介绍
collapsed:: true
- 打开
- 界面
- 初始设置
- 改变默认字体大小
- 修改默认编码模式
- 使用Eclipse新建项目完成HelloWorld
- 1. 新建项目
2. 输入项目名称
3. 项目结构
4. 新建java程序
5. Package位置输入包名
6. 右侧代码编辑区域写代码
7. 点击工具运行按钮
8. 点击下方Console界面查看结果
- 快捷键
- Ctrl+C 复制
- Ctrl+V 粘贴
- Ctrl+X 剪切
- Ctrl+D 删除一行
- Ctrl+Z 撤销
- Ctrl+Y 回撤
- Ctrl+S 保存
- [[Java程序注释]]

View File

@@ -0,0 +1,32 @@
- [[IDE]]全称Integrated Development Environment(集成开发环境),是用于开发程序的软件
- 常见IDE
- **[[Eclipse]]**
- Myeclipes
- STS
- VS
- **[[IEDA]]**
- Eclipse基本介绍
collapsed:: true
- 打开
- 界面
- 初始设置
- 改变默认字体大小
- 修改默认编码模式
- 使用Eclipse新建项目完成HelloWorld
- 1. 新建项目
2. 输入项目名称
3. 项目结构
4. 新建java程序
5. Package位置输入包名
6. 右侧代码编辑区域写代码
7. 点击工具运行按钮
8. 点击下方Console界面查看结果
- 快捷键
- Ctrl+C 复制
- Ctrl+V 粘贴
- Ctrl+X 剪切
- Ctrl+D 删除一行
- Ctrl+Z 撤销
- Ctrl+Y 回撤
- Ctrl+S 保存
- [[Java程序注释]]

View File

@@ -0,0 +1,31 @@
- [[IDE]]全称Integrated Development Environment(集成开发环境),是用于开发程序的软件
- 常见IDE
- **[[Eclipse]]**
- Myeclipes
- STS
- VS
- **[[IEDA]]**
- Eclipse基本介绍
- 打开
- 界面
- 初始设置
- 改变默认字体大小
- 修改默认编码模式
- 使用Eclipse新建项目完成HelloWorld
- 1. 新建项目
2. 输入项目名称
3. 项目结构
4. 新建java程序
5. Package位置输入包名
6. 右侧代码编辑区域写代码
7. 点击工具运行按钮
8. 点击下方Console界面查看结果
- 快捷键
- Ctrl+C 复制
- Ctrl+V 粘贴
- Ctrl+X 剪切
- Ctrl+D 删除一行
- Ctrl+Z 撤销
- Ctrl+Y 回撤
- Ctrl+S 保存
- [[Java程序注释]]

View File

@@ -0,0 +1,28 @@
- [[IDE]]全称Integrated Development Environment(集成开发环境),是用于开发程序的软件
- 常见IDE
- **[[Eclipse]]**
- Myeclipes
- STS
- VS
- **[[IEDA]]**
- Eclipse基本介绍
- 打开
- 界面
- 初始设置
- 改变默认字体大小
- 修改默认编码模式
- 使用Eclipse新建项目完成HelloWorld
- 1. 新建项目
2. 输入项目名称
3. 项目结构
4. 新建java程序
5. Package位置输入包名
6. 右侧代码编辑区域写代码
7. 点击工具运行按钮
8. 点击下方Console界面查看结果
- 快捷键
- Ctrl+C 复制
- Ctrl+V 粘贴
- Ctrl+X 剪切
- Ctrl+D 删除一行
- [[Java程序注释]]

View File

@@ -0,0 +1,23 @@
- [[IDE]]全称Integrated Development Environment(集成开发环境),是用于开发程序的软件
- 常见IDE
- **[[Eclipse]]**
- Myeclipes
- STS
- VS
- **[[IEDA]]**
- Eclipse基本介绍
- 打开
- 界面
- 初始设置
- 改变默认字体大小
- 修改默认编码模式
- 使用Eclipse新建项目完成HelloWorld
- 1. 新建项目
2. 输入项目名称
3. 项目结构
4. 新建java程序
5. Package位置输入包名
6. 右侧代码编辑区域写代码
7. 点击工具运行按钮
8. 点击下方Console界面查看结果
- [[Java程序注释]]

View File

@@ -0,0 +1,8 @@
- [[IDE]]全称Integrated Development Environment(集成开发环境),是用于开发程序的软件
- 常见IDE
- **[[Eclipse]]**
- Myeclipes
- STS
- VS
- **[[IEDA]]**使用最多,太方便,集成大多插件
- [[Java程序注释]]#程序/注释

View File

@@ -0,0 +1,8 @@
- [[IDE]]全称Integrated Development Environment(集成开发环境),是用于开发程序的软件
- 常见IDE
- **[[Eclipse]]**
- Myeclipes
- STS
- VS
- **[[IEDA]]**
- [[Java程序注释]]#程序/注释

View File

@@ -0,0 +1,42 @@
- 重要程度:高
- 课程目标
- 掌握如何安装JDK
- 掌握如何配置环境变量
- 安装JDK
- [下载地址](https://www.oracle.com/java/technologies/downloads/)JDK8
- 检测java是否安装完成
```
java -version
```
- 编写HelloWorld #HelloWorld
- ```java
public class HelloWorld{
public static void main(String[] args) {
System.out.println("Hello World");
}
}
```
- 编译运行
```
javac HelloWorld.java
java HelloWorld
```
- 如果编译遇到问题
- 修改编译命令为
```
javac -encoding utf-8 HelloWorld.java
```
- 配置环境变量
- [[cd命令]]系统命令,任何目录都可运行
- java提升为系统级命令后也可以在任何目录运行
- 变量配置
- JAVA_HOME:jiava安装目录
- JAVA_HOME
C:\\Program Files\\java\\jre...
- Path:Java的命令执行目录
- Path
%JAVA_HOME%\\bin
- Classpath:配置class字节码文件所在位置
- CLASSPATH
.
-

View File

@@ -0,0 +1,53 @@
- 课程目标:
- 了解Java起源
- 了解Java发展历程
- 掌握Java的技术特点和对应的组成结构
- Java起源
- Java是一种高级编程语言
- 1991起源SUN Green小组开发Star 7项目[整合了C++ Lisp SmallTalk](智能家居)
- 1992开发后没市场
- 1993团队面临解散决定Java去走互联网
- 早期叫Oak橡树据说Java之父手詹姆斯·高斯林上爪哇的咖啡
- Java的发展史
- 95/5/23java正式诞生
- 96/1/23JDK1.0
- 97/2/18JDK1.1,此时算是最初级的版本
- 98/12/8JDK1.2milestone version
- 更名为Java2.0
- 确定Java未来的走向
- 1. **J2SE**标准开发桌面应用EclipseIDEA
2. **J2ME**微型手机嵌入式程序Nokia
3. **J2EE**(企业),开发企业级,互联网应用
- 04/10JDK1.5 another milestone
- 1. Java更名Java5.0
2. 提供了注解,枚举,多线程等一系列的新功能或优化功能
- J2SE-->Java SE
J2ME-->Java ME
J2EE-->Java EE
- 2010/4/20SUN被Orcale收购
- 目前最新Java18JDK18
- Java技术组成
- 1. Java编程语言
- 特点
- 1. 简单性:
- 抛弃C语言头文件结构体联合体指针等一系列非常复杂的内容
- 前辈多,现任广
- 2. 结构中立:
- Java语言在项目开发中可以和其他任何语言共存
- 3. 面向对象
- 4. 支持分布式
- 5. 跨平台:
- 一次编写,处处运行
- 6. 高性能
- 7. 多线程
- 8. 健壮性,安全性
- 2.Java平台
- JDK
- Java Development KitJava开发工具包
- JRE+[[API]]工具
- JRE
- Java Runtime EnvironmentJava运行环境
- JVM+核心库类
- JVM
- Java Virtual MachineJava虚拟机
- Java虚拟机出现目的跨平台

View File

@@ -0,0 +1,14 @@
- 单行注释
- ```java
public class dnahangzhushi {
public static void mian(String[] args) {
//这是一段输出语句
System.out.println("Hello World")
}
}
```
- 多行注释
- ```java
Public
```
- 文档注释

View File

@@ -0,0 +1,16 @@
- 单行注释
- ```java
public class dnahangzhushi {
public static void mian(String[] args) {
//这是一段输出语句
System.out.println("Hello World")
}
}
```
- 多行注释
- ```java
public class duohangzhushi {
public static void main(String[] args)
}
```
- 文档注释

View File

@@ -0,0 +1 @@
- Java程序不是运行在系统上,二十运行在

View File

@@ -0,0 +1,13 @@
- > Java程序不是运行在系统上,而是运行在了虚拟机上,Java开发团队针对每一种不同的系统开发了不同的虚拟机
- ## Java的跨平台 #JVM
- 一次编写,处处运行
- 一般在Windows上开发代码,而在Linux/Unix操作系统上运行
- 如何做到
- 通过JVM做到
- JVM特点
- 不同操作系统对应不同JVM
- ## JVM内部执行
- [[JIT编译器]]
-
- 小结
- 不同操作系统,对应不同JVM做到跨平台

View File

@@ -0,0 +1,13 @@
- Object类
- 是所有Java类的超类基类父类以及所有的类都有Object的方法
- [[toString]]
- 打印对象内存地址
- ((62564ae5-f389-453b-b790-5c15d527aacf))
- [[equals]]
- 比较两个对象是否是同一个对象
- ==在比较[[基本数据类型]]时是比较值 #关系运算符
比较 [[引用数据类型]]时是比较地址
- ==与equals的区别 #Java面试
- equals()通常比较对象的内容
- [[finalize()]] #Java面试
- 该方法是JVM销毁对象的方法程序员不需要调用

View File

@@ -0,0 +1,166 @@
- 一个key-value存储系统是跨平台的[[非关系型数据库]]
- NOSQL
- Not Only SQL
- 一个系统不应该仅仅关注数据间关系,还应关注数据的存储
- 所有非关系数据库都是 [[关系型数据库]]的补充
- 特性
collapsed:: true
- 性能高(读的速度是 110000 次/s写的速度是 81000 次/s),且提供持久化操作
- 结构简单数据类型丰富value可以是 字符串(String), 哈希(Map), 列表(list), 集合(sets) 和 有序集合(sorted sets)等类型。
- 采用单线程,保证所有命令操作的原子性
- 支持数据热备(Master slave模式),支持哨兵模式,主动切换主从模式
- ![image.png](../assets/image_1657074990771_0.png)
- ![image.png](../assets/image_1657075023820_0.png)
- ![image.png](../assets/image_1657075044901_0.png)
- 在**主从复制的基础**上,哨兵实现了**自动化故障恢复**。如上图所示,哨兵模式由两部分组成,哨兵节点和数据节点:
- 哨兵节点:哨兵节点是特殊的 Redis 节点,不存储数据;
- 数据节点:主节点和从节点都是数据节点。
- Redis Sentinel 是分布式系统中监控 Redis 主从服务器,并提供主服务器下线时自动故障转移功能的模式。其中三个特性为:
- 监控(Monitoring)Sentinel 会不断地检查你的主服务器和从服务器是否运作正常;
- 提醒(Notification):当被监控的某个 Redis 服务器出现问题时, Sentinel 可以通过 API 向管理员或者其他应用程序发送通知;
- 自动故障迁移(Automatic failover):当一个主服务器不能正常工作时, Sentinel 会开始一次自动故障迁移操作。
- 支持集群
- ![image.png](../assets/image_1657075213351_0.png)
- 使用场景
collapsed:: true
- 应用程序的状态服务器
- 记录某人的登录状态
- 高热点数据的缓存服务器
- 购物网站的分类列表
- 微博热搜
- 系统分析后的存储服务器
- 数据报表
- 排行榜
- 好友关系
- 利用集合求并集,交集 --> 共同好友
- 电商系统秒杀,抢优惠券前数据预热
- 社交系统点赞
- 模拟队列模式FIFO(List特性)
- MQ服务器
- 不适用
- 数据量过大
- 内存限制
- 访问频率低
- 架构
- 基础命令
collapsed:: true
- String
- 存储简单数据最大512M
- Hash
- 一组K-V结构数据
- 存储对象,最大
- List
- 双向链表
- Set
- 无序,不能存储重复元素
- 求交并差
- ZSet
- 有序集合,使用分数排序
- 排行榜单
- [[Spring]]集成Redis
collapsed:: true
- [[Spring Data Redis]]
- 1. 导入依赖
- ```xml
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
```
- 2. 修改xml配置
- ```yml
spring:
redis:
host: 127.0.0.1
jedis:
pool:
max-active: 10 #最大连接数10 默认8
max-wait: 2000ms # 2S未连接抛出异常 -1永不超时
min-idle: 0 #最小连接空闲数
max-idle: 5 #最大连接空闲数量
```
- 3. 设置配置类
- ```java
package com.woniuxy.community.configure;
import com.fasterxml.jackson.annotation.JsonAutoDetect;
import com.fasterxml.jackson.annotation.PropertyAccessor;
import com.fasterxml.jackson.databind.ObjectMapper;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Scope;
import org.springframework.data.redis.connection.RedisConnectionFactory;
import org.springframework.data.redis.core.*;
import org.springframework.data.redis.serializer.Jackson2JsonRedisSerializer;
import org.springframework.data.redis.serializer.StringRedisSerializer;
/**
* redis配置类
*/
@Configuration
public class RedisConfig {
@Autowired
RedisConnectionFactory redisConnectionFactory;
/**
* 向Spring容器装配一个组件
* 组件的ID是redisTemplate
* @Scope 设定组件在容器内部的作用域
* singleton 单实例(默认)
* prototype 原型(克隆)
* request 跟HttpRequest有关
* session 跟HttpSession有关
* application 跟ServletContext有关
* @return
*/
@Bean
@Scope("singleton")
public RedisTemplate<String,Object> redisTemplate(){
RedisTemplate<String,Object> redisTemplate = new RedisTemplate<>();
// 配置连接工厂
redisTemplate.setConnectionFactory(redisConnectionFactory);
// 针对key序列化
StringRedisSerializer stringRedisSerializer = new StringRedisSerializer();
redisTemplate.setKeySerializer(stringRedisSerializer);
redisTemplate.setHashKeySerializer(stringRedisSerializer);
// 针对value序列化
Jackson2JsonRedisSerializer jsonRedisSerializer = new Jackson2JsonRedisSerializer(Object.class);
ObjectMapper objectMapper = new ObjectMapper();
// 设定控制访问修饰符Jackson工具可以操作Value对象的所有属性
objectMapper.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY);
jsonRedisSerializer.setObjectMapper(objectMapper);
redisTemplate.setValueSerializer(jsonRedisSerializer);
redisTemplate.setHashValueSerializer(jsonRedisSerializer);
// RedisTemplate在属性设置之后使用
redisTemplate.afterPropertiesSet();
return redisTemplate;
}
@Bean
public ValueOperations<String,Object> valueOperations(){
return redisTemplate().opsForValue();
}
@Bean
public ListOperations<String,Object> ListOperations(){
return redisTemplate().opsForList();
}
@Bean
public SetOperations<String,Object> SetOperations(){
return redisTemplate().opsForSet();
}
@Bean
public ZSetOperations<String,Object> ZSetOperations(){
return redisTemplate().opsForZSet();
}
@Bean
public HashOperations<String,String,Object> HashOperations(){
return redisTemplate().opsForHash();
}
}
```

View File

@@ -0,0 +1 @@
- 套接字变成

View File

@@ -0,0 +1,11 @@
- {{video https://www.bilibili.com/video/BV1rb4y147F2?p=2}}
- UserService类->无参构造方法->对象->依赖注入->初始化前->初始化->初始化后->放入单例池Map->Bean
- 通过@Autowired进行依赖注入
判断属性上是否有@Autowired注解
- 初始化前要通过@PostConstruct注解来执行一个方法
判断方法上是否有@PostConstruct注解
- 初始化通过实现InitializingBean接口的afterPropertiesSet方法
通过InstanceOf来判断是否实现了这个接口
- 初始化AOP后置处理器
-
-

View File

@@ -0,0 +1,3 @@
- Uniform Resource Locator
- [统一资源定位符](https://zh.wikipedia.org/wiki/%E7%BB%9F%E4%B8%80%E8%B5%84%E6%BA%90%E5%AE%9A%E4%BD%8D%E7%AC%A6)
- [[协议]]//[[域名]]或[[IP]]地址:

View File

@@ -0,0 +1,8 @@
- 修饰类,方法,变量
- 修饰类
- 表示是一个最终类,该类不能被继承
- 修饰方法
- 表示该方法子类重写
- 修饰变量
- [[自定义常量]]
- [[常量]]可以解决代码中魔法值的问题

View File

@@ -0,0 +1,2 @@
- ![广州-唯品会-Java大数据开发工程师.pdf](../assets/广州-唯品会-Java大数据开发工程师_1650621173957_0.pdf)
- ![北京-百度-Java中级.pdf](../assets/北京-百度-Java中级_1650621193617_0.pdf)

View File

@@ -0,0 +1,18 @@
- ![北京-百度-Java中级.pdf](../assets/北京-百度-Java中级_1650621203546_0.pdf)
- ![北京-京东-Java中级.pdf](../assets/北京-京东-Java中级_1650621217355_0.pdf)
- ![广州-唯品会-Java大数据开发工程师.pdf](../assets/广州-唯品会-Java大数据开发工程师_1650621223110_0.pdf)
- ![杭州-阿里云-实习.pdf](../assets/杭州-阿里云-实习_1650621239443_0.pdf)
- ![杭州-蚂蚁金服-Java高级.pdf](../assets/杭州-蚂蚁金服-Java高级_1650621243356_0.pdf)
- ![杭州-蚂蚁金服-资深工程师.pdf](../assets/杭州-蚂蚁金服-资深工程师_1650621246822_0.pdf)
- ![南京-软通动力-Java中级.pdf](../assets/南京-软通动力-Java中级_1650621249683_0.pdf)
- ![厦门-中软国际-Java中级.pdf](../assets/厦门-中软国际-Java中级_1650621252613_0.pdf)
- ![上海-拼多多-Java高级.pdf](../assets/上海-拼多多-Java高级_1650621255476_0.pdf)
- ![上海-携程-Java高级.pdf](../assets/上海-携程-Java高级_1650621258714_0.pdf)
- ![深圳-OPPO-Java高级.pdf](../assets/深圳-OPPO-Java高级_1650621261753_0.pdf)
- ![深圳-丰巢科技-Java高级.pdf](../assets/深圳-丰巢科技-Java高级_1650621264445_0.pdf)
- ![深圳-乐信-Java高级.pdf](../assets/深圳-乐信-Java高级_1650621267215_0.pdf)
- ![深圳-蚂蚁金服-Java高级.pdf](../assets/深圳-蚂蚁金服-Java高级_1650621270016_0.pdf)
- ![深圳-商汤科技-Java高级.pdf](../assets/深圳-商汤科技-Java高级_1650621273205_0.pdf)
- ![深圳-腾讯-Java高级.pdf](../assets/深圳-腾讯-Java高级_1650621276076_0.pdf)
- ![深圳-银盛支付-Java中级.pdf](../assets/深圳-银盛支付-Java中级_1650621278654_0.pdf)
-

View File

@@ -0,0 +1,26 @@
- % | ^
- int a = 3 & 4
boolean b = true & false
- 使用时可以放数值,也可以放布尔值
- 位与运算&
- 比较两个二进制数据的同位数,如果都为1,此位结果为1
- 位或运算|
- 比较两个二进制数据的同位数,如果任意为1,此位结果为1
- 异或运算^
- 比较两个二进制数据的同位数,如果相同为0,不同为1
- 移位运算
- 如何快速的把2变成32?
id:: 62451ad0-4023-43ff-82ad-a114bfb9ac7f
- 2 \<< 4
- <<
表示将二进制整体向左移动多少位
2<<3 --> 2*2^3 -->16
移动多少位就乘以2的多少平方
- \>>
考虑符号的位移,位移之后符号不变
表示将二进制整体向右移动多少位
移动多少位就除以2的多少次方
- \>>>
不考虑符号的位移
- 当进行运算的是个负数,可能变成一个非常大的数
-

View File

@@ -0,0 +1,15 @@
- 包含==,!=,>,<,=,<=,>=,instanceof
id:: 6243f2ea-e08c-4ec2-850d-3ecf6e67889a
- ==
判断是否等于
- !=
- \>,<
- =
- \>=,<=
- 键盘录入
- Scanner
- java.util.Scanner
- Scanner scanner = new Scanner(System.in)
- int a = scanner.nextInt()
- 扫描控制台输入
- 自动导入包 [[IDEA]]

View File

@@ -0,0 +1,73 @@
- 字面量
- 以文件形式直接出现在程序中的数据
- ```java
public static void main(String[] args) {
System.out.println(11); //int类型
System.out.println(1.1F); //float类型,需要在末尾加F
System.out.println(1.11); //double类型
System.out.println(1000000L); //long类型,需要在末尾加L
System.out.println('字'); //char类型,需要单引号
System.out.println(true); //boolean类型
System.out.println("字符!") //String类型字面量,需要双引号
}
```
- 变量
- 最基本存储单元
- 定义单个变量
- ## [[Java程序注释]]
- 变量:在一定范围内可以变化的量,本质上是内存空间的一个变化
- 语法结构
- ```java
数据类型 变量名;
变量名 = 初始值;
```
```java
数据类型 变量名 = 初始值;
```
- 先定义,后赋值
```java
public static void main(String[] args) {
int num;
num=10;
System.out.println(num);
num=20;
System.out.println(num);
}
```
- 定义的同时赋值
```java
public static void main(String[] args) {
int num = 10;
System.out.println(num);
num=20;
System.out.println(num);
}
```
- 注意:
- 变量一定要赋初值
- 在同一方法内部变量名不能重复
- 变量赋值过程
- 在内存中根据数据类型申请对应内存空间
- 给内存空间定义一个名字num
- 给num的变量空间赋初始值10
- [[局部变量]]
- [[全局变量]]
- 常量:恒久不变的量
- PI = 3.14
- [[字面量常量]]
- [[自定义常量]]
- 小结
- 单行,多行,文档注释
- 变量含义,分类
- 常量含义

View File

@@ -0,0 +1,27 @@
- [第2周周考题.doc](../assets/第2周周考题_1650089024252_0.doc)
-
1-5 DCADA
6-10 DCDDB
11-13 DAC
14 ACE
15 AC
-
1. 重写是指将父类的方法在子类中实现不同的方法
重载是指一个方法可以传入不同的参数个数,顺序.类型
2. 抽象类是带有abstract关键字修饰的类,抽象类中可以放普通的属性,方法以及抽象方法
接口是定义为interface的类,是比抽象类还要抽象的类,是用来拓展类的功能的,
抽象类需要有子类继承实现,接口需要有实现类来实现
抽象类只能单继承,单实现,接口可以多继承,多实现
3. 封装,继承,多态,抽象
4. F5 进入到方法的内部
F6 执行下一步,不进入方法内部
F7 结束目前的方法
F8 跳出当前方法,进入下一步
5. valueOf
add
splite
charAt
trim
6. 基本数据类型直接将值赋给这个变量
引用数据类型变量存储的是在堆中的地址
7. public

View File

@@ -0,0 +1,16 @@
- 分类
- 基本数据类型
- 用于存储一些比较简单的数据,内存中存储的是数据本身
- [[引用数据类型
- 用于存储一些结构更加复杂,数据量更大的数据,内存空间中存储的是一个内存空间的地址
- **基本数据类型分类**
|类型|名称|字节占用|
|byte|[[字节类型]]|1字节|
|short|[[短整数类型]]|2字节|
|int|[[整型]]|4字节|
|long|[[长整型]]|8字节|
|float|[[单精度浮点]]|4字节|
|double|[[双精度浮点]]|8字节|
|boolean|[[布尔类型]]|4字节|
|char|[[字符类型]]|2字节|
-

View File

@@ -0,0 +1,16 @@
- 分类
- 基本数据类型
- 用于存储一些比较简单的数据,内存中存储的是数据本身
- [[引用数据类型]]
- 用于存储一些结构更加复杂,数据量更大的数据,内存空间中存储的是一个内存空间的地址
- **基本数据类型分类**
|类型|名称|字节占用|
|byte|[[字节类型]]|1字节|
|short|[[短整数类型]]|2字节|
|int|[[整型]]|4字节|
|long|[[长整型]]|8字节|
|float|[[单精度浮点]]|4字节|
|double|[[双精度浮点]]|8字节|
|boolean|[[布尔类型]]|4字节|
|char|[[字符类型]]|2字节|
-

View File

@@ -0,0 +1,40 @@
- Java是一种强类型的编程语言,任何的变量都必须要有对应的数据类型
- 数据类型出现的含义
- 规范变量空间的内容
- 规范变量控制的大小
- 分类
- 基本数据类型
- 用于存储一些比较简单的数据,内存中存储的是数据本身
- [[引用数据类型]]
- 用于存储一些结构更加复杂,数据量更大的数据,内存空间中存储的是一个内存空间的地址
- **基本数据类型分类**
- 整数型
- byte
- short
- int
- long
- 浮点型
- float
- double
- 字符型
- char
- 布尔型
- boolean
- 计算机中默认使用byte作为最小的存储单位
- 1字节由8个二进制位构成
- |类型|名称|字节占用|取值范围|
|byte|[[字节类型]]|1[[字节]]|-128~127|
|short|[[短整数类型]]|2字节|-32768~32767|
|int|[[整型]]|4字节|-2,147,483,648-2^31||
|long|[[长整型]]|8字节|1.45E-45|
|float|[[单精度浮点]]|4字节|
|double|[[双精度浮点]]|8字节|
|boolean|[[布尔类型]]|未知,由JVM决定|true&false 默认为false|
|char|[[字符类型]]|2字节|
- 默认整数类型:int
- 默认浮点类型:double
- 小结
- 两种类型
- 基本数据类型
- 引用数据类型
- 8个基本数据类型

View File

@@ -0,0 +1,3 @@
- [[字符串]]
- [[String]]
-

View File

@@ -0,0 +1,23 @@
- 流操作的最小单位
- 方向
- 输入字节流[[InputStream]]
- 输出字节流[[OutputStream]]
- [[File]]
- ```java
File f = new File(path);
if(!f.exist()){
f.mkdir();
}else if(f.isDirectory()){
File[] files = f.listFiles
if(files != null && files.length > 0){
for(File f2:files){
boolean flag = f2.isDirectory();
System.out.println(f2.getName + ((flag)?"目录":"文件"));
}
}
}else{
}
```
- 输入流
- FileInputStream]]

View File

@@ -0,0 +1,30 @@
- 异常处理,是Java[[健壮性]]的体现
- 程序在编码或运行过程中,出现的问题
- 产生异常的可能性
- 用户录入错误数据
- 断网
- 内存不足
- 硬盘空间不足
- 程序员乱写代码
- 分类
- [[错误]]
- > 错误,是程序员无法修改代码解决的
- 内存不足
- 硬盘空间不足
- 网络无法访问
- [[编译异常]]
- > 程序员写代码时,由[[编译器]]发现的异常
- 文件找不到
- 用户胡乱输入
- [[运行异常]]
- > 程序在运行中,动态抛出的异常
- 空指针
- 数组下标越界
- 编译异常解决方案
- 抓捕异常,直接处理
- [[try]][[catch]]
- 不抓捕,继续向下抛出
- 不抓捕,直接处理 [[throw]] 抛出
- 在代码中写throw error;在函数后加上throws ParseException
- 之要代码中使用了throws抛出异常,那么对应的方法就会被弹出方法栈
-

View File

@@ -0,0 +1,14 @@
- 异常的捕获,只针对编译异常
- {{embed [[try-catch-finally]]}}
- [[finally]]
- 不管成功还是失败都要执行的代码
- 多个[[catch]]块的问题
- ```java
try{
}catch (error e){
}catch (error f){
}
```

View File

@@ -0,0 +1,14 @@
- 高类型数据转低类型数据不能直接转
- 如果要转换,需要指定转换的数据类型
- 数据溢出
- 转换时高数据类型的值超出低数据类型的范围
- 溢出后会从最低值到最高值循环,直到未超出范围
- 精度丢失
- 高类型转低类型时,精度会丢失
- double-->float
- 丢失小数点7位之后的部分
- double/float-->int
- 丢失小数点后的部分
- 自动提升
- 参与运算的整数类型,小于int会自动提升为int类型,int+int为int类型,不能直接转型为byte
- 参与运算的最高类型为最终运算的结果的类型

View File

@@ -0,0 +1,34 @@
- [[抽象]]
- 具有 [[抽象方法]] 的类
- 具有抽象方法的必须是抽象类
id:: 6254e692-cdf6-43ff-a045-637b1253591c
- 抽象类无法被实例化,因为有方法不确定,无法用[[new]]使用
- 抽象类中的方法一定要让子类实现
id:: 6254e7f4-1f9b-4da4-bca3-af5b328ff3e7
- ```java
public abstract class Girl{
public abstract void smile();
}
```
- 特点
- ((6254e692-cdf6-43ff-a045-637b1253591c))
- 抽象类中不一定要有抽象方法,此时定义抽象类没有多大意义
- ((6254e7f4-1f9b-4da4-bca3-af5b328ff3e7)),通过[[abstract]]关键字定义,不实现会报错
- 子类如果不实现时,将子类也定义为抽象类
- 抽象类无法实例化
- 可放置元素
- 普通类所有元素+抽象方法
- 抽象方法
- 非抽象方法
- 属性
- > 抽象类定义属性目的:
给子类定义的东西
- 构造器
- > 抽象类定义构造器目的:
给子类定义的东西
- 抽象方法,不可定义为[[private]] #Java面试
私有代表无法被[[重写]],抽象方法一定要子类重写
- 抽象方法不能定义[[static]] #Java面试
static方法的调用方式类名.方法名 意味着这个方法一定有过实现,但是抽象方法没有实现
- 抽象方法不可定义为[[final]] #Java面试
final定义在方法上不能被重写但是抽象方法一定要子类重写

View File

@@ -0,0 +1,26 @@
- 冒泡排序
- 特点:
每一轮循环后,最大的一个数被交换到末尾,因此,下一轮循环就可以跑相互最后的数,没一轮循环都比上一轮循环的结束位置靠前一位
- ```java
int[] ns = { 28, 12, 89, 73, 65, 18, 96, 50, 8, 36};
System.out.println(Arrays.toString(ns));
for (int i = 0; i < ns.length - 1; i++){
for(int j = 0; j <ns.length - i - 1; j++){
if(ns[j] > ns[j+1]){
int tmp = ns[j]; //交换时要先定义一个临时变量
ns[j] = ns[j+1];
ns[j+1] = tmp;
}
}
}
System.out.println(Arrays.toString[ns])
```
- 使用JDK提供的Arrays.sort()
- ```java
import java.util.Arrays;
nt[] ns = { 28, 12, 89, 73, 65, 18, 96, 50, 8, 36};
Arrays.sort(ns);
System.out.println(Arrays.toStrint(ns));
```
-

View File

@@ -0,0 +1,3 @@
- 占四个字节内存空间,共32位
- 取值$-2^31$~$2^31$
-

View File

@@ -0,0 +1,2 @@
- 在创建对象时候初始化里面的值
id:: 6253973f-838a-4d3e-a33b-e42497af6185

View File

@@ -0,0 +1,22 @@
- [[构造方法]]
- 作用
- 配合 [[new]] 关键字,创建对象的实例
- 编译器会自动的在类中,给每个类产生一个无参构造方法
- 自己定义
- ```java
public Book(){
}
```
- 方法名用类名一致
- 无任何返回值无void
- [[无参构造器]]
- [[有参构造器]]
- 作用
- ((62539750-497b-42e9-965e-d1d4ddf2888a))
id:: 6253975b-b401-45c2-90c9-693d59ebc80a
- 注意
- 写有参时要先写一个无参构造器
- 编译器发现构建了有参构造器就不会自动创建无参构造器
-
-

View File

@@ -0,0 +1,97 @@
- 标识符
- 任何一种编程语言,都是由一些符号构成
- 单词,特殊符号
- 有的系统默认,默认标识符称为关键字,非系统默认成为自定义标识符
- Java中的关键字
- 共50个
|关键字|||||
|abstract|char|class|const|continue|
|catch|do|double|else|extends|
|default|boolean|break|byte|case|
|assert|final|finally|float|for|
|goto|ig|implements|import|instanceof|
|strictfp|package|private|protected|public|
- 类别 关键字 说明
访问控制 private 私有的
protected 受保护的
public 公共的
default 默认
类、方法和变量修饰符 abstract 声明抽象
class 类
extends 扩充,继承
final 最终值,不可改变的
implements 实现(接口)
interface 接口
native 本地,原生方法(非 Java 实现)
new 新,创建
static 静态
strictfp 严格,精准
synchronized 线程,同步
transient 短暂
volatile 易失
程序控制语句 break 跳出循环
case 定义一个值以供 switch 选择
continue 继续
default 默认
do 运行
else 否则
for 循环
if 如果
instanceof 实例
return 返回
switch 根据值选择执行
while 循环
错误处理 assert 断言表达式是否为真
catch 捕捉异常
finally 有没有异常都执行
throw 抛出一个异常对象
throws 声明一个异常可能被抛出
try 捕获异常
包相关 import 引入
package 包
基本类型 boolean 布尔型
byte 字节型
char 字符型
double 双精度浮点
float 单精度浮点
int 整型
long 长整型
short 短整型
变量引用 super 父类,超类
this 本类
void 无返回值
保留关键字 goto 是关键字,但不能使用
const 是关键字,但不能使用
- > goto const是java中不常用的关键字
goto 跳转指针,Java不操作指针
const定义常量,但是Java中的final替换掉了
- 3个保留关键字
- true
- false
- null
- 自定义标识符
- > 代码中不会变颜色的符号
- 类的类名
- 方法的方法名
- 变量名
- 参数名
- SUN公司定义规则
- 标识符组成由数字,大小写字母,下划线,美元符号组成
- 不能数字开头,严格区分大小写,长度不限
- 不能是关键字
- 行业潜规则
- 类的类名,方法的方法名,变量的变量名,参数的参数名,在定义时遵守"驼峰命名法"
- 类的类名遵从大驼峰,单词首字母大写
- 方法的方法名,变量的变量名,参数的参数名,遵守"小驼峰"
- 第一个首字母小写,单词之间首字母大写
- 标识符在定义时,要见名知意
- 常量的名字单词全大写,单词之间使用_分割
- ```java
final double MATH_PI = 3.14;
```
- ![阿里巴巴 Java 开发手册.pdf](../assets/阿里巴巴_Java_开发手册_1648535351339_0.pdf)
- 小结
- 标识符可分为关键字和自定义标识符
- 关键字50个
- 大驼峰
- 小驼峰

View File

@@ -0,0 +1,17 @@
- > println是peint line的缩写,表示输出后换行,不换行可以用print()
- ### 格式化输出System.out.printf()
- ```java
double d = 3.1415926
System.out.printf("%.2f\n",d);
System.out.printf("%.2f\n",d);
```
- |占位符|说明|
|%d|格式化输出整数|
|%x|格式化输出十六进制整数|
|%f|格式化输出浮点数|
|%e|格式化输出科学计数法表示的浮点数|
|%s|格式化字符串|
- > 由于%表述占位符,因此,两个%%表示一个%字符本身
- JDK格式化参数模板[java.util.Formatter](https://docs.oracle.com/en/java/javase/11/docs/api/java.base/java/util/Formatter.html#syntax)
-
-

View File

@@ -0,0 +1,554 @@
- ## 一阶段
- ### 1.1 集合
collapsed:: true
- 1. [[HashMap和ConcurrentHashMap的区别]]
- 2. [[线程安全的集合有哪些]]
- 3. [[如何做到集合变遍历,边删除]]
- 4. [[HashMap的底层原理是什么如何扩容并解决Hash碰撞的]]
- 5. [[HashMap在什么情况下单链表需要转为红黑树]]
- 6. [[ConcurrentHashMap为什么是线程安全的如何做到的]]
- 7. [[是否写过HashMap的底层了解过什么]]
- 8. [[Collection集合和Map体系集合的区别]]
- 9. [[HashMap在JDK1.7和JDK1.8的区别]]
- 10. [[HashSet的去重原理]]
- 11. [[写个时间复杂度为On的算法找到一个数列第二大的数]]
- 12. [[Collection 和 Collections 的区别是啥]]
- 13. [[如何获得Map集合中的所有的Key]]
- 14. [[HashMap 什么情况下会产生死锁的问题如何解决]]
- 15. [[如何使用jdk1.8新特性从商品集合中单独把某一个字段(比如id)拿出来当做一个集合]]
- 16. [[ArrayList和LinkedList的区别]]
- 17. [[遍历Set和List的通用方法]]
- 18. [[有几种方法可以遍历JAVA集合]]
- 19. [[ArrayList哪些操作效率较高]]
- 20. [[HashMap为什么要重写hashcode]]
- 21. [[JDK中有哪些队列]]
- 22. [[HashMap 和 Hashtable 有什么区别]]
- 23. [[List、Set、map区别]]
- 24. [[HashMap的put方法的执行过程]]
- 25. [[分析HashMap为什么线程不安全]]
- 26. [[集合的分类,分别的特性是哪些]]
- 27. [[给你一个数值类型数组,如何以最快的方式,查找到某一个元素]]
- 28. [[编程题给你一个整数数组进行排序输入一个k从小到大输出k个数]]
- 29. [[有个数组,如何颠倒所有的元素]]
- 30. [[银行系统我给你168的数字你应该给我多少张不同面额的人民币(口述如何实现)]]
- 31. [[HashMap的底层是如何解决Hash碰撞的]]
- 32. [[Collection 和 Collections 有什么区别]]
- 33. [[数组,链表,哪个查询效率高,为什么高]]
- 34. [[CurrentHashMap的在JDK1.7和1.8期间分别的特征]]
- 35. [[自旋锁的特征]]
- 36. [[遍历Set和List的通用方法]]
- 37. [[数组的排序算法,你都知道哪些请列举并手写一个出来]]
- ### 1.2 多线程
collapsed:: true
- 1. [[进程与线程的区别]]
- 2. [[为什么要用多线程]]
- 3. [[多线程的创建方式有哪些]]
- 4. [[是继承Thread类好还是实现Runnable接口好]]
- 5. [[ThreadLocal类是什么类]]
- 6. [[你项目中的哪些地方使用到多线程]]
- 7. [[什么是线程安全]]
- 8. [[如何解决多线程间线程安全问题]]
- 9. [[为什么使用同步或锁,就可以让多线程解决线程安全问题]]
- 10. [[什么是线程同步]]
- 11. [[什么是同步代码块]]
- 12. [[同步代码块和同步函数之间有什么区别]]
- 13. [[同步函数和静态同步函数之间有什么区别]]
- 14. [[什么是多线程死锁]]
- 15. [[wait() 和notify() 方法的区别]]
- 16. [[同步与异步的区别]]
- 17. [[线程的生命周期]]
- 18. [[线程同步的几个方法]]
- 19. [[并发与并行的区别]]
- 20. [[关于多线程锁升级的理解]]
- 21. [[怎么理解过程一致性和结果一致性]]
- 22. [[synchronized与Lock锁的区别]]
- 23. [[同步方法与同步块的区别]]
- 24. [[什么是线程池它的作用是什么]]
- 25. [[线程池有哪些核心参数]]
- 26. [[synchronized与乐观锁的区别]]
- 27. [[你是怎么创建线程池的]]
- 28. [[线程的原子性是什么]]
- 29. [[说说你对线程的3个特性原子可见有序的理解]]
- 30. [[sleep()和wait() 的区别]]
- 31. [[如何停止一根线程]]
- 32. [[什么是守护线程,如何做到]]
- 33. [[yield() 与 join() 方法的区别]]
- 34. [[什么是Volatile它的作用是什么]]
- 35. [[什么是AtomicInteger]]
- 36. [[你都知道哪些锁]]
- 提示:自旋锁,可重入锁,互斥锁,悲观锁,乐观锁,偏向锁,轻量级锁,重量级锁
- 37. [[线程是如何开始的]]
- 38. [[守护线程是什么如何实现]]
- 39. [[JDK1.8 针对synchronized都做过哪些优化]]
- ### 1.3 JVM
collapsed:: true
- 1. [[请说下Java的内存模型也就是JMM]]
- Java内存模型JMMJVM规范中定义了Java的内存模型Java Memory ModelJMM
- JMM主要分为2个部分主内存以及每个线程的本地内存。
- ![image.png](../assets/image_1657070835023_0.png)
- JVM中运行的每个线程都拥有自己的线程栈线程栈包含了当前线程执行的方法调用相关信息我们也把它称作调用栈。随着代码的不断执行调用栈会不断变化。共享的对象我们会放置在堆中
- ![image.png](../assets/image_1657070883091_0.png)
- 现在的电脑一般都是多CPU的。那么多个CPU如何操作内存呢
- 现代计算机一般都有2个以上CPU而且每个CPU还有可能包含多个核心。因此如果我们的应用是多线程的话这些线程可能会在各个CPU核心中并行运行。
- ![image.png](../assets/image_1657070989302_0.png)
- 在CPU内部有一组CPU寄存器也就是CPU的储存器。CPU操作寄存器的速度要比操作计算机主存快的多。在主存和CPU寄存器之间还存在一个CPU缓存CPU操作CPU缓存的速度快于主存但慢于CPU寄存器。某些CPU可能还有多个缓存层一级缓存和二级缓存。计算机的主存也称作RAM所有的CPU都能够访问主存而且主存比上面提到的缓存和寄存器大很多。
- 当一个CPU需要访问主存时会先读取一部分主存数据到CPU缓存进而在读取CPU缓存到寄存器。当CPU需要写数据到主存时同样会先flush寄存器到CPU缓存然后再在某些节点把缓存数据flush到主存
- 2. [[请说下JVM的运行时的内存结构]]
- JDK1.8以前:
- ![image.png](../assets/image_1657071088825_0.png)
- JDK1.8以后:
- ![image.png](../assets/image_1657071125303_0.png)
- JDK1.8中,移除了方法区的概念,将类的类信息等元数据使用元数据区(或者叫:元空间)来进行存储。
- 但是程序计数器本地方法栈线程栈这3个部分依旧是线程所独有元空间还是被线程所共享
- 3. [[JVM虚拟机的原理]]
- 提示就是一台虚拟的机器。同样是一款软件用来执行一系列虚拟计算指令大体上虚拟机可以分为系统虚拟机和程序虚拟机大名鼎鼎的Visual Box、Vmware就属于系统虚拟机他们完全是对物理计算的仿真提供了一个可以运行完整操作系统的软件平台。
- 程序虚拟机典型代码就是Java虚拟机它专门为执行单个计算程序而计算在Java虚拟机中执行的指令我们成为Java自己码指令。无论是系统虚拟机还是程序虚拟机在上面运行的软件都被限制于虚拟机提供的资源中。目前Java使用最广泛的是HotSpot虚拟机。
- 4. [[什么是虚拟机参数配置 你是否配置过 在哪里配置]]
- 提示:
- 虚拟机参数配置,其实就是围绕着堆、栈、方法区的内存空间大小进行配置。
- 其目的就是为了更高效更合理的利用虚拟机减少FullGC的次数提升内存的利用率
- 配置方式多种可在tomcat的bin目录下的catalina.bat中配置也可以在开发工具中配置
- 5. [[都有哪些堆的参数,可以配置]]
- 提示:
- -XX:+PrintGC    每次触发GC的时候打印相关日志
- -XX:+UseSerialGC 串行回收
- -XX:+PrintGCDetails  更详细的GC日志
- -Xms    堆初始值
- -Xmx    堆最大可用值
- -Xmn    新生代堆最大可用值
- -XX:SurvivorRatio 用来设置新生代中eden空间和from/to空间的比例.
- 含以-XX:SurvivorRatio=eden/from=den/to
- 总结:在实际工作中,我们可以直接将初始的堆大小与最大堆大小相等,
- 这样的好处是可以减少程序运行时垃圾回收次数,从而提高效率。
- -XX:SurvivorRatio 用来设置新生代中eden空间和from/to空间的比例.
- 6. [[如何设置最大堆空间大小]]
- 提示:
- 参数: -Xms20m -Xmx20m -XX:+PrintGCDetails -XX:+UseSerialGC -XX:+PrintCommandLineFlags
- 7. [[设置新生代与老年代优化参数]]
- 提示:
- -Xmn    新生代大小一般设为整个堆的1/3到1/4左右
- -XX:SurvivorRatio    设置新生代中eden区和from/to空间的比例关系n/1 默认是8:1:1
- 参数: -Xms20m -Xmx20m -Xmn5m -XX:SurvivorRatio=8 -XX:+PrintGCDetails -XX:+UseSerialGC
- 8. [[设置新生与老年代代参数]]
- 提示:
- -Xms20m -Xmx20m -XX:SurvivorRatio=8 -XX:+PrintGCDetails -XX:+UseSerialGC
- -XX:NewRatio=2
- 总结:不同的堆分布情况,对系统执行会产生一定的影响,在实际工作中,
- 应该根据系统的特点做出合理的配置,基本策略:尽可能将对象预留在新生代,
- 减少老年代的GC次数。
- 除了可以设置新生代的绝对大小(-Xmn),可以使用(-XX:NewRatio)设置新生代和老年
- 代的比例:-XX:NewRatio=老年代/新生代
- 9. [[内存溢出你是咋解决的]]
- 提示:
- 错误原因: java.lang.OutOfMemoryError: Java heap space
- 解决办法:设置堆内存大小 -Xms1m -Xmx70m -XX:+HeapDumpOnOutOfMemoryError
- 10. [[栈溢出你是咋解决的]]
- 提示:
- 错误原因: java.lang.StackOverflowError
- 栈溢出 产生于递归调用,循环遍历是不会的,但是循环方法里面产生递归调用, 也会发生栈溢出。
- 解决办法:设置线程最大调用深度
- -Xss5m 设置最大调用深度
- 11. [[Tomcat内存溢出在catalina.sh 修改JVM堆内存大小]]
- 提示:
- JAVA_OPTS="-server -Xms800m -Xmx800m -XX:PermSize=256m -XX:MaxPermSize=512m -XX:MaxNewSize=512m"
- 12. [[内存泄漏与内存溢出的区别]]
- 提示:
- 内存溢出 out of memory是指程序在申请内存时没有足够的内存空间供其使用出现out of memory比如申请了一个integer,但给它存了long才能存下的数那就是内存溢出。
- 内存泄露 memory leak是指程序在申请内存后无法释放已申请的内存空间一次内存泄露危害可以忽略但内存泄露堆积后果很严重无论多少内存,迟早会被占光。
- memory leak会最终会导致out of memory
- 内存溢出就是你要求分配的内存超出了系统能给你的,系统不能满足需求,于是产生溢出。 

内存泄漏是指你向系统申请分配内存进行使用(new),可是使用完了以后却不归还(delete)结果你申请到的那块内存你自己也不能再访问也许你把它的地址给弄丢了而系统也不能再次将它分配给需要的程序。一个盘子用尽各种方法只能装4个果子你装了5个结果掉倒地上不能吃了。这就是溢出比方说栈栈满时再做进栈必定产生空间溢出叫上溢栈空时再做退栈也产生空间溢出称为下溢。就是分配的内存不足以放下数据项序列,称为内存溢出. 以发生的方式来分类内存泄漏可以分为4类 1. 常发性内存泄漏。发生内存泄漏的代码会被多次执行到每次被执行的时候都会导致一块内存泄漏。 2. 偶发性内存泄漏。发生内存泄漏的代码只有在某些特定环境或操作过程下才会发生。常发性和偶发性是相对的。对于特定的环境偶发性的也许就变成了常发性的。所以测试环境和测试方法对检测内存泄漏至关重要。 3. 一次性内存泄漏。发生内存泄漏的代码只会被执行一次或者由于算法上的缺陷导致总会有一块仅且一块内存发生泄漏。比如在类的构造函数中分配内存在析构函数中却没有释放该内存所以内存泄漏只会发生一次。 4. 隐式内存泄漏。程序在运行过程中不停的分配内存,但是直到结束的时候才释放内存。严格的说这里并没有发生内存泄漏,因为最终程序释放了所有申请的内存。但是对于一个服务器程序,需要运行几天,几周甚至几个月,不及时释放内存也可能导致最终耗尽系统的所有内存。所以,我们称这类内存泄漏为隐式内存泄漏。 

从用户使用程序的角度来看,内存泄漏本身不会产生什么危害,作为一般的用户,根本感觉不到内存泄漏的存在。真正有危害的是内存泄漏的堆积,这会最终消耗尽系统所有的内存。从这个角度来说,一次性内存泄漏并没有什么危害,因为它不会堆积,而隐式内存泄漏危害性则非常大,因为较之于常发性和偶发性内存泄漏它更难被检测到
- 13. [[JVM参数调优的总结]]
- 提示:
- 在JVM启动参数中可以设置跟内存、垃圾回收相关的一些参数设置默认情况不做任何设置JVM会工作的很好但对一些配置很好的Server和具体的应用必须仔细调优才能获得最佳性能。通过设置我们希望达到一些目标
- 1. GC的时间足够的小
- 2. GC的次数足够的少
- 3. 发生Full GC的周期足够的长
- 前两个目前是相悖的要想GC时间小必须要一个更小的堆要保证GC次数足够少必须保证一个更大的堆我们只能取其平衡。
- 1. 针对JVM堆的设置一般可以通过-Xms -Xmx限定其最小、最大值为了防止垃圾收集器在最小、最大之间收缩堆而产生额外的时间我们通常把最大、最小设置为相同的值
- 2. 年轻代和年老代将根据默认的比例12分配堆内存可以通过调整二者之间的比率NewRadio来调整二者之间的大小也可以针对回收代比如年轻代通过 -XX:newSize -XX:MaxNewSize来设置其绝对大小。同样为了防止年轻代的堆收缩我们通常会把-XX:newSize -XX:MaxNewSize设置为同样大小
- 3. 年轻代和年老代设置多大才算合理 毫无疑问是没有答案的,否则也就不会有调优。我们观察一下二者大小变化有哪些影响
- 1. 更大的年轻代必然导致更小的年老代大的年轻代会延长普通GC的周期但会增加每次GC的时间小的年老代会导致更频繁的Full GC
- 2. 更小的年轻代必然导致更大年老代小的年轻代会导致普通GC很频繁但每次的GC时间会更短大的年老代会减少Full GC的频率
- 3. 如何选择应该依赖应用程序对象生命周期的分布情况:如果应用存在大量的临时对象,应该选择更大的年轻代;如果存在相对较多的持久对象,年老代应该适当增大。但很多应用都没有这样明显的特性,在抉择时应该根据以下两点:
- 1. 本着Full GC尽量少的原则让年老代尽量缓存常用对象JVM的默认比例12也是这个道理
- 2. 通过观察应用一段时间看其他在峰值时年老代会占多少内存在不影响Full GC的前提下根据实际情况加大年轻代比如可以把比例控制在11。但应该给年老代至少预留1/3的增长空间
- ### 1.4 GC
collapsed:: true
- 1. [[说说你对Java的GC回收机制的理解]]
- 提示:
- Java语言有个特征安全性就是指Java程序员摆脱了C++ 程序员关于内存管理的问题。使得Java程序员在编写程序时不需要通过指针操作内存同时也不需要再去关注内存何时将会被回收清理。这一切都是因为有的GC回收机制的功劳。
- ### 1.5 MySQL
collapsed:: true
- 1. [[项目中SQL调优的场景有哪些数据库调优如何做]]
- 2. [[最多有过几张表的连表处理]]
- 3. [[为什么选择MySQL5.7而不用5.5 5.6]]
- 4. [[数据库中Btree 与Hash索引的区别]]
- 5. [[什么是数据库回表,如何避免回表查询]]
- 6. [[InnoDB的行级锁什么情况下会使用]]
- 7. [[数据库中如何快速插入100W级数据]]
- 8. [[联合索引与普通索引的区别在哪里]]
- 9. [[有张100W级的表中存在大量的重复数据如何快速去重]]
- 10. [[数据库中复合索引的字段中可以有null值吗]]
- 11. [[数据库中两张表如何要联合查询,要如何实现]]
- 12. [[mysql数据库索引是用什么数据结构存储的]]
- 13. [[事务在什么情况下会失效]]
- 14. [[怎么用Sql语句复制另一张表]]
- 15. [[数据库连表查询,左外联,右外联,内联查的区别]]
- 16. [[sql语句过慢怎么定位问题]]
- 17. [[说一下JDBC在连接数据库的操作上几个步骤]]
- 18. [[Like 后 加% 和 加_ 的区别在哪里]]
- 19. [[说一下事务的隔离级别和事务的传播性质]]
- 20. [[说一下怎么防止超卖SQL怎么写]]
- 21. [[如果给你一个功能,你觉得从数据库设计开始的思路是什么]]
- 22. [[说一下 ACID 是什么]]
- 23. [[数据库用户ID主键策略]]
- 24. [[数据库的执行计划]]
- 25. [[JDBC如何提升读取数据的性能]]
- 26. [[select count(*) ,select count(1),select count(字段) 说一下区别]]
- 27. [[索引失效的场景有哪些]]
- 28. [[数据库的SQL语句如何加锁]]
- 29. [[数据库中哪些字段适合加索引 ,哪些不适合加索引]]
- 30. [[什么是聚簇索引,什么是非聚簇索引]]
- 31. [[Union 和 union all 的区别是什么]]
- 32. [[什么是SQL注入如何防止]]
- 33. [[关闭连接一定能成功吗 怎么保证一定成功关闭连接]]
- 34. [[有哪些地方必须关闭资源]]
- 35. [[有没有设计过数据库 数据库三范式讲一下]]
- 36. [[In 与 exits 的区别是什么]]
- 37. [[MySQL中存储引擎InnoDB,MyIsam的区别在哪里]]
- 38. [[MySQL中锁机制]]
- 39. [[数据库中复合索引的字段中可以有null值吗]]
- 40. [[MySQL数据库的my.ini文件中可以配置什么参数]]
-在mysql的安装根目录中创建一个文件my.ini编写以下内容
- ```ini
#client mysql 都是设置客户端
[client]
#port参数表示的是MySQL数据库的端口默认的端口是3306
port=3306
[mysql]
#default-character-set参数是客户端默认的字符集
default-character-set=utf8
#mysqld 设置服务端
[mysqld]
#port参数也是表示数据库的端口
port=3306
#basedir参数表示MySQL的安装路径
basedir="C:/Program Files/MySQL/MySQL Server 5.7/"
#datadir参数表示MySQL数据文件的存储位置,也是数据库表的存放位置
datadir="C:/ProgramData/MySQL/MySQL Server 5.7/Data/"
#default-character-set参数表示默认的字符集这个字符集是服务器端的
character-set-server=utf8
#default-storage-engine参数默认的存储引擎
default-storage-engine=INNODB
#sql-mode参数表示SQL模式的参数通过这个参数可以设置检验SQL语句的严格程度
sql-mode="STRICT_TRANS_TABLES,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION"
#max_connections参数表示允许同时访问MySQL服务器的最大连接数默认151最大值16384其中一个连接是保留的留给管理员专用的
max_connections=1000
#query_cache_size参数表示查询时的缓存大小缓存中可以存储以前通过select语句查询过的信息再次查询时就可以直接从缓存中拿出信息
query_cache_size=0
#table_cache参数表示所有进程打开表的总数
table_cache=256
#tmp_table_size参数表示内存中临时表的总数
tmp_table_size=35M
#thread_cache_size参数表示保留客户端线程的缓存
thread_cache_size=8
#myisam_max_sort_file_size参数表示MySQL重建索引时所允许的最大临时文件的大小
myisam_max_sort_file_size=100G
#myisam_sort_buffer_size参数表示重建索引时的缓存大小
myisam_sort_buffer_size=69M
#key_buffer_size参数表示关键词的缓存大小
key_buffer_size=55M
#read_buffer_size参数表示MyISAM表全表扫描的缓存大小
read_buffer_size=64K
#read_rnd_buffer_size参数表示将排序好的数据存入该缓存中
read_rnd_buffer_size=256K
#sort_buffer_size参数表示用于排序的缓存大小
sort_buffer_size=256K
#innodb_additional_mem_pool_size参数表示附加的内存池用来存储InnoDB表的内容
innodb_additional_mem_pool_size=3M
#innodb_flush_log_at_trx_commit参数是设置提交日志的时机若设置为1
#InnoDB会在每次提交后将事务日志写到磁盘上
innodb_flush_log_at_trx_commit=1
#innodb_log_buffer_size参数表示用来存储日志数据的缓存区的大小
innodb_log_buffer_size=2M
#innodb_buffer_pool_size参数表示缓存的大小InnoDB使用一个缓冲池类保存索引和原始数据
innodb_buffer_pool_size=107M
#innodb_log_file_size参数表示日志文件的大小
innodb_log_file_size=54M
#innodb_thread_concurrency参数表示在InnoDB存储引擎允许的线程最大数
innodb_thread_concurrency=18
```
- ### 1.6 Mybatis
- 1. [[#{} 与 ${} 的区别]]
- 2. [[Mybatis的实现原理]]
- 3. [[Mybatis级联的配置]]
- 4. [[Mybatis的一二级缓存是什么样的]]
- 5. [[Mybits的缺点有哪些]]
- 6. [[Mybatis如何防止SQL注入]]
- ### 1.7 网络编程
- 1. [[什么是Socket编程]]
- 2. [[TCP与UDP在概念上的区别]]
- 3. [[TCP协议的特点你能说说吗 具体说说3次握手4次挥手的过程]]
- 4. [[OSI七层模型大概了解么]]
- ### 1.8 设计原则与设计模式
- 1. [[7大设计原则有哪些]]
- 2. [[什么是设计模式,有多少个]]
- 3. [[单例设计模式,你会手写么 在项目中哪些地方有应用]]
- 4. [[代理设计模式中,静态代理和动态代理的区别]]
- 5. [[动态代理中JDK代理和CGLIB代理区别 代理模式,在项目中哪些地方有应用]]
- 6. [[工厂设计模式的作用 简单工厂会写不 在项目中哪些地方有应用]]
- 7. [[如何克隆一个对象 浅克隆与深克隆区别在哪里]]
- 8. [[设计模式中,工厂设计模式有啥用 项目中在哪些地方用过]]
- ### 1.9 其它题目
- 1. [[异常的分类,如何自定义异常]]
- 2. [[普通类和抽象类有哪些区别]]
- 3. [[讲讲类的加载过程以及双亲委派机制]]
- 4. [[JDK1.8的新特性,你都用过哪些]]
- 5. [[网络通讯中tcp协议udp协议的区别]]
- 6. [[普通类和抽象类的区别 接口和抽象的区别]]
- 7. [[常用操作字符串有哪些类 StringBuffer,StringBuilder]]
- 8. [[StringStringBuffer及StringBuilder的区别]]
- 9. [[如何跳出多重循环]]
- 10. [[什么是反射]]
- 11. [[final 在 Java 中有什么作用]]
- 12. [[说一下你熟悉的设计模式]]
- 13. [[谈谈面向对象]]
- 14. [[谈谈多线程并发]]
- 15. [[什么是Java的反射]]
- 16. [[Java的反射在哪些地方有过应用]]
- 17. [[反射获得Class对象的3种方式]]
- 18. [[反射操作私有属性时,需要注意什么]]
- 19. [[抽象类可以继承实体类么]]
- 20. [[抽象类可以继承接口么]]
- 21. [[接口可以继承抽象类么]]
- 22. [[IO流的分类有哪些]]
- 23. [[谈谈BIO,NIO,AIO的区别是什么你都用过哪些IO框架]]
- 24. [[Object类的常见方法都有哪些]]
- 25. [[Java中异常的分类分别说说都哪些具体的异常]]
- 26. [[遇到BUG你是如何调试的]]
- 27. [[如果运行结果跟预期不一样,但是代码没报错,怎么处理]]
- 28. [[有没有用过断点调试 怎么用的]]
- 29. [[JDKJREJVM的区别]]
- 30. [[重写和重载的区别在哪里]]
- ## 二阶段
- ### 2.1 Spring
- 1. [[对springIOC的理解]]
- 2. [[讲下springAOP项目中你是如何应用的]]
- 3. [[动态代理模式中JDK与CGLIB的区别]]
- 4. [[Spring的循环依赖问题如何解决]]
- 5. [[谈谈你对Spring bean的生命周期的理解]]
- 6. [[Spring中对事务的支持有哪些方式 你项目中如何处理事务]]
- 7. [[Spring中bean基本都是单例的如果一个方法要对bean中的属性值进行修改这个方法会被多次执行怎么确保安全]]
- 8. [[讲一下浅克隆与深克隆]]
- 9. [[@Resource和@Autowired的区别]]
- 10. [[介绍一下你的项目AOP日志功能如何实现的]]
- 11. [[Spring依赖注入的方式有哪些 有区别么]]
- 12. [[Spring的常用注解都有哪些]]
- 13. [[Spring 事务实现方式有哪些]]
- 14. [[BeanFactory 和 ApplicationContext的区别]]
- 15. [[Spring中bean基本都是单例的如果一个方法要对bean中的属性值进行修改这个方法会被多次执行怎么确保安全]]
- 16. [[Spring实例化组件时,如何设置属性]]
- ### 2.2 SpringMVC
- 1. [[SpringMVC框架的工作流程]]
- 2. [[forward和redirect的区别]]
- 3. [[说一下@requestMapping的作用]]
- 4. [[知道拦截器么,你项目中哪里使用过拦截器]]
- 5. [[Springmvc 过滤器 拦截器的使用场景和区别是什么]]
- ### 2.3 SpringBoot
- 1. [[SpringBoot如何实现自动配置 原理是什么]]
- 2. [[SpringBoot的web模块自动集成了Tomcat如何剔除]]
- 3. [[说说你常用的几个SpringBoot注解]]
- 4. [[你上个项目用的SpringBoot版本是那个版本的]]
- 5. [[SpringBoot主要的配置类有哪些]]
- 6. [[Spring,Springmvc,SpringBoot的区别是啥]]
- 7. [[可不可以配置两个数据源 比如一个mysql和一个oracle 在哪里配置,怎么配置]]
- 8. [[SpringBoot在yaml中配置了开发环境配置文件和测试配置文件有几种方式在不同环境去使用不同的配置文件]]
- 9. [[SpringBoot的优点在哪里]]
- 10. [[当application.properties,application.yaml,bootstrap.yaml文件同时存在的情况下它们的执行顺序是怎样的]]
- 11. [[Spring的启动流程是怎么样的]]
- ### 2.4 Web题
- 1. [[HTTPS 通讯协议是如何实现的 它的加密方式是什么]]
- 2. [[在HTTP请求中如何存储客户信息(分如何获取和如何存储)]]
- 3. [[Ajax怎么实现同步]]
- 4. [[你们项目中,使用的什么 数据交换格式]]
- 5. [[HTTP通讯协议分为几个部分 请求协议的组成]]
- 6. [[JSON的解析框架你用过什么]]
- 7. [[XML与JSON之间的区别]]
- 8. [[页面加载很慢,有什么优化方案]]
- 9. [[重定向和请求转发的区别是什么]]
- 10. [[JSON格式长什么样 那么JSONArray呢]]
- 11. [[Servlet的生命周期]]
- 12. [[Tomcat如何配置连接池 默认连接数是多少 == 生产环境Tomcat性能比较差如何调优]]
- 答修改conf目录下的server.xml即可实现
- ```xml
<!--线程池的设置-->
<Executor executor="tomcatThreadPool"
namePrefix="catalina-exec-"
maxThreads="500"
minSpareThreads="100"
maxSpareThreads="500"
prestartminSpareThreads="true"
maxQueueSize="10000"
/>
<!--name连接池名称
namePrefix连接池创建的每个线程的名称前缀。单个线程的线程名称将为namePrefix + threadNumber
maxThreads此池中活动线程的最大数量默认值为200也就是最大的并发数
minSpareThreads此池中始终保持活动状态的线程最小数量默认值为25
maxSpareThreads此池中始终保持活动状态的线程最大数量 prestartminSpareThreads启动连接池激活最小活跃线程minSpareThreads也同时生效
maxQueueSizeHTTP请求的最大的队列长度默认值是Integer.MAX_VALUE。-->
<!--连接器的设置-->
<Connector
port="8080"
protocol="org.apache.coyote.http11.Http11Nio2Protocol"
connectionTimeout="20000"
maxConnections="10000"
acceptCount="10000"
acceptorThreadCount="2"
enableLookups="false"
executor="tomcatThreadPool"
redirectPort="8443"
/>
<!--
connectionTimeout连接超时时间单位是毫秒
maxConnections服务器在任何给定时间接受和处理的最大连接数。请注意一旦达到限制
操作系统仍然可以接受基于acceptCount设置的连接。默认值因连接器类型而异。
对于NIO和NIO2默认值为10000.对于APR /本机默认值为8192
acceptCount当连接不够时可以使用队列暂时存放HTTP请求队列满时收到的任何请求都将被拒绝。默认值是100
acceptorThreadCount每个连接可以获得的线程数最大不要超过2
enableLookups是否允许DNS查询
executor连接池的名字
redirectPort重定向端口-->
```
- 13. [[在请求中如何存储客户信息]]
- 14. [[如何防止表单重复提交]]
- 15. [[HTTP协议中GET与POST提交方法的区别在哪里]]
- 16. [[你对RestFul架构风格是如何理解的 平时都是怎么样的]]
- ### 2.5 Shiro
- 1. [[Shiro的执行流程]]
- ## 三阶段
- ### 1. RabbitMQ
- 请说说消息队列的工作模式有哪些
- MQ是如何保证消息不丢失的
- MQ的工作原理
- 如果保证用户一定能消费成功
- 延迟队列,死信队列的区别是什么
- 请说说RabbitMQ的优缺点
- 延迟队列如何实现
- 如果让你自己写个MQ服务器你的思路是什么 需要使用到什么技术
- 如何解决消息延时及过期失效的问题 如果有几百万条消息持续积压几小时,说说怎么解决
- 讲一下MQ服务器的推拉模式你在项目中是如何运用的
- rabbitmq怎么实现订单延迟支付
- 说一下怎么用rabbitmq实现取消订单的用户积分减少的
- MQ是什么 你用过哪个 怎么配置的
- Redis
- 什么是接口幂等性,如何保证接口幂等性操作
- 幂等性问题会出现在哪些地方
- Redis支持的数据类型
- Redis的持久化方式以及各自的区别项目中用的哪一种怎么配置的
- 如何保证与数据库的双写一致性
- 缓存穿透,击穿,雪崩对应的解决方案是什么
- 使用的Redis是集群的嘛 有多少个节点,采用的是那种集群方案
- 说一下Reddis怎么做集群的
- Redis 都有哪些使用场景
- Redis 有哪些功能
- 分布式锁的目的
- 为什么要用redis不用map
- Redis是原子性的吗 是线程安全的吗 多线程还是单线程
- Redis的特性是哪些可以用来干嘛
- 项目中你们部署了多少台Redis服务器一般配置多少台熟悉哨兵机制么
- 假设你redis里面有9个商品我现在有10人来买怎么防止超卖问题
- Redis的单线程原理是什么 如果有10个用户同时操作Redis那么Redis是否按照先后顺序来处理情况
- Redis的分布式锁用过没 描述一下
- Redis设置永不过期也可以解决缓存击穿为什么还要用分布式锁
- Redis如何保证与数据库的数据一致性问题
- 红锁是怎么实现的 原理是什么
- 知道Redis的看门狗机制么为什么要用到看门狗
- Redis的5种数据类型分别的使用场景
- Redis集群知道么如何实现
- Redis持久化机制中AOF与RDB区别在哪里
- Redis如何配置RDB
- ES
- ES怎么保持和数据库的一致性
- ES怎么配权重 可以做数据库吗
- ES实现全文检索的原理是什么
- ES查询一个张三李四。张三名字可能会重复要按照张三的生日去进行排序这个ES语句怎么写
- Linux
- 用过的Linux系统都有哪些 什么版本
- chmod 改用户组的权限
- 如果你在linux部署的项目出现报错时你需要定位报错信息在哪怎么做
- nginx反向代理原理
- Nginx的负载均衡策略
- Linux如何查看资源的使用情况
- chmod如何改用户组的权限
- 3.5.VUE
- 1、Vue的生命周期是什么都有哪些钩子函数
- 2、谈谈MVC架构与MVVM架构的区别在哪里
- 3、VUE都有哪些组件
- 四阶段
- SpringCloud
- 服务熔断和服务降级,项目是如何运用的
- 你们通过哪些手段处理系统的高并发问题
- 项目中,关于鉴权你们是咋做的
- Nacos 与 Eureka的区别
- 分布式事务的原理
- 为什么选择Seata来处理分布式事务
- 说说项目开发流程
- SpringCloud体系的几大组件
- 讲一下spring cloud 中的服务注册的机制和配置方法
- feign远程调用的时候如何确保feign接口的参数和controller层方法参数一致
- 你觉得SpringCloud相比传统的SpringMVC有什么优势
- 说一下熔断器,你怎么用的,代码怎么写的
- 做集群的时候事务怎么处理
- 网关限流时,采用什么技术,使用什么限流算法 咋配置
- 分布式高并发下的订单id是如何生成的
- 介绍一下spring,springboot,springcloud
- openfeign的工作原理是如何调用服务的
- Feign远程调用的时候如何确保Feign接口的参数和Controller层方法参数一致
- 为什么要使用微服务,它的优缺点
- 微服务的搭建步骤
- 微服务组件都用过哪些,你们微服务的业务逻辑是什么样子的
- Eureka如何搭建如何才能规避因为网络原因导致客户端大面积下线的情况
- Eureka高可用怎么配置
- 了解网关么,网关的作用是什么,你都在网关中配置过什么内容
- 网关限流如何配置 限流算法都用过哪些
- 网关是如何找到其他微服务的
- Eureka关闭之后其他的微服务之间还能调用么
- Nginx都配置过什么 如何做负载配置,都哪些负载算法
- Ngnix代理配置是在哪个文件
- Mysql的ini文件都有些参数可以配置
- Mybatis和MybatisPlus 你在项目中,哪个用的较多
- 有哪些方法可以防止微服务接口被攻击
- 4.2.Seata
- 1、什么是分布式事务项目中哪些地方遇到分布式事务
- 2、什么是2阶段提交Seata是如何做2阶段提交的
- 3、Seata是三大核心组件是哪些他们分别的作用是什么
- 4、Seata的AT模式与TCC模式区别在哪里
- 5、AT模式在运行过程中如何进行2阶段处理的
- 6、分布式事务的两个理论特性 是什么
- 7、请说一下Seata的执行流程
- 4.3.Alibaba组件
- 1、说说nacos吧
- 2、
- 其他问题
- 你在项目中遇到的最大问题是什么 如何解决的
- 项目部署没有 有没有经过压力测试 有没有经过渗透测试
- 用过哪些经典的设计模式,谈谈你对它们的理解
- 假如1个接口的QPS只有10,超过10会怎样 如何解决
- 在使用git的过程中遇到冲突你是如何处理的
- 单点登录的实现原理
- 如何防止后端接口被攻击
- 每天1万人访问主页并发量有多少
- 负载均衡怎么实现
- 你们开发规范是什么,具体开发流程是什么,需求分析谁做,原型设计怎么来的
- 测试怎么做的
- 项目中有哪些设计是存在缺陷或者不合理的
- 你熟悉秒杀流程 那么秒杀如何保证数据一致性
- 你们项目上线前会在哪里测试 怎么部署的 多个环境你该怎么设置
- 大佬跟你讲的东西,你怎么判断正不正确
- 三层架构是哪三层 具体说说,你知道它们分别对应的架构模式采用的是什么么
- 在生成订单过程中如果MySQL崩了怎么办
- 能详细说下非对称加密的流程吗
- 生产环境中应用有问题如何分析问题
- GIT回退上个版本用什么命令 切换分支用哪个命令

View File

@@ -0,0 +1,554 @@
- ## 一阶段
- ### 1.1 集合
collapsed:: true
- 1. [[HashMap和ConcurrentHashMap的区别]]
- 2. [[线程安全的集合有哪些]]
- 3. [[如何做到集合变遍历,边删除]]
- 4. [[HashMap的底层原理是什么如何扩容并解决Hash碰撞的]]
- 5. [[HashMap在什么情况下单链表需要转为红黑树]]
- 6. [[ConcurrentHashMap为什么是线程安全的如何做到的]]
- 7. [[是否写过HashMap的底层了解过什么]]
- 8. [[Collection集合和Map体系集合的区别]]
- 9. [[HashMap在JDK1.7和JDK1.8的区别]]
- 10. [[HashSet的去重原理]]
- 11. [[写个时间复杂度为On的算法找到一个数列第二大的数]]
- 12. [[Collection 和 Collections 的区别是啥]]
- 13. [[如何获得Map集合中的所有的Key]]
- 14. [[HashMap 什么情况下会产生死锁的问题如何解决]]
- 15. [[如何使用jdk1.8新特性从商品集合中单独把某一个字段(比如id)拿出来当做一个集合]]
- 16. [[ArrayList和LinkedList的区别]]
- 17. [[遍历Set和List的通用方法]]
- 18. [[有几种方法可以遍历JAVA集合]]
- 19. [[ArrayList哪些操作效率较高]]
- 20. [[HashMap为什么要重写hashcode]]
- 21. [[JDK中有哪些队列]]
- 22. [[HashMap 和 Hashtable 有什么区别]]
- 23. [[List、Set、map区别]]
- 24. [[HashMap的put方法的执行过程]]
- 25. [[分析HashMap为什么线程不安全]]
- 26. [[集合的分类,分别的特性是哪些]]
- 27. [[给你一个数值类型数组,如何以最快的方式,查找到某一个元素]]
- 28. [[编程题给你一个整数数组进行排序输入一个k从小到大输出k个数]]
- 29. [[有个数组,如何颠倒所有的元素]]
- 30. [[银行系统我给你168的数字你应该给我多少张不同面额的人民币(口述如何实现)]]
- 31. [[HashMap的底层是如何解决Hash碰撞的]]
- 32. [[Collection 和 Collections 有什么区别]]
- 33. [[数组,链表,哪个查询效率高,为什么高]]
- 34. [[CurrentHashMap的在JDK1.7和1.8期间分别的特征]]
- 35. [[自旋锁的特征]]
- 36. [[遍历Set和List的通用方法]]
- 37. [[数组的排序算法,你都知道哪些请列举并手写一个出来]]
- ### 1.2 多线程
collapsed:: true
- 1. [[进程与线程的区别]]
- 2. [[为什么要用多线程]]
- 3. [[多线程的创建方式有哪些]]
- 4. [[是继承Thread类好还是实现Runnable接口好]]
- 5. [[ThreadLocal类是什么类]]
- 6. [[你项目中的哪些地方使用到多线程]]
- 7. [[什么是线程安全]]
- 8. [[如何解决多线程间线程安全问题]]
- 9. [[为什么使用同步或锁,就可以让多线程解决线程安全问题]]
- 10. [[什么是线程同步]]
- 11. [[什么是同步代码块]]
- 12. [[同步代码块和同步函数之间有什么区别]]
- 13. [[同步函数和静态同步函数之间有什么区别]]
- 14. [[什么是多线程死锁]]
- 15. [[wait() 和notify() 方法的区别]]
- 16. [[同步与异步的区别]]
- 17. [[线程的生命周期]]
- 18. [[线程同步的几个方法]]
- 19. [[并发与并行的区别]]
- 20. [[关于多线程锁升级的理解]]
- 21. [[怎么理解过程一致性和结果一致性]]
- 22. [[synchronized与Lock锁的区别]]
- 23. [[同步方法与同步块的区别]]
- 24. [[什么是线程池它的作用是什么]]
- 25. [[线程池有哪些核心参数]]
- 26. [[synchronized与乐观锁的区别]]
- 27. [[你是怎么创建线程池的]]
- 28. [[线程的原子性是什么]]
- 29. [[说说你对线程的3个特性原子可见有序的理解]]
- 30. [[sleep()和wait() 的区别]]
- 31. [[如何停止一根线程]]
- 32. [[什么是守护线程,如何做到]]
- 33. [[yield() 与 join() 方法的区别]]
- 34. [[什么是Volatile它的作用是什么]]
- 35. [[什么是AtomicInteger]]
- 36. [[你都知道哪些锁]]
- 提示:自旋锁,可重入锁,互斥锁,悲观锁,乐观锁,偏向锁,轻量级锁,重量级锁
- 37. [[线程是如何开始的]]
- 38. [[守护线程是什么如何实现]]
- 39. [[JDK1.8 针对synchronized都做过哪些优化]]
- ### 1.3 JVM
collapsed:: true
- 1. [[请说下Java的内存模型也就是JMM]]
- Java内存模型JMMJVM规范中定义了Java的内存模型Java Memory ModelJMM
- JMM主要分为2个部分主内存以及每个线程的本地内存。
- ![image.png](../assets/image_1657070835023_0.png)
- JVM中运行的每个线程都拥有自己的线程栈线程栈包含了当前线程执行的方法调用相关信息我们也把它称作调用栈。随着代码的不断执行调用栈会不断变化。共享的对象我们会放置在堆中
- ![image.png](../assets/image_1657070883091_0.png)
- 现在的电脑一般都是多CPU的。那么多个CPU如何操作内存呢
- 现代计算机一般都有2个以上CPU而且每个CPU还有可能包含多个核心。因此如果我们的应用是多线程的话这些线程可能会在各个CPU核心中并行运行。
- ![image.png](../assets/image_1657070989302_0.png)
- 在CPU内部有一组CPU寄存器也就是CPU的储存器。CPU操作寄存器的速度要比操作计算机主存快的多。在主存和CPU寄存器之间还存在一个CPU缓存CPU操作CPU缓存的速度快于主存但慢于CPU寄存器。某些CPU可能还有多个缓存层一级缓存和二级缓存。计算机的主存也称作RAM所有的CPU都能够访问主存而且主存比上面提到的缓存和寄存器大很多。
- 当一个CPU需要访问主存时会先读取一部分主存数据到CPU缓存进而在读取CPU缓存到寄存器。当CPU需要写数据到主存时同样会先flush寄存器到CPU缓存然后再在某些节点把缓存数据flush到主存
- 2. [[请说下JVM的运行时的内存结构]]
- JDK1.8以前:
- ![image.png](../assets/image_1657071088825_0.png)
- JDK1.8以后:
- ![image.png](../assets/image_1657071125303_0.png)
- JDK1.8中,移除了方法区的概念,将类的类信息等元数据使用元数据区(或者叫:元空间)来进行存储。
- 但是程序计数器本地方法栈线程栈这3个部分依旧是线程所独有元空间还是被线程所共享
- 3. [[JVM虚拟机的原理]]
- 提示就是一台虚拟的机器。同样是一款软件用来执行一系列虚拟计算指令大体上虚拟机可以分为系统虚拟机和程序虚拟机大名鼎鼎的Visual Box、Vmware就属于系统虚拟机他们完全是对物理计算的仿真提供了一个可以运行完整操作系统的软件平台。
- 程序虚拟机典型代码就是Java虚拟机它专门为执行单个计算程序而计算在Java虚拟机中执行的指令我们成为Java自己码指令。无论是系统虚拟机还是程序虚拟机在上面运行的软件都被限制于虚拟机提供的资源中。目前Java使用最广泛的是HotSpot虚拟机。
- 4. [[什么是虚拟机参数配置 你是否配置过 在哪里配置]]
- 提示:
- 虚拟机参数配置,其实就是围绕着堆、栈、方法区的内存空间大小进行配置。
- 其目的就是为了更高效更合理的利用虚拟机减少FullGC的次数提升内存的利用率
- 配置方式多种可在tomcat的bin目录下的catalina.bat中配置也可以在开发工具中配置
- 5. [[都有哪些堆的参数,可以配置]]
- 提示:
- -XX:+PrintGC    每次触发GC的时候打印相关日志
- -XX:+UseSerialGC 串行回收
- -XX:+PrintGCDetails  更详细的GC日志
- -Xms    堆初始值
- -Xmx    堆最大可用值
- -Xmn    新生代堆最大可用值
- -XX:SurvivorRatio 用来设置新生代中eden空间和from/to空间的比例.
- 含以-XX:SurvivorRatio=eden/from=den/to
- 总结:在实际工作中,我们可以直接将初始的堆大小与最大堆大小相等,
- 这样的好处是可以减少程序运行时垃圾回收次数,从而提高效率。
- -XX:SurvivorRatio 用来设置新生代中eden空间和from/to空间的比例.
- 6. [[如何设置最大堆空间大小]]
- 提示:
- 参数: -Xms20m -Xmx20m -XX:+PrintGCDetails -XX:+UseSerialGC -XX:+PrintCommandLineFlags
- 7. [[设置新生代与老年代优化参数]]
- 提示:
- -Xmn    新生代大小一般设为整个堆的1/3到1/4左右
- -XX:SurvivorRatio    设置新生代中eden区和from/to空间的比例关系n/1 默认是8:1:1
- 参数: -Xms20m -Xmx20m -Xmn5m -XX:SurvivorRatio=8 -XX:+PrintGCDetails -XX:+UseSerialGC
- 8. [[设置新生与老年代代参数]]
- 提示:
- -Xms20m -Xmx20m -XX:SurvivorRatio=8 -XX:+PrintGCDetails -XX:+UseSerialGC
- -XX:NewRatio=2
- 总结:不同的堆分布情况,对系统执行会产生一定的影响,在实际工作中,
- 应该根据系统的特点做出合理的配置,基本策略:尽可能将对象预留在新生代,
- 减少老年代的GC次数。
- 除了可以设置新生代的绝对大小(-Xmn),可以使用(-XX:NewRatio)设置新生代和老年
- 代的比例:-XX:NewRatio=老年代/新生代
- 9. [[内存溢出你是咋解决的]]
- 提示:
- 错误原因: java.lang.OutOfMemoryError: Java heap space
- 解决办法:设置堆内存大小 -Xms1m -Xmx70m -XX:+HeapDumpOnOutOfMemoryError
- 10. [[栈溢出你是咋解决的]]
- 提示:
- 错误原因: java.lang.StackOverflowError
- 栈溢出 产生于递归调用,循环遍历是不会的,但是循环方法里面产生递归调用, 也会发生栈溢出。
- 解决办法:设置线程最大调用深度
- -Xss5m 设置最大调用深度
- 11. [[Tomcat内存溢出在catalina.sh 修改JVM堆内存大小]]
- 提示:
- JAVA_OPTS="-server -Xms800m -Xmx800m -XX:PermSize=256m -XX:MaxPermSize=512m -XX:MaxNewSize=512m"
- 12. [[内存泄漏与内存溢出的区别]]
- 提示:
- 内存溢出 out of memory是指程序在申请内存时没有足够的内存空间供其使用出现out of memory比如申请了一个integer,但给它存了long才能存下的数那就是内存溢出。
- 内存泄露 memory leak是指程序在申请内存后无法释放已申请的内存空间一次内存泄露危害可以忽略但内存泄露堆积后果很严重无论多少内存,迟早会被占光。
- memory leak会最终会导致out of memory
- 内存溢出就是你要求分配的内存超出了系统能给你的,系统不能满足需求,于是产生溢出。 

内存泄漏是指你向系统申请分配内存进行使用(new),可是使用完了以后却不归还(delete)结果你申请到的那块内存你自己也不能再访问也许你把它的地址给弄丢了而系统也不能再次将它分配给需要的程序。一个盘子用尽各种方法只能装4个果子你装了5个结果掉倒地上不能吃了。这就是溢出比方说栈栈满时再做进栈必定产生空间溢出叫上溢栈空时再做退栈也产生空间溢出称为下溢。就是分配的内存不足以放下数据项序列,称为内存溢出. 以发生的方式来分类内存泄漏可以分为4类 1. 常发性内存泄漏。发生内存泄漏的代码会被多次执行到每次被执行的时候都会导致一块内存泄漏。 2. 偶发性内存泄漏。发生内存泄漏的代码只有在某些特定环境或操作过程下才会发生。常发性和偶发性是相对的。对于特定的环境偶发性的也许就变成了常发性的。所以测试环境和测试方法对检测内存泄漏至关重要。 3. 一次性内存泄漏。发生内存泄漏的代码只会被执行一次或者由于算法上的缺陷导致总会有一块仅且一块内存发生泄漏。比如在类的构造函数中分配内存在析构函数中却没有释放该内存所以内存泄漏只会发生一次。 4. 隐式内存泄漏。程序在运行过程中不停的分配内存,但是直到结束的时候才释放内存。严格的说这里并没有发生内存泄漏,因为最终程序释放了所有申请的内存。但是对于一个服务器程序,需要运行几天,几周甚至几个月,不及时释放内存也可能导致最终耗尽系统的所有内存。所以,我们称这类内存泄漏为隐式内存泄漏。 

从用户使用程序的角度来看,内存泄漏本身不会产生什么危害,作为一般的用户,根本感觉不到内存泄漏的存在。真正有危害的是内存泄漏的堆积,这会最终消耗尽系统所有的内存。从这个角度来说,一次性内存泄漏并没有什么危害,因为它不会堆积,而隐式内存泄漏危害性则非常大,因为较之于常发性和偶发性内存泄漏它更难被检测到
- 13. [[JVM参数调优的总结]]
- 提示:
- 在JVM启动参数中可以设置跟内存、垃圾回收相关的一些参数设置默认情况不做任何设置JVM会工作的很好但对一些配置很好的Server和具体的应用必须仔细调优才能获得最佳性能。通过设置我们希望达到一些目标
- 1. GC的时间足够的小
- 2. GC的次数足够的少
- 3. 发生Full GC的周期足够的长
- 前两个目前是相悖的要想GC时间小必须要一个更小的堆要保证GC次数足够少必须保证一个更大的堆我们只能取其平衡。
- 1. 针对JVM堆的设置一般可以通过-Xms -Xmx限定其最小、最大值为了防止垃圾收集器在最小、最大之间收缩堆而产生额外的时间我们通常把最大、最小设置为相同的值
- 2. 年轻代和年老代将根据默认的比例12分配堆内存可以通过调整二者之间的比率NewRadio来调整二者之间的大小也可以针对回收代比如年轻代通过 -XX:newSize -XX:MaxNewSize来设置其绝对大小。同样为了防止年轻代的堆收缩我们通常会把-XX:newSize -XX:MaxNewSize设置为同样大小
- 3. 年轻代和年老代设置多大才算合理 毫无疑问是没有答案的,否则也就不会有调优。我们观察一下二者大小变化有哪些影响
- 1. 更大的年轻代必然导致更小的年老代大的年轻代会延长普通GC的周期但会增加每次GC的时间小的年老代会导致更频繁的Full GC
- 2. 更小的年轻代必然导致更大年老代小的年轻代会导致普通GC很频繁但每次的GC时间会更短大的年老代会减少Full GC的频率
- 3. 如何选择应该依赖应用程序对象生命周期的分布情况:如果应用存在大量的临时对象,应该选择更大的年轻代;如果存在相对较多的持久对象,年老代应该适当增大。但很多应用都没有这样明显的特性,在抉择时应该根据以下两点:
- 1. 本着Full GC尽量少的原则让年老代尽量缓存常用对象JVM的默认比例12也是这个道理
- 2. 通过观察应用一段时间看其他在峰值时年老代会占多少内存在不影响Full GC的前提下根据实际情况加大年轻代比如可以把比例控制在11。但应该给年老代至少预留1/3的增长空间
- ### 1.4 GC
collapsed:: true
- 1. [[说说你对Java的GC回收机制的理解]]
- 提示:
- Java语言有个特征安全性就是指Java程序员摆脱了C++ 程序员关于内存管理的问题。使得Java程序员在编写程序时不需要通过指针操作内存同时也不需要再去关注内存何时将会被回收清理。这一切都是因为有的GC回收机制的功劳。
- ### 1.5 MySQL
collapsed:: true
- 1. [[项目中SQL调优的场景有哪些数据库调优如何做]]
- 2. [[最多有过几张表的连表处理]]
- 3. [[为什么选择MySQL5.7而不用5.5 5.6]]
- 4. [[数据库中Btree 与Hash索引的区别]]
- 5. [[什么是数据库回表,如何避免回表查询]]
- 6. [[InnoDB的行级锁什么情况下会使用]]
- 7. [[数据库中如何快速插入100W级数据]]
- 8. [[联合索引与普通索引的区别在哪里]]
- 9. [[有张100W级的表中存在大量的重复数据如何快速去重]]
- 10. [[数据库中复合索引的字段中可以有null值吗]]
- 11. [[数据库中两张表如何要联合查询,要如何实现]]
- 12. [[mysql数据库索引是用什么数据结构存储的]]
- 13. [[事务在什么情况下会失效]]
- 14. [[怎么用Sql语句复制另一张表]]
- 15. [[数据库连表查询,左外联,右外联,内联查的区别]]
- 16. [[sql语句过慢怎么定位问题]]
- 17. [[说一下JDBC在连接数据库的操作上几个步骤]]
- 18. [[Like 后 加% 和 加_ 的区别在哪里]]
- 19. [[说一下事务的隔离级别和事务的传播性质]]
- 20. [[说一下怎么防止超卖SQL怎么写]]
- 21. [[如果给你一个功能,你觉得从数据库设计开始的思路是什么]]
- 22. [[说一下 ACID 是什么]]
- 23. [[数据库用户ID主键策略]]
- 24. [[数据库的执行计划]]
- 25. [[JDBC如何提升读取数据的性能]]
- 26. [[select count(*) ,select count(1),select count(字段) 说一下区别]]
- 27. [[索引失效的场景有哪些]]
- 28. [[数据库的SQL语句如何加锁]]
- 29. [[数据库中哪些字段适合加索引 ,哪些不适合加索引]]
- 30. [[什么是聚簇索引,什么是非聚簇索引]]
- 31. [[Union 和 union all 的区别是什么]]
- 32. [[什么是SQL注入如何防止]]
- 33. [[关闭连接一定能成功吗 怎么保证一定成功关闭连接]]
- 34. [[有哪些地方必须关闭资源]]
- 35. [[有没有设计过数据库 数据库三范式讲一下]]
- 36. [[In 与 exits 的区别是什么]]
- 37. [[MySQL中存储引擎InnoDB,MyIsam的区别在哪里]]
- 38. [[MySQL中锁机制]]
- 39. [[数据库中复合索引的字段中可以有null值吗]]
- 40. [[MySQL数据库的my.ini文件中可以配置什么参数]]
-在mysql的安装根目录中创建一个文件my.ini编写以下内容
- ```ini
#client mysql 都是设置客户端
[client]
#port参数表示的是MySQL数据库的端口默认的端口是3306
port=3306
[mysql]
#default-character-set参数是客户端默认的字符集
default-character-set=utf8
#mysqld 设置服务端
[mysqld]
#port参数也是表示数据库的端口
port=3306
#basedir参数表示MySQL的安装路径
basedir="C:/Program Files/MySQL/MySQL Server 5.7/"
#datadir参数表示MySQL数据文件的存储位置,也是数据库表的存放位置
datadir="C:/ProgramData/MySQL/MySQL Server 5.7/Data/"
#default-character-set参数表示默认的字符集这个字符集是服务器端的
character-set-server=utf8
#default-storage-engine参数默认的存储引擎
default-storage-engine=INNODB
#sql-mode参数表示SQL模式的参数通过这个参数可以设置检验SQL语句的严格程度
sql-mode="STRICT_TRANS_TABLES,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION"
#max_connections参数表示允许同时访问MySQL服务器的最大连接数默认151最大值16384其中一个连接是保留的留给管理员专用的
max_connections=1000
#query_cache_size参数表示查询时的缓存大小缓存中可以存储以前通过select语句查询过的信息再次查询时就可以直接从缓存中拿出信息
query_cache_size=0
#table_cache参数表示所有进程打开表的总数
table_cache=256
#tmp_table_size参数表示内存中临时表的总数
tmp_table_size=35M
#thread_cache_size参数表示保留客户端线程的缓存
thread_cache_size=8
#myisam_max_sort_file_size参数表示MySQL重建索引时所允许的最大临时文件的大小
myisam_max_sort_file_size=100G
#myisam_sort_buffer_size参数表示重建索引时的缓存大小
myisam_sort_buffer_size=69M
#key_buffer_size参数表示关键词的缓存大小
key_buffer_size=55M
#read_buffer_size参数表示MyISAM表全表扫描的缓存大小
read_buffer_size=64K
#read_rnd_buffer_size参数表示将排序好的数据存入该缓存中
read_rnd_buffer_size=256K
#sort_buffer_size参数表示用于排序的缓存大小
sort_buffer_size=256K
#innodb_additional_mem_pool_size参数表示附加的内存池用来存储InnoDB表的内容
innodb_additional_mem_pool_size=3M
#innodb_flush_log_at_trx_commit参数是设置提交日志的时机若设置为1
#InnoDB会在每次提交后将事务日志写到磁盘上
innodb_flush_log_at_trx_commit=1
#innodb_log_buffer_size参数表示用来存储日志数据的缓存区的大小
innodb_log_buffer_size=2M
#innodb_buffer_pool_size参数表示缓存的大小InnoDB使用一个缓冲池类保存索引和原始数据
innodb_buffer_pool_size=107M
#innodb_log_file_size参数表示日志文件的大小
innodb_log_file_size=54M
#innodb_thread_concurrency参数表示在InnoDB存储引擎允许的线程最大数
innodb_thread_concurrency=18
```
- ### 1.6 Mybatis
- 1. [[#{} 与 ${} 的区别]]
- 2. [[Mybatis的实现原理]]
- 3. [[Mybatis级联的配置]]
- 4. [[Mybatis的一二级缓存是什么样的]]
- 5. [[Mybits的缺点有哪些]]
- 6. [[Mybatis如何防止SQL注入]]
- ### 1.7 网络编程
- 1. [[什么是Socket编程]]
- 2. [[TCP与UDP在概念上的区别]]
- 3. [[TCP协议的特点你能说说吗 具体说说3次握手4次挥手的过程]]
- 4. [[OSI七层模型大概了解么]]
- ### 1.8 设计原则与设计模式
- 1. [[7大设计原则有哪些]]
- 2. [[什么是设计模式,有多少个]]
- 3. [[单例设计模式,你会手写么 在项目中哪些地方有应用]]
- 4. [[代理设计模式中,静态代理和动态代理的区别]]
- 5. [[动态代理中JDK代理和CGLIB代理区别 代理模式,在项目中哪些地方有应用]]
- 6. [[工厂设计模式的作用 简单工厂会写不 在项目中哪些地方有应用]]
- 7. [[如何克隆一个对象 浅克隆与深克隆区别在哪里]]
- 8. [[设计模式中,工厂设计模式有啥用 项目中在哪些地方用过]]
- ### 1.9 其它题目
- 1. [[异常的分类,如何自定义异常]]
- 2. [[普通类和抽象类有哪些区别]]
- 3. [[讲讲类的加载过程以及双亲委派机制]]
- 4. [[JDK1.8的新特性,你都用过哪些]]
- 5. [[网络通讯中tcp协议udp协议的区别]]
- 6. [[普通类和抽象类的区别 接口和抽象的区别]]
- 7. [[常用操作字符串有哪些类 StringBuffer,StringBuilder]]
- 8. [[StringStringBuffer及StringBuilder的区别]]
- 9. [[如何跳出多重循环]]
- 10. [[什么是反射]]
- 11. [[final 在 Java 中有什么作用]]
- 12. [[说一下你熟悉的设计模式]]
- 13. [[谈谈面向对象]]
- 14. [[谈谈多线程并发]]
- 15. [[什么是Java的反射]]
- 16. [[Java的反射在哪些地方有过应用]]
- 17. [[反射获得Class对象的3种方式]]
- 18. [[反射操作私有属性时,需要注意什么]]
- 19. [[抽象类可以继承实体类么]]
- 20. [[抽象类可以继承接口么]]
- 21. [[接口可以继承抽象类么]]
- 22. [[IO流的分类有哪些]]
- 23. [[谈谈BIO,NIO,AIO的区别是什么你都用过哪些IO框架]]
- 24. [[Object类的常见方法都有哪些]]
- 25. [[Java中异常的分类分别说说都哪些具体的异常]]
- 26. [[遇到BUG你是如何调试的]]
- 27. [[如果运行结果跟预期不一样,但是代码没报错,怎么处理]]
- 28. [[有没有用过断点调试 怎么用的]]
- 29. [[JDKJREJVM的区别]]
- 30. [[重写和重载的区别在哪里]]
- ## 二阶段
- ### 2.1 Spring
- 1. [[对springIOC的理解]]
- 2. [[讲下springAOP项目中你是如何应用的]]
- 3. [[动态代理模式中JDK与CGLIB的区别]]
- 4. [[Spring的循环依赖问题如何解决]]
- 5. [[谈谈你对Spring bean的生命周期的理解]]
- 6. [[Spring中对事务的支持有哪些方式 你项目中如何处理事务]]
- 7. [[Spring中bean基本都是单例的如果一个方法要对bean中的属性值进行修改这个方法会被多次执行怎么确保安全]]
- 8. [[讲一下浅克隆与深克隆]]
- 9. [[@Resource和@Autowired的区别]]
- 10. [[介绍一下你的项目AOP日志功能如何实现的]]
- 11. [[Spring依赖注入的方式有哪些 有区别么]]
- 12. [[Spring的常用注解都有哪些]]
- 13. [[Spring 事务实现方式有哪些]]
- 14. [[BeanFactory 和 ApplicationContext的区别]]
- 15. [[Spring中bean基本都是单例的如果一个方法要对bean中的属性值进行修改这个方法会被多次执行怎么确保安全]]
- 16. [[Spring实例化组件时,如何设置属性]]
- ### 2.2 SpringMVC
- 1. [[SpringMVC框架的工作流程]]
- 2. [[forward和redirect的区别]]
- 3. [[说一下@requestMapping的作用]]
- 4. [[知道拦截器么,你项目中哪里使用过拦截器]]
- 5. [[Springmvc 过滤器 拦截器的使用场景和区别是什么]]
- ### 2.3 SpringBoot
- 1. [[SpringBoot如何实现自动配置 原理是什么]]
- 2. [[SpringBoot的web模块自动集成了Tomcat如何剔除]]
- 3. [[说说你常用的几个SpringBoot注解]]
- 4. [[你上个项目用的SpringBoot版本是那个版本的]]
- 5. [[SpringBoot主要的配置类有哪些]]
- 6. [[Spring,Springmvc,SpringBoot的区别是啥]]
- 7. [[可不可以配置两个数据源 比如一个mysql和一个oracle 在哪里配置,怎么配置]]
- 8. [[SpringBoot在yaml中配置了开发环境配置文件和测试配置文件有几种方式在不同环境去使用不同的配置文件]]
- 9. [[SpringBoot的优点在哪里]]
- 10. [[当application.properties,application.yaml,bootstrap.yaml文件同时存在的情况下它们的执行顺序是怎样的]]
- 11. [[Spring的启动流程是怎么样的]]
- ### 2.4 Web题
- 1. [[HTTPS 通讯协议是如何实现的 它的加密方式是什么]]
- 2. [[在HTTP请求中如何存储客户信息(分如何获取和如何存储)]]
- 3. [[Ajax怎么实现同步]]
- 4. [[你们项目中,使用的什么 数据交换格式]]
- 5. [[HTTP通讯协议分为几个部分 请求协议的组成]]
- 6. [[JSON的解析框架你用过什么]]
- 7. [[XML与JSON之间的区别]]
- 8. [[页面加载很慢,有什么优化方案]]
- 9. [[重定向和请求转发的区别是什么]]
- 10. [[JSON格式长什么样 那么JSONArray呢]]
- 11. [[Servlet的生命周期]]
- 12. [[Tomcat如何配置连接池 默认连接数是多少 == 生产环境Tomcat性能比较差如何调优]]
- 答修改conf目录下的server.xml即可实现
- ```xml
<!--线程池的设置-->
<Executor executor="tomcatThreadPool"
namePrefix="catalina-exec-"
maxThreads="500"
minSpareThreads="100"
maxSpareThreads="500"
prestartminSpareThreads="true"
maxQueueSize="10000"
/>
<!--name连接池名称
namePrefix连接池创建的每个线程的名称前缀。单个线程的线程名称将为namePrefix + threadNumber
maxThreads此池中活动线程的最大数量默认值为200也就是最大的并发数
minSpareThreads此池中始终保持活动状态的线程最小数量默认值为25
maxSpareThreads此池中始终保持活动状态的线程最大数量 prestartminSpareThreads启动连接池激活最小活跃线程minSpareThreads也同时生效
maxQueueSizeHTTP请求的最大的队列长度默认值是Integer.MAX_VALUE。-->
<!--连接器的设置-->
<Connector
port="8080"
protocol="org.apache.coyote.http11.Http11Nio2Protocol"
connectionTimeout="20000"
maxConnections="10000"
acceptCount="10000"
acceptorThreadCount="2"
enableLookups="false"
executor="tomcatThreadPool"
redirectPort="8443"
/>
<!--
connectionTimeout连接超时时间单位是毫秒
maxConnections服务器在任何给定时间接受和处理的最大连接数。请注意一旦达到限制
操作系统仍然可以接受基于acceptCount设置的连接。默认值因连接器类型而异。
对于NIO和NIO2默认值为10000.对于APR /本机默认值为8192
acceptCount当连接不够时可以使用队列暂时存放HTTP请求队列满时收到的任何请求都将被拒绝。默认值是100
acceptorThreadCount每个连接可以获得的线程数最大不要超过2
enableLookups是否允许DNS查询
executor连接池的名字
redirectPort重定向端口-->
```
- 13. [[在请求中如何存储客户信息]]
- 14. [[如何防止表单重复提交]]
- 15. [[HTTP协议中GET与POST提交方法的区别在哪里]]
- 16. [[你对RestFul架构风格是如何理解的 平时都是怎么样的]]
- ### 2.5 Shiro
- 1. [[Shiro的执行流程]]
- ## 三阶段
- ### 3.1 RabbitMQ
- 请说说消息队列的工作模式有哪些
- MQ是如何保证消息不丢失的
- MQ的工作原理
- 如果保证用户一定能消费成功
- 延迟队列,死信队列的区别是什么
- 请说说RabbitMQ的优缺点
- 延迟队列如何实现
- 如果让你自己写个MQ服务器你的思路是什么 需要使用到什么技术
- 如何解决消息延时及过期失效的问题 如果有几百万条消息持续积压几小时,说说怎么解决
- 讲一下MQ服务器的推拉模式你在项目中是如何运用的
- rabbitmq怎么实现订单延迟支付
- 说一下怎么用rabbitmq实现取消订单的用户积分减少的
- MQ是什么 你用过哪个 怎么配置的
- ### 3.2 Redis
- 什么是接口幂等性,如何保证接口幂等性操作
- 幂等性问题会出现在哪些地方
- Redis支持的数据类型
- Redis的持久化方式以及各自的区别项目中用的哪一种怎么配置的
- 如何保证与数据库的双写一致性
- 缓存穿透,击穿,雪崩对应的解决方案是什么
- 使用的Redis是集群的嘛 有多少个节点,采用的是那种集群方案
- 说一下Reddis怎么做集群的
- Redis 都有哪些使用场景
- Redis 有哪些功能
- 分布式锁的目的
- 为什么要用redis不用map
- Redis是原子性的吗 是线程安全的吗 多线程还是单线程
- Redis的特性是哪些可以用来干嘛
- 项目中你们部署了多少台Redis服务器一般配置多少台熟悉哨兵机制么
- 假设你redis里面有9个商品我现在有10人来买怎么防止超卖问题
- Redis的单线程原理是什么 如果有10个用户同时操作Redis那么Redis是否按照先后顺序来处理情况
- Redis的分布式锁用过没 描述一下
- Redis设置永不过期也可以解决缓存击穿为什么还要用分布式锁
- Redis如何保证与数据库的数据一致性问题
- 红锁是怎么实现的 原理是什么
- 知道Redis的看门狗机制么为什么要用到看门狗
- Redis的5种数据类型分别的使用场景
- Redis集群知道么如何实现
- Redis持久化机制中AOF与RDB区别在哪里
- Redis如何配置RDB
- ### 3.3 ES
- ES怎么保持和数据库的一致性
- ES怎么配权重 可以做数据库吗
- ES实现全文检索的原理是什么
- ES查询一个张三李四。张三名字可能会重复要按照张三的生日去进行排序这个ES语句怎么写
- ### 3.4Linux
- 用过的Linux系统都有哪些 什么版本
- chmod 改用户组的权限
- 如果你在linux部署的项目出现报错时你需要定位报错信息在哪怎么做
- nginx反向代理原理
- Nginx的负载均衡策略
- Linux如何查看资源的使用情况
- chmod如何改用户组的权限
- ### 3.5 VUE
- 1. Vue的生命周期是什么都有哪些钩子函数
- 2. 谈谈MVC架构与MVVM架构的区别在哪里
- 3. VUE都有哪些组件
- 四阶段
- 4.1 SpringCloud
- 服务熔断和服务降级,项目是如何运用的
- 你们通过哪些手段处理系统的高并发问题
- 项目中,关于鉴权你们是咋做的
- Nacos 与 Eureka的区别
- 分布式事务的原理
- 为什么选择Seata来处理分布式事务
- 说说项目开发流程
- SpringCloud体系的几大组件
- 讲一下spring cloud 中的服务注册的机制和配置方法
- feign远程调用的时候如何确保feign接口的参数和controller层方法参数一致
- 你觉得SpringCloud相比传统的SpringMVC有什么优势
- 说一下熔断器,你怎么用的,代码怎么写的
- 做集群的时候事务怎么处理
- 网关限流时,采用什么技术,使用什么限流算法 咋配置
- 分布式高并发下的订单id是如何生成的
- 介绍一下spring,springboot,springcloud
- openfeign的工作原理是如何调用服务的
- Feign远程调用的时候如何确保Feign接口的参数和Controller层方法参数一致
- 为什么要使用微服务,它的优缺点
- 微服务的搭建步骤
- 微服务组件都用过哪些,你们微服务的业务逻辑是什么样子的
- Eureka如何搭建如何才能规避因为网络原因导致客户端大面积下线的情况
- Eureka高可用怎么配置
- 了解网关么,网关的作用是什么,你都在网关中配置过什么内容
- 网关限流如何配置 限流算法都用过哪些
- 网关是如何找到其他微服务的
- Eureka关闭之后其他的微服务之间还能调用么
- Nginx都配置过什么 如何做负载配置,都哪些负载算法
- Ngnix代理配置是在哪个文件
- Mysql的ini文件都有些参数可以配置
- Mybatis和MybatisPlus 你在项目中,哪个用的较多
- 有哪些方法可以防止微服务接口被攻击
- 4.2.Seata
- 1、什么是分布式事务项目中哪些地方遇到分布式事务
- 2、什么是2阶段提交Seata是如何做2阶段提交的
- 3、Seata是三大核心组件是哪些他们分别的作用是什么
- 4、Seata的AT模式与TCC模式区别在哪里
- 5、AT模式在运行过程中如何进行2阶段处理的
- 6、分布式事务的两个理论特性 是什么
- 7、请说一下Seata的执行流程
- 4.3.Alibaba组件
- 1、说说nacos吧
- 2、
- 其他问题
- 你在项目中遇到的最大问题是什么 如何解决的
- 项目部署没有 有没有经过压力测试 有没有经过渗透测试
- 用过哪些经典的设计模式,谈谈你对它们的理解
- 假如1个接口的QPS只有10,超过10会怎样 如何解决
- 在使用git的过程中遇到冲突你是如何处理的
- 单点登录的实现原理
- 如何防止后端接口被攻击
- 每天1万人访问主页并发量有多少
- 负载均衡怎么实现
- 你们开发规范是什么,具体开发流程是什么,需求分析谁做,原型设计怎么来的
- 测试怎么做的
- 项目中有哪些设计是存在缺陷或者不合理的
- 你熟悉秒杀流程 那么秒杀如何保证数据一致性
- 你们项目上线前会在哪里测试 怎么部署的 多个环境你该怎么设置
- 大佬跟你讲的东西,你怎么判断正不正确
- 三层架构是哪三层 具体说说,你知道它们分别对应的架构模式采用的是什么么
- 在生成订单过程中如果MySQL崩了怎么办
- 能详细说下非对称加密的流程吗
- 生产环境中应用有问题如何分析问题
- GIT回退上个版本用什么命令 切换分支用哪个命令

View File

@@ -0,0 +1,554 @@
- ## 一阶段
- ### 1.1 集合
collapsed:: true
- 1. [[HashMap和ConcurrentHashMap的区别]]
- 2. [[线程安全的集合有哪些]]
- 3. [[如何做到集合变遍历,边删除]]
- 4. [[HashMap的底层原理是什么如何扩容并解决Hash碰撞的]]
- 5. [[HashMap在什么情况下单链表需要转为红黑树]]
- 6. [[ConcurrentHashMap为什么是线程安全的如何做到的]]
- 7. [[是否写过HashMap的底层了解过什么]]
- 8. [[Collection集合和Map体系集合的区别]]
- 9. [[HashMap在JDK1.7和JDK1.8的区别]]
- 10. [[HashSet的去重原理]]
- 11. [[写个时间复杂度为On的算法找到一个数列第二大的数]]
- 12. [[Collection 和 Collections 的区别是啥]]
- 13. [[如何获得Map集合中的所有的Key]]
- 14. [[HashMap 什么情况下会产生死锁的问题如何解决]]
- 15. [[如何使用jdk1.8新特性从商品集合中单独把某一个字段(比如id)拿出来当做一个集合]]
- 16. [[ArrayList和LinkedList的区别]]
- 17. [[遍历Set和List的通用方法]]
- 18. [[有几种方法可以遍历JAVA集合]]
- 19. [[ArrayList哪些操作效率较高]]
- 20. [[HashMap为什么要重写hashcode]]
- 21. [[JDK中有哪些队列]]
- 22. [[HashMap 和 Hashtable 有什么区别]]
- 23. [[List、Set、map区别]]
- 24. [[HashMap的put方法的执行过程]]
- 25. [[分析HashMap为什么线程不安全]]
- 26. [[集合的分类,分别的特性是哪些]]
- 27. [[给你一个数值类型数组,如何以最快的方式,查找到某一个元素]]
- 28. [[编程题给你一个整数数组进行排序输入一个k从小到大输出k个数]]
- 29. [[有个数组,如何颠倒所有的元素]]
- 30. [[银行系统我给你168的数字你应该给我多少张不同面额的人民币(口述如何实现)]]
- 31. [[HashMap的底层是如何解决Hash碰撞的]]
- 32. [[Collection 和 Collections 有什么区别]]
- 33. [[数组,链表,哪个查询效率高,为什么高]]
- 34. [[CurrentHashMap的在JDK1.7和1.8期间分别的特征]]
- 35. [[自旋锁的特征]]
- 36. [[遍历Set和List的通用方法]]
- 37. [[数组的排序算法,你都知道哪些请列举并手写一个出来]]
- ### 1.2 多线程
collapsed:: true
- 1. [[进程与线程的区别]]
- 2. [[为什么要用多线程]]
- 3. [[多线程的创建方式有哪些]]
- 4. [[是继承Thread类好还是实现Runnable接口好]]
- 5. [[ThreadLocal类是什么类]]
- 6. [[你项目中的哪些地方使用到多线程]]
- 7. [[什么是线程安全]]
- 8. [[如何解决多线程间线程安全问题]]
- 9. [[为什么使用同步或锁,就可以让多线程解决线程安全问题]]
- 10. [[什么是线程同步]]
- 11. [[什么是同步代码块]]
- 12. [[同步代码块和同步函数之间有什么区别]]
- 13. [[同步函数和静态同步函数之间有什么区别]]
- 14. [[什么是多线程死锁]]
- 15. [[wait() 和notify() 方法的区别]]
- 16. [[同步与异步的区别]]
- 17. [[线程的生命周期]]
- 18. [[线程同步的几个方法]]
- 19. [[并发与并行的区别]]
- 20. [[关于多线程锁升级的理解]]
- 21. [[怎么理解过程一致性和结果一致性]]
- 22. [[synchronized与Lock锁的区别]]
- 23. [[同步方法与同步块的区别]]
- 24. [[什么是线程池它的作用是什么]]
- 25. [[线程池有哪些核心参数]]
- 26. [[synchronized与乐观锁的区别]]
- 27. [[你是怎么创建线程池的]]
- 28. [[线程的原子性是什么]]
- 29. [[说说你对线程的3个特性原子可见有序的理解]]
- 30. [[sleep()和wait() 的区别]]
- 31. [[如何停止一根线程]]
- 32. [[什么是守护线程,如何做到]]
- 33. [[yield() 与 join() 方法的区别]]
- 34. [[什么是Volatile它的作用是什么]]
- 35. [[什么是AtomicInteger]]
- 36. [[你都知道哪些锁]]
- 提示:自旋锁,可重入锁,互斥锁,悲观锁,乐观锁,偏向锁,轻量级锁,重量级锁
- 37. [[线程是如何开始的]]
- 38. [[守护线程是什么如何实现]]
- 39. [[JDK1.8 针对synchronized都做过哪些优化]]
- ### 1.3 JVM
collapsed:: true
- 1. [[请说下Java的内存模型也就是JMM]]
- Java内存模型JMMJVM规范中定义了Java的内存模型Java Memory ModelJMM
- JMM主要分为2个部分主内存以及每个线程的本地内存。
- ![image.png](../assets/image_1657070835023_0.png)
- JVM中运行的每个线程都拥有自己的线程栈线程栈包含了当前线程执行的方法调用相关信息我们也把它称作调用栈。随着代码的不断执行调用栈会不断变化。共享的对象我们会放置在堆中
- ![image.png](../assets/image_1657070883091_0.png)
- 现在的电脑一般都是多CPU的。那么多个CPU如何操作内存呢
- 现代计算机一般都有2个以上CPU而且每个CPU还有可能包含多个核心。因此如果我们的应用是多线程的话这些线程可能会在各个CPU核心中并行运行。
- ![image.png](../assets/image_1657070989302_0.png)
- 在CPU内部有一组CPU寄存器也就是CPU的储存器。CPU操作寄存器的速度要比操作计算机主存快的多。在主存和CPU寄存器之间还存在一个CPU缓存CPU操作CPU缓存的速度快于主存但慢于CPU寄存器。某些CPU可能还有多个缓存层一级缓存和二级缓存。计算机的主存也称作RAM所有的CPU都能够访问主存而且主存比上面提到的缓存和寄存器大很多。
- 当一个CPU需要访问主存时会先读取一部分主存数据到CPU缓存进而在读取CPU缓存到寄存器。当CPU需要写数据到主存时同样会先flush寄存器到CPU缓存然后再在某些节点把缓存数据flush到主存
- 2. [[请说下JVM的运行时的内存结构]]
- JDK1.8以前:
- ![image.png](../assets/image_1657071088825_0.png)
- JDK1.8以后:
- ![image.png](../assets/image_1657071125303_0.png)
- JDK1.8中,移除了方法区的概念,将类的类信息等元数据使用元数据区(或者叫:元空间)来进行存储。
- 但是程序计数器本地方法栈线程栈这3个部分依旧是线程所独有元空间还是被线程所共享
- 3. [[JVM虚拟机的原理]]
- 提示就是一台虚拟的机器。同样是一款软件用来执行一系列虚拟计算指令大体上虚拟机可以分为系统虚拟机和程序虚拟机大名鼎鼎的Visual Box、Vmware就属于系统虚拟机他们完全是对物理计算的仿真提供了一个可以运行完整操作系统的软件平台。
- 程序虚拟机典型代码就是Java虚拟机它专门为执行单个计算程序而计算在Java虚拟机中执行的指令我们成为Java自己码指令。无论是系统虚拟机还是程序虚拟机在上面运行的软件都被限制于虚拟机提供的资源中。目前Java使用最广泛的是HotSpot虚拟机。
- 4. [[什么是虚拟机参数配置 你是否配置过 在哪里配置]]
- 提示:
- 虚拟机参数配置,其实就是围绕着堆、栈、方法区的内存空间大小进行配置。
- 其目的就是为了更高效更合理的利用虚拟机减少FullGC的次数提升内存的利用率
- 配置方式多种可在tomcat的bin目录下的catalina.bat中配置也可以在开发工具中配置
- 5. [[都有哪些堆的参数,可以配置]]
- 提示:
- -XX:+PrintGC    每次触发GC的时候打印相关日志
- -XX:+UseSerialGC 串行回收
- -XX:+PrintGCDetails  更详细的GC日志
- -Xms    堆初始值
- -Xmx    堆最大可用值
- -Xmn    新生代堆最大可用值
- -XX:SurvivorRatio 用来设置新生代中eden空间和from/to空间的比例.
- 含以-XX:SurvivorRatio=eden/from=den/to
- 总结:在实际工作中,我们可以直接将初始的堆大小与最大堆大小相等,
- 这样的好处是可以减少程序运行时垃圾回收次数,从而提高效率。
- -XX:SurvivorRatio 用来设置新生代中eden空间和from/to空间的比例.
- 6. [[如何设置最大堆空间大小]]
- 提示:
- 参数: -Xms20m -Xmx20m -XX:+PrintGCDetails -XX:+UseSerialGC -XX:+PrintCommandLineFlags
- 7. [[设置新生代与老年代优化参数]]
- 提示:
- -Xmn    新生代大小一般设为整个堆的1/3到1/4左右
- -XX:SurvivorRatio    设置新生代中eden区和from/to空间的比例关系n/1 默认是8:1:1
- 参数: -Xms20m -Xmx20m -Xmn5m -XX:SurvivorRatio=8 -XX:+PrintGCDetails -XX:+UseSerialGC
- 8. [[设置新生与老年代代参数]]
- 提示:
- -Xms20m -Xmx20m -XX:SurvivorRatio=8 -XX:+PrintGCDetails -XX:+UseSerialGC
- -XX:NewRatio=2
- 总结:不同的堆分布情况,对系统执行会产生一定的影响,在实际工作中,
- 应该根据系统的特点做出合理的配置,基本策略:尽可能将对象预留在新生代,
- 减少老年代的GC次数。
- 除了可以设置新生代的绝对大小(-Xmn),可以使用(-XX:NewRatio)设置新生代和老年
- 代的比例:-XX:NewRatio=老年代/新生代
- 9. [[内存溢出你是咋解决的]]
- 提示:
- 错误原因: java.lang.OutOfMemoryError: Java heap space
- 解决办法:设置堆内存大小 -Xms1m -Xmx70m -XX:+HeapDumpOnOutOfMemoryError
- 10. [[栈溢出你是咋解决的]]
- 提示:
- 错误原因: java.lang.StackOverflowError
- 栈溢出 产生于递归调用,循环遍历是不会的,但是循环方法里面产生递归调用, 也会发生栈溢出。
- 解决办法:设置线程最大调用深度
- -Xss5m 设置最大调用深度
- 11. [[Tomcat内存溢出在catalina.sh 修改JVM堆内存大小]]
- 提示:
- JAVA_OPTS="-server -Xms800m -Xmx800m -XX:PermSize=256m -XX:MaxPermSize=512m -XX:MaxNewSize=512m"
- 12. [[内存泄漏与内存溢出的区别]]
- 提示:
- 内存溢出 out of memory是指程序在申请内存时没有足够的内存空间供其使用出现out of memory比如申请了一个integer,但给它存了long才能存下的数那就是内存溢出。
- 内存泄露 memory leak是指程序在申请内存后无法释放已申请的内存空间一次内存泄露危害可以忽略但内存泄露堆积后果很严重无论多少内存,迟早会被占光。
- memory leak会最终会导致out of memory
- 内存溢出就是你要求分配的内存超出了系统能给你的,系统不能满足需求,于是产生溢出。 

内存泄漏是指你向系统申请分配内存进行使用(new),可是使用完了以后却不归还(delete)结果你申请到的那块内存你自己也不能再访问也许你把它的地址给弄丢了而系统也不能再次将它分配给需要的程序。一个盘子用尽各种方法只能装4个果子你装了5个结果掉倒地上不能吃了。这就是溢出比方说栈栈满时再做进栈必定产生空间溢出叫上溢栈空时再做退栈也产生空间溢出称为下溢。就是分配的内存不足以放下数据项序列,称为内存溢出. 以发生的方式来分类内存泄漏可以分为4类 1. 常发性内存泄漏。发生内存泄漏的代码会被多次执行到每次被执行的时候都会导致一块内存泄漏。 2. 偶发性内存泄漏。发生内存泄漏的代码只有在某些特定环境或操作过程下才会发生。常发性和偶发性是相对的。对于特定的环境偶发性的也许就变成了常发性的。所以测试环境和测试方法对检测内存泄漏至关重要。 3. 一次性内存泄漏。发生内存泄漏的代码只会被执行一次或者由于算法上的缺陷导致总会有一块仅且一块内存发生泄漏。比如在类的构造函数中分配内存在析构函数中却没有释放该内存所以内存泄漏只会发生一次。 4. 隐式内存泄漏。程序在运行过程中不停的分配内存,但是直到结束的时候才释放内存。严格的说这里并没有发生内存泄漏,因为最终程序释放了所有申请的内存。但是对于一个服务器程序,需要运行几天,几周甚至几个月,不及时释放内存也可能导致最终耗尽系统的所有内存。所以,我们称这类内存泄漏为隐式内存泄漏。 

从用户使用程序的角度来看,内存泄漏本身不会产生什么危害,作为一般的用户,根本感觉不到内存泄漏的存在。真正有危害的是内存泄漏的堆积,这会最终消耗尽系统所有的内存。从这个角度来说,一次性内存泄漏并没有什么危害,因为它不会堆积,而隐式内存泄漏危害性则非常大,因为较之于常发性和偶发性内存泄漏它更难被检测到
- 13. [[JVM参数调优的总结]]
- 提示:
- 在JVM启动参数中可以设置跟内存、垃圾回收相关的一些参数设置默认情况不做任何设置JVM会工作的很好但对一些配置很好的Server和具体的应用必须仔细调优才能获得最佳性能。通过设置我们希望达到一些目标
- 1. GC的时间足够的小
- 2. GC的次数足够的少
- 3. 发生Full GC的周期足够的长
- 前两个目前是相悖的要想GC时间小必须要一个更小的堆要保证GC次数足够少必须保证一个更大的堆我们只能取其平衡。
- 1. 针对JVM堆的设置一般可以通过-Xms -Xmx限定其最小、最大值为了防止垃圾收集器在最小、最大之间收缩堆而产生额外的时间我们通常把最大、最小设置为相同的值
- 2. 年轻代和年老代将根据默认的比例12分配堆内存可以通过调整二者之间的比率NewRadio来调整二者之间的大小也可以针对回收代比如年轻代通过 -XX:newSize -XX:MaxNewSize来设置其绝对大小。同样为了防止年轻代的堆收缩我们通常会把-XX:newSize -XX:MaxNewSize设置为同样大小
- 3. 年轻代和年老代设置多大才算合理 毫无疑问是没有答案的,否则也就不会有调优。我们观察一下二者大小变化有哪些影响
- 1. 更大的年轻代必然导致更小的年老代大的年轻代会延长普通GC的周期但会增加每次GC的时间小的年老代会导致更频繁的Full GC
- 2. 更小的年轻代必然导致更大年老代小的年轻代会导致普通GC很频繁但每次的GC时间会更短大的年老代会减少Full GC的频率
- 3. 如何选择应该依赖应用程序对象生命周期的分布情况:如果应用存在大量的临时对象,应该选择更大的年轻代;如果存在相对较多的持久对象,年老代应该适当增大。但很多应用都没有这样明显的特性,在抉择时应该根据以下两点:
- 1. 本着Full GC尽量少的原则让年老代尽量缓存常用对象JVM的默认比例12也是这个道理
- 2. 通过观察应用一段时间看其他在峰值时年老代会占多少内存在不影响Full GC的前提下根据实际情况加大年轻代比如可以把比例控制在11。但应该给年老代至少预留1/3的增长空间
- ### 1.4 GC
collapsed:: true
- 1. [[说说你对Java的GC回收机制的理解]]
- 提示:
- Java语言有个特征安全性就是指Java程序员摆脱了C++ 程序员关于内存管理的问题。使得Java程序员在编写程序时不需要通过指针操作内存同时也不需要再去关注内存何时将会被回收清理。这一切都是因为有的GC回收机制的功劳。
- ### 1.5 MySQL
collapsed:: true
- 1. [[项目中SQL调优的场景有哪些数据库调优如何做]]
- 2. [[最多有过几张表的连表处理]]
- 3. [[为什么选择MySQL5.7而不用5.5 5.6]]
- 4. [[数据库中Btree 与Hash索引的区别]]
- 5. [[什么是数据库回表,如何避免回表查询]]
- 6. [[InnoDB的行级锁什么情况下会使用]]
- 7. [[数据库中如何快速插入100W级数据]]
- 8. [[联合索引与普通索引的区别在哪里]]
- 9. [[有张100W级的表中存在大量的重复数据如何快速去重]]
- 10. [[数据库中复合索引的字段中可以有null值吗]]
- 11. [[数据库中两张表如何要联合查询,要如何实现]]
- 12. [[mysql数据库索引是用什么数据结构存储的]]
- 13. [[事务在什么情况下会失效]]
- 14. [[怎么用Sql语句复制另一张表]]
- 15. [[数据库连表查询,左外联,右外联,内联查的区别]]
- 16. [[sql语句过慢怎么定位问题]]
- 17. [[说一下JDBC在连接数据库的操作上几个步骤]]
- 18. [[Like 后 加% 和 加_ 的区别在哪里]]
- 19. [[说一下事务的隔离级别和事务的传播性质]]
- 20. [[说一下怎么防止超卖SQL怎么写]]
- 21. [[如果给你一个功能,你觉得从数据库设计开始的思路是什么]]
- 22. [[说一下 ACID 是什么]]
- 23. [[数据库用户ID主键策略]]
- 24. [[数据库的执行计划]]
- 25. [[JDBC如何提升读取数据的性能]]
- 26. [[select count(*) ,select count(1),select count(字段) 说一下区别]]
- 27. [[索引失效的场景有哪些]]
- 28. [[数据库的SQL语句如何加锁]]
- 29. [[数据库中哪些字段适合加索引 ,哪些不适合加索引]]
- 30. [[什么是聚簇索引,什么是非聚簇索引]]
- 31. [[Union 和 union all 的区别是什么]]
- 32. [[什么是SQL注入如何防止]]
- 33. [[关闭连接一定能成功吗 怎么保证一定成功关闭连接]]
- 34. [[有哪些地方必须关闭资源]]
- 35. [[有没有设计过数据库 数据库三范式讲一下]]
- 36. [[In 与 exits 的区别是什么]]
- 37. [[MySQL中存储引擎InnoDB,MyIsam的区别在哪里]]
- 38. [[MySQL中锁机制]]
- 39. [[数据库中复合索引的字段中可以有null值吗]]
- 40. [[MySQL数据库的my.ini文件中可以配置什么参数]]
-在mysql的安装根目录中创建一个文件my.ini编写以下内容
- ```ini
#client mysql 都是设置客户端
[client]
#port参数表示的是MySQL数据库的端口默认的端口是3306
port=3306
[mysql]
#default-character-set参数是客户端默认的字符集
default-character-set=utf8
#mysqld 设置服务端
[mysqld]
#port参数也是表示数据库的端口
port=3306
#basedir参数表示MySQL的安装路径
basedir="C:/Program Files/MySQL/MySQL Server 5.7/"
#datadir参数表示MySQL数据文件的存储位置,也是数据库表的存放位置
datadir="C:/ProgramData/MySQL/MySQL Server 5.7/Data/"
#default-character-set参数表示默认的字符集这个字符集是服务器端的
character-set-server=utf8
#default-storage-engine参数默认的存储引擎
default-storage-engine=INNODB
#sql-mode参数表示SQL模式的参数通过这个参数可以设置检验SQL语句的严格程度
sql-mode="STRICT_TRANS_TABLES,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION"
#max_connections参数表示允许同时访问MySQL服务器的最大连接数默认151最大值16384其中一个连接是保留的留给管理员专用的
max_connections=1000
#query_cache_size参数表示查询时的缓存大小缓存中可以存储以前通过select语句查询过的信息再次查询时就可以直接从缓存中拿出信息
query_cache_size=0
#table_cache参数表示所有进程打开表的总数
table_cache=256
#tmp_table_size参数表示内存中临时表的总数
tmp_table_size=35M
#thread_cache_size参数表示保留客户端线程的缓存
thread_cache_size=8
#myisam_max_sort_file_size参数表示MySQL重建索引时所允许的最大临时文件的大小
myisam_max_sort_file_size=100G
#myisam_sort_buffer_size参数表示重建索引时的缓存大小
myisam_sort_buffer_size=69M
#key_buffer_size参数表示关键词的缓存大小
key_buffer_size=55M
#read_buffer_size参数表示MyISAM表全表扫描的缓存大小
read_buffer_size=64K
#read_rnd_buffer_size参数表示将排序好的数据存入该缓存中
read_rnd_buffer_size=256K
#sort_buffer_size参数表示用于排序的缓存大小
sort_buffer_size=256K
#innodb_additional_mem_pool_size参数表示附加的内存池用来存储InnoDB表的内容
innodb_additional_mem_pool_size=3M
#innodb_flush_log_at_trx_commit参数是设置提交日志的时机若设置为1
#InnoDB会在每次提交后将事务日志写到磁盘上
innodb_flush_log_at_trx_commit=1
#innodb_log_buffer_size参数表示用来存储日志数据的缓存区的大小
innodb_log_buffer_size=2M
#innodb_buffer_pool_size参数表示缓存的大小InnoDB使用一个缓冲池类保存索引和原始数据
innodb_buffer_pool_size=107M
#innodb_log_file_size参数表示日志文件的大小
innodb_log_file_size=54M
#innodb_thread_concurrency参数表示在InnoDB存储引擎允许的线程最大数
innodb_thread_concurrency=18
```
- ### 1.6 Mybatis
- 1. [[#{} 与 ${} 的区别]]
- 2. [[Mybatis的实现原理]]
- 3. [[Mybatis级联的配置]]
- 4. [[Mybatis的一二级缓存是什么样的]]
- 5. [[Mybits的缺点有哪些]]
- 6. [[Mybatis如何防止SQL注入]]
- ### 1.7 网络编程
- 1. [[什么是Socket编程]]
- 2. [[TCP与UDP在概念上的区别]]
- 3. [[TCP协议的特点你能说说吗 具体说说3次握手4次挥手的过程]]
- 4. [[OSI七层模型大概了解么]]
- ### 1.8 设计原则与设计模式
- 1. [[7大设计原则有哪些]]
- 2. [[什么是设计模式,有多少个]]
- 3. [[单例设计模式,你会手写么 在项目中哪些地方有应用]]
- 4. [[代理设计模式中,静态代理和动态代理的区别]]
- 5. [[动态代理中JDK代理和CGLIB代理区别 代理模式,在项目中哪些地方有应用]]
- 6. [[工厂设计模式的作用 简单工厂会写不 在项目中哪些地方有应用]]
- 7. [[如何克隆一个对象 浅克隆与深克隆区别在哪里]]
- 8. [[设计模式中,工厂设计模式有啥用 项目中在哪些地方用过]]
- ### 1.9 其它题目
- 1. [[异常的分类,如何自定义异常]]
- 2. [[普通类和抽象类有哪些区别]]
- 3. [[讲讲类的加载过程以及双亲委派机制]]
- 4. [[JDK1.8的新特性,你都用过哪些]]
- 5. [[网络通讯中tcp协议udp协议的区别]]
- 6. [[普通类和抽象类的区别 接口和抽象的区别]]
- 7. [[常用操作字符串有哪些类 StringBuffer,StringBuilder]]
- 8. [[StringStringBuffer及StringBuilder的区别]]
- 9. [[如何跳出多重循环]]
- 10. [[什么是反射]]
- 11. [[final 在 Java 中有什么作用]]
- 12. [[说一下你熟悉的设计模式]]
- 13. [[谈谈面向对象]]
- 14. [[谈谈多线程并发]]
- 15. [[什么是Java的反射]]
- 16. [[Java的反射在哪些地方有过应用]]
- 17. [[反射获得Class对象的3种方式]]
- 18. [[反射操作私有属性时,需要注意什么]]
- 19. [[抽象类可以继承实体类么]]
- 20. [[抽象类可以继承接口么]]
- 21. [[接口可以继承抽象类么]]
- 22. [[IO流的分类有哪些]]
- 23. [[谈谈BIO,NIO,AIO的区别是什么你都用过哪些IO框架]]
- 24. [[Object类的常见方法都有哪些]]
- 25. [[Java中异常的分类分别说说都哪些具体的异常]]
- 26. [[遇到BUG你是如何调试的]]
- 27. [[如果运行结果跟预期不一样,但是代码没报错,怎么处理]]
- 28. [[有没有用过断点调试 怎么用的]]
- 29. [[JDKJREJVM的区别]]
- 30. [[重写和重载的区别在哪里]]
- ## 二阶段
- ### 2.1 Spring
- 1. [[对springIOC的理解]]
- 2. [[讲下springAOP项目中你是如何应用的]]
- 3. [[动态代理模式中JDK与CGLIB的区别]]
- 4. [[Spring的循环依赖问题如何解决]]
- 5. [[谈谈你对Spring bean的生命周期的理解]]
- 6. [[Spring中对事务的支持有哪些方式 你项目中如何处理事务]]
- 7. [[Spring中bean基本都是单例的如果一个方法要对bean中的属性值进行修改这个方法会被多次执行怎么确保安全]]
- 8. [[讲一下浅克隆与深克隆]]
- 9. [[@Resource和@Autowired的区别]]
- 10. [[介绍一下你的项目AOP日志功能如何实现的]]
- 11. [[Spring依赖注入的方式有哪些 有区别么]]
- 12. [[Spring的常用注解都有哪些]]
- 13. [[Spring 事务实现方式有哪些]]
- 14. [[BeanFactory 和 ApplicationContext的区别]]
- 15. [[Spring中bean基本都是单例的如果一个方法要对bean中的属性值进行修改这个方法会被多次执行怎么确保安全]]
- 16. [[Spring实例化组件时,如何设置属性]]
- ### 2.2 SpringMVC
- 1. [[SpringMVC框架的工作流程]]
- 2. [[forward和redirect的区别]]
- 3. [[说一下@requestMapping的作用]]
- 4. [[知道拦截器么,你项目中哪里使用过拦截器]]
- 5. [[Springmvc 过滤器 拦截器的使用场景和区别是什么]]
- ### 2.3 SpringBoot
- 1. [[SpringBoot如何实现自动配置 原理是什么]]
- 2. [[SpringBoot的web模块自动集成了Tomcat如何剔除]]
- 3. [[说说你常用的几个SpringBoot注解]]
- 4. [[你上个项目用的SpringBoot版本是那个版本的]]
- 5. [[SpringBoot主要的配置类有哪些]]
- 6. [[Spring,Springmvc,SpringBoot的区别是啥]]
- 7. [[可不可以配置两个数据源 比如一个mysql和一个oracle 在哪里配置,怎么配置]]
- 8. [[SpringBoot在yaml中配置了开发环境配置文件和测试配置文件有几种方式在不同环境去使用不同的配置文件]]
- 9. [[SpringBoot的优点在哪里]]
- 10. [[当application.properties,application.yaml,bootstrap.yaml文件同时存在的情况下它们的执行顺序是怎样的]]
- 11. [[Spring的启动流程是怎么样的]]
- ### 2.4 Web题
- 1. [[HTTPS 通讯协议是如何实现的 它的加密方式是什么]]
- 2. [[在HTTP请求中如何存储客户信息(分如何获取和如何存储)]]
- 3. [[Ajax怎么实现同步]]
- 4. [[你们项目中,使用的什么 数据交换格式]]
- 5. [[HTTP通讯协议分为几个部分 请求协议的组成]]
- 6. [[JSON的解析框架你用过什么]]
- 7. [[XML与JSON之间的区别]]
- 8. [[页面加载很慢,有什么优化方案]]
- 9. [[重定向和请求转发的区别是什么]]
- 10. [[JSON格式长什么样 那么JSONArray呢]]
- 11. [[Servlet的生命周期]]
- 12. [[Tomcat如何配置连接池 默认连接数是多少 == 生产环境Tomcat性能比较差如何调优]]
- 答修改conf目录下的server.xml即可实现
- ```xml
<!--线程池的设置-->
<Executor executor="tomcatThreadPool"
namePrefix="catalina-exec-"
maxThreads="500"
minSpareThreads="100"
maxSpareThreads="500"
prestartminSpareThreads="true"
maxQueueSize="10000"
/>
<!--name连接池名称
namePrefix连接池创建的每个线程的名称前缀。单个线程的线程名称将为namePrefix + threadNumber
maxThreads此池中活动线程的最大数量默认值为200也就是最大的并发数
minSpareThreads此池中始终保持活动状态的线程最小数量默认值为25
maxSpareThreads此池中始终保持活动状态的线程最大数量 prestartminSpareThreads启动连接池激活最小活跃线程minSpareThreads也同时生效
maxQueueSizeHTTP请求的最大的队列长度默认值是Integer.MAX_VALUE。-->
<!--连接器的设置-->
<Connector
port="8080"
protocol="org.apache.coyote.http11.Http11Nio2Protocol"
connectionTimeout="20000"
maxConnections="10000"
acceptCount="10000"
acceptorThreadCount="2"
enableLookups="false"
executor="tomcatThreadPool"
redirectPort="8443"
/>
<!--
connectionTimeout连接超时时间单位是毫秒
maxConnections服务器在任何给定时间接受和处理的最大连接数。请注意一旦达到限制
操作系统仍然可以接受基于acceptCount设置的连接。默认值因连接器类型而异。
对于NIO和NIO2默认值为10000.对于APR /本机默认值为8192
acceptCount当连接不够时可以使用队列暂时存放HTTP请求队列满时收到的任何请求都将被拒绝。默认值是100
acceptorThreadCount每个连接可以获得的线程数最大不要超过2
enableLookups是否允许DNS查询
executor连接池的名字
redirectPort重定向端口-->
```
- 13. [[在请求中如何存储客户信息]]
- 14. [[如何防止表单重复提交]]
- 15. [[HTTP协议中GET与POST提交方法的区别在哪里]]
- 16. [[你对RestFul架构风格是如何理解的 平时都是怎么样的]]
- ### 2.5 Shiro
- 1. [[Shiro的执行流程]]
- ## 三阶段
- ### 3.1 RabbitMQ
- 请说说消息队列的工作模式有哪些
- MQ是如何保证消息不丢失的
- MQ的工作原理
- 如果保证用户一定能消费成功
- 延迟队列,死信队列的区别是什么
- 请说说RabbitMQ的优缺点
- 延迟队列如何实现
- 如果让你自己写个MQ服务器你的思路是什么 需要使用到什么技术
- 如何解决消息延时及过期失效的问题 如果有几百万条消息持续积压几小时,说说怎么解决
- 讲一下MQ服务器的推拉模式你在项目中是如何运用的
- rabbitmq怎么实现订单延迟支付
- 说一下怎么用rabbitmq实现取消订单的用户积分减少的
- MQ是什么 你用过哪个 怎么配置的
- ### 3.2 Redis
- 什么是接口幂等性,如何保证接口幂等性操作
- 幂等性问题会出现在哪些地方
- Redis支持的数据类型
- Redis的持久化方式以及各自的区别项目中用的哪一种怎么配置的
- 如何保证与数据库的双写一致性
- 缓存穿透,击穿,雪崩对应的解决方案是什么
- 使用的Redis是集群的嘛 有多少个节点,采用的是那种集群方案
- 说一下Reddis怎么做集群的
- Redis 都有哪些使用场景
- Redis 有哪些功能
- 分布式锁的目的
- 为什么要用redis不用map
- Redis是原子性的吗 是线程安全的吗 多线程还是单线程
- Redis的特性是哪些可以用来干嘛
- 项目中你们部署了多少台Redis服务器一般配置多少台熟悉哨兵机制么
- 假设你redis里面有9个商品我现在有10人来买怎么防止超卖问题
- Redis的单线程原理是什么 如果有10个用户同时操作Redis那么Redis是否按照先后顺序来处理情况
- Redis的分布式锁用过没 描述一下
- Redis设置永不过期也可以解决缓存击穿为什么还要用分布式锁
- Redis如何保证与数据库的数据一致性问题
- 红锁是怎么实现的 原理是什么
- 知道Redis的看门狗机制么为什么要用到看门狗
- Redis的5种数据类型分别的使用场景
- Redis集群知道么如何实现
- Redis持久化机制中AOF与RDB区别在哪里
- Redis如何配置RDB
- ### 3.3 ES
- ES怎么保持和数据库的一致性
- ES怎么配权重 可以做数据库吗
- ES实现全文检索的原理是什么
- ES查询一个张三李四。张三名字可能会重复要按照张三的生日去进行排序这个ES语句怎么写
- ### 3.4Linux
- 用过的Linux系统都有哪些 什么版本
- chmod 改用户组的权限
- 如果你在linux部署的项目出现报错时你需要定位报错信息在哪怎么做
- nginx反向代理原理
- Nginx的负载均衡策略
- Linux如何查看资源的使用情况
- chmod如何改用户组的权限
- ### 3.5 VUE
- 1. Vue的生命周期是什么都有哪些钩子函数
- 2. 谈谈MVC架构与MVVM架构的区别在哪里
- 3. VUE都有哪些组件
- ## 四阶段
- ### 4.1 SpringCloud
- 服务熔断和服务降级,项目是如何运用的
- 你们通过哪些手段处理系统的高并发问题
- 项目中,关于鉴权你们是咋做的
- Nacos 与 Eureka的区别
- 分布式事务的原理
- 为什么选择Seata来处理分布式事务
- 说说项目开发流程
- SpringCloud体系的几大组件
- 讲一下spring cloud 中的服务注册的机制和配置方法
- feign远程调用的时候如何确保feign接口的参数和controller层方法参数一致
- 你觉得SpringCloud相比传统的SpringMVC有什么优势
- 说一下熔断器,你怎么用的,代码怎么写的
- 做集群的时候事务怎么处理
- 网关限流时,采用什么技术,使用什么限流算法 咋配置
- 分布式高并发下的订单id是如何生成的
- 介绍一下spring,springboot,springcloud
- openfeign的工作原理是如何调用服务的
- Feign远程调用的时候如何确保Feign接口的参数和Controller层方法参数一致
- 为什么要使用微服务,它的优缺点
- 微服务的搭建步骤
- 微服务组件都用过哪些,你们微服务的业务逻辑是什么样子的
- Eureka如何搭建如何才能规避因为网络原因导致客户端大面积下线的情况
- Eureka高可用怎么配置
- 了解网关么,网关的作用是什么,你都在网关中配置过什么内容
- 网关限流如何配置 限流算法都用过哪些
- 网关是如何找到其他微服务的
- Eureka关闭之后其他的微服务之间还能调用么
- Nginx都配置过什么 如何做负载配置,都哪些负载算法
- Ngnix代理配置是在哪个文件
- Mysql的ini文件都有些参数可以配置
- Mybatis和MybatisPlus 你在项目中,哪个用的较多
- 有哪些方法可以防止微服务接口被攻击
- ### 4.2 Seata
- 1、什么是分布式事务项目中哪些地方遇到分布式事务
- 2、什么是2阶段提交Seata是如何做2阶段提交的
- 3、Seata是三大核心组件是哪些他们分别的作用是什么
- 4、Seata的AT模式与TCC模式区别在哪里
- 5、AT模式在运行过程中如何进行2阶段处理的
- 6、分布式事务的两个理论特性 是什么
- 7、请说一下Seata的执行流程
- ### 4.3 Alibaba组件
- 1、说说nacos吧
- 2、
- 其他问题
- 你在项目中遇到的最大问题是什么 如何解决的
- 项目部署没有 有没有经过压力测试 有没有经过渗透测试
- 用过哪些经典的设计模式,谈谈你对它们的理解
- 假如1个接口的QPS只有10,超过10会怎样 如何解决
- 在使用git的过程中遇到冲突你是如何处理的
- 单点登录的实现原理
- 如何防止后端接口被攻击
- 每天1万人访问主页并发量有多少
- 负载均衡怎么实现
- 你们开发规范是什么,具体开发流程是什么,需求分析谁做,原型设计怎么来的
- 测试怎么做的
- 项目中有哪些设计是存在缺陷或者不合理的
- 你熟悉秒杀流程 那么秒杀如何保证数据一致性
- 你们项目上线前会在哪里测试 怎么部署的 多个环境你该怎么设置
- 大佬跟你讲的东西,你怎么判断正不正确
- 三层架构是哪三层 具体说说,你知道它们分别对应的架构模式采用的是什么么
- 在生成订单过程中如果MySQL崩了怎么办
- 能详细说下非对称加密的流程吗
- 生产环境中应用有问题如何分析问题
- GIT回退上个版本用什么命令 切换分支用哪个命令

View File

@@ -0,0 +1,3 @@
- 占两字节内存空间,共16位
- 取值$-2^15$~$2^15$
-

View File

@@ -0,0 +1,9 @@
- [[java跨平台原理]]
- [[IDE集成开发环境]]
- [[基本数据类型]]
- [[标识符]]
- [[变量]]
- [[隐式转换]]
- [[强制转换]]
- [[算术运算符]]
- [[关系运算符]]

View File

@@ -0,0 +1,9 @@
- [[java跨平台原理]]
- [[IDE集成开发环境]]
- [[基本数据类型]]
- [[标识符]]
- [[变量]]
- [[隐式转换]]
- [[强制转换]]
- [[算术运算符]]
- [[关系运算符]]

View File

@@ -0,0 +1,34 @@
- 计算机编程语言
- 自然语言:人与人之间的语言
- 中文
- 英语...
- 人和电脑交互的语言
- 编程语言发展
- 1. 二进制语言
- 第一代:二进制编程语言/机器语言
- 组成0和1
- 特点:阅读性极差,维护性极差,开发效率非常低下
- ```
00010011
```
- 2. 汇编语言(符号语言)
- 思想使用一些特殊的符号替代难于理解的01
- AB-10101111
&A-00110101
- ```
AB &A CB
```
- 特点阅读性维护性仍旧很差但是简化了大量的01组合
- 3.高级编程语言
- 采用人类的语言作为编程的标准
- ```java
system.out.println("Hello");
```
- 分类
- 结构化编程
- C语言
- 面向对象
- C++
- Java
- 来自对C++的封装C++来自对C的封装所以Java也是C系语言中的一种
- C#

View File

@@ -0,0 +1,37 @@
- [[预习]]
- [[练习]]
- ## 第一周
- ### 第一天 [[Mar 28th, 2022]]
- [[计算机基础理论]]
- 课堂总结
- 1. 硬件&软件
2. 软件
3. 编程语言
- [[DOS命令]]
- [[windows快捷键]]
- 课堂总结
- 1. 打开DOS
2. DOS命令
3. 快捷键
- [[Java发展历程]]
- 课堂总结
- 1. JDK里程版本
2. Java三个开发方向桌面手机企业/互联网
3. Java语言特点
简单...
4. JDK>JRE>JVM
- [[JDK环境搭建]]
- 课堂小结
- 变量配置
- JAVA_HOME
- Path
- CLASSPATH
- 编译javac
- 运行java
- [[HelloWorld详解]]
- 课堂小结
- Java编写执行:编译-->解释
- 编译:源代码-->Class字节码
- 解释:将Class字节码中信息解释为01二进制信息给JVM执行
- 编译javac.exe执行
解释java.exe执行

View File

@@ -0,0 +1,38 @@
- [[练习]]
- [[总结]]
- ## 第一周
- ### [[第一天 [[Mar 28th, 2022]]]]
id:: 6243f2eb-1936-487f-9b7e-f755bc19a26c
- ### [[第二天 [[Mar 29th, 2022]]]]
id:: 6243f2eb-c01a-4a1e-b0a0-3d5da4c01d3a
- ### [[第三天[[Mar 30th, 2022]]]]
id:: 6243f2eb-7784-4d21-85a9-0d5769977cd1
- ### [[第四天[[Mar 31th, 2022]]]]
id:: 62443d8f-0b57-4183-9c26-4d6c709a7e0d
- ### [[第五天[[Apr 1st, 2022]]]]
id:: 62443e30-53da-464a-a0f8-d6df37f2351a
- [[面向对象的定义]]
- [[类与对象]]
- [[类和对象的创建]]
- [[属性与方法]]
- [[参数的传递]]
- [[对象的内存模型分析]]
- [[构造方法]]
- [[JavaBean规范]]
- [[修饰符]]
- [[getter/setter方法]]
- [[this]]
- [[static]]
- [[重载]]
- [[继承的定义]]
- [[继承方式]]
- [[重写]]
- [[final方法]]
- [[super关键字]]
- [[类的初始化顺序]]
- [[抽象类]]
- [[接口]]
- [[向上转型与向下转型]]
- [[多态的应用]]
- [[面向对象的特征]]
-

View File

@@ -0,0 +1,11 @@
- 计算机发展
- 46y2m 第一台计算机产生
- 1. 电子管计算机时代40-50
- 特点:体积大,能耗高,执行效率低下
- 2. 晶体管50-60体积
- 特点:体积依旧大,能耗依旧大,效率有所提升
- 3. 中小规模集成电路60-70
- 特点:体积,能耗,效率进一步提升
- 4. 大规模集成电路70-80
- 特点:体积,能耗,效率进一步提升
-

View File

@@ -0,0 +1,6 @@
- 重要程度:低
- 课程目标
- 1. 了解[[计算机组成]]
2. 了解[[计算机发展历程]]
3. 什么叫[[软硬件]]
4. 什么叫[[编程语言]]

View File

@@ -0,0 +1,6 @@
- 重要程度:低
- 课程目标
- 1. 了解[[计算机组成]]
- 2. 了解[[计算机发展历程]]
- 3. 什么叫[[软硬件]]
- 4. 什么叫[[编程语言]]

View File

@@ -0,0 +1,23 @@
- 控制类,方法,属性是否能被其它类或方法访问的权限控制
- 四个访问修饰符
- [[public]]
- [[protected]]
- [[继承]]的子类包里可以使用
- 默认的
- 仅在同一个包内可以调用
- [[private]]
- 在同一个类里面可以用
- id:: 624ff0b4-39b0-4eef-9c71-0990589ca29a
|访问修饰符|本类|本包|其它包的子类|其它包的其它类|
|private|√|×|×|×|
|默认|√|√|×|×|
|protected|√|√|√|×|
|public|√|√|√|√|
- 作用范围
- public>protected>默认>private
- [[封装]]
- 面向对象语言三大特征
- [[封装]][[继承]][[多态]]
- 有时新书中新添加一个[[抽象]]
- 变量的二义性
- 当方法的形参和对象的属性重名时,不知道操作的是那个值

View File

@@ -0,0 +1,23 @@
- 控制类,方法,属性是否能被其它类或方法访问的权限控制
- 四个访问修饰符
- [[public]]
- [[protected]]
- [[继承]]的子类包里可以使用
- 默认的
- 仅在同一个包内可以调用
- [[private]]
- 在同一个类里面可以用
- id:: 624ff0b4-39b0-4eef-9c71-0990589ca29a
|访问修饰符|本类|本包|其它包的子类|其它包的其它类|
|private|√|×|×|×|
|默认|√|√|×|×|
|protected|√|√|√|×|
|public|√|√|√|√|
- 作用范围
- public>protected>默认>private
- [[封装]]
- 面向对象语言三大特征
- [[封装]][[继承]][[多态]]
- 有时新书中新添加一个[[抽象]]
- 变量的二义性
- 当方法的形参和对象的属性重名时,不知道操作的是那个值

View File

@@ -0,0 +1,21 @@
-
- Overload[[方法的重载]]
- 同一个类中
- 父子之间,由子类去重新编写父类的方法
- 当父类的方法不符合子类的需求时,子类可以重写父类的方法
- 注意
- 子类不能重写父类的私有方法
- 子类[[访问修饰符]]必须大于或等于父类
- 重写方法的返回值类型可以不一样,父类的返回类型范围要大于子类,且 返回类型存在继承关系
- [[注解]]
- @override
- 表示下面的方法是重载
- @override与javac达成约定让javac检查注解下的方法是否来自于父类
- 经典案例
- 默认情况下使用System.out.println(对象)
- 调用Object上的toString()
- 打印对象的[[地址值]]
- 地址值作用
- 让程序员知道这个对象是否new成功
但是不知道对象里具体内容
- 重写父类的toString方法

View File

@@ -0,0 +1,35 @@
- [[强制转换]]
- Java允许低类型数据保存到高类型变量中
- byte<char<short<int<long<float<double
- char
- 每一个字符都有对应十进制数来表示
- ASCII编码
- 在Java中,小容量的数据类型可以向大容量的数据类型转换
- 字符类型也可以参与计算
- 字符类型会根据[[ASCII]]码转换,然后参与计算
- ```java
public static void main(String[] args){
char a = 'A';
int b = 10;
System.out.println(a + b);
}
```
- 总结
- 隐式转换
- 字符集
- 隐式转换ibyte+byte编译错误 #Java面试
id:: 6243be14-7a99-4175-8975-50f29880f478
- ```java
public static void main(String[] args){
byte a = 1;
byte b = 10;
//错误 byte c = a + b;
int c = a + b
System.out.println(c);
}
```
- 使用short相加后也是int
- byte + 数字后也是int类型
- byte a = 126 +1 这个不报错
编译器会自动检测后面计算的值是否超出范围
- ![image.png](../assets/image_1648866396906_0.png)