Java
未读线程相关概念程序 (Program)
程序是指平常使用的静态程序。
进程 (Process)
进程是操作系统中正在运行的动态程序。
线程 (Thread)
线程是程序内部的一条执行流程或路径。
协程 (Coroutine)
Go 语言特性。
Java 21 版本引入虚线程,更加轻量级(占用资源如 CPU、内存、IO 更少)。
Platform Thread 平台线程(基于操作系统)。
Virtual Thread 虚线程(基于 JVM)。
进程和线程关系
一个进程中包含一个或者多个线程。
一个线程一定从属于某一个进程。
Java 中的线程 (Thread)如何创建线程创建线程方式一继承 Thread 类并重写 run 方法,创建对象后调用 start 方法。
123456789101112public class MyThread extends Thread { @Override public void run() { System.out.println("MyThread is running"); } ...
面试题
未读
引用站外地址
Java面试题第一弹
owen0o0
引用站外地址
Java面试题第二弹
owen0o0
1. 什么是序列化和反序列化? 解答
解答:序列化: 将 JVM 内存中的 Java 对象转换为字节数组,写入文件或通过网络传输。反序列化: 将文件或网络中的字节数组还原为 JVM 内存中的 Java 对象。
2. 如何让线程 A、B、C 按顺序执行? 解答
解答:可以使用 join() 方法实现线程按顺序执行,示 ...
Java
未读测试 junit 的 使用断言的使用断言用于验证测试结果是否符合预期。以下是一些常用的断言方法:
assertEquals(expected, actual) : 验证实际值是否等于预期值。
assertNotEquals(unexpected, actual) : 验证实际值是否不等于某个值。
assertTrue(condition) : 验证条件是否为真。
assertFalse(condition) : 验证条件是否为假。
assertNull(object) : 验证对象是否为 null。
assertNotNull(object) : 验证对象是否不为 null。
assertArrayEquals(expectedArray, actualArray) : 验证两个数组是否相等。
示例代码:
1234567891011121314151617import static org.junit.jupiter.api.Assertions.*;class AssertionExample { @org.junit.jupiter.api.Test vo ...
面试题
未读基础问题1. Java 基础概念1. JVM、JRE、JDK 都是什么含义? 解答
解答:JVM(Java Virtual Machine): 是 java 虚拟机。 它只认识.class 为后缀的文件,它能将 class 文件中的字节码指令进行识别并调用操作系统向上的 API 完成动作。JVM 是 java 能够跨平台的核心机制。通俗的说就是跨平台用的,就是把我们写的代码,转换成 class 文件用的。JRE(Java Runtime Environment): 是 Java 运行环境 JRE 包括 Java 虚拟机 (JVM Java Virtual Machine)和 Java 程序所需的核心类库等,如果想要运行一个开发好的 Java 程序,计算机中只需要安装 JRE 即可。通俗的说就是运行用的。JDK(Java Development Kit): 是 Java 的开发工具包 JDK 是提供给 Java 开发人员使用的,其中包含了 Java 的开发工具和 JRE。其中的开发工具包括:编译工具(javac.exe)打包工具 ...
树的基础概念1. 理解树的基本术语树是由节点(Node)组成的层次结构,每个节点通过边连接。以下是树的基本术语:
节点:树的基本单位,包含数据和指向其他节点的连接。
节点结构:通常包含以下信息:
父节点的地址(如果有)。
节点的值。
子节点的地址列表。
子节点:某节点的直接下属节点,表示该节点的分支。
父节点:某节点的直接上级节点,连接到该节点的上一层。
兄弟节点:同一父节点的子节点。
叶子节点:没有子节点的节点,通常表示树的末端。
非叶子节点:至少有一个子节点的节点。
节点的度:节点拥有的子节点数量。例如,度为 0 的节点是叶子节点。
节点的高度:从该节点到叶子节点的最长路径的边数。
节点的深度:从根节点到该节点的路径的边数。
树的高度:从根节点到最深叶子节点的最长路径。
树的深度:树中所有节点的最大深度。
层次:节点的层级,从根节点开始为第 1 层,依次递增。
graph TD
A[根节点 A<br>深度: 0<br>高度: 2] --> B[子节点 1 B<br>深度: 1<br>高度: 1]
A --> ...
引言:为什么要进行自动化部署?在开发和维护静态博客或文档站时,手动部署是一个重复且容易出错的过程。随着项目规模的增长和发布频率的增加,手动操作不仅耗费时间,还可能导致人为错误,影响用户体验。通过引入自动化部署,我们可以显著提升开发效率,减少错误率。
手动部署的痛点在引入自动化部署之前,手动部署通常包括以下步骤:
本地生成静态文件:
在本地运行 hexo clean && hexo g 生成静态文件。
检查生成结果,确保 public 目录存在且内容正确。
上传到服务器:
使用 scp 或 FTP 手动上传文件到服务器目标路径。
确保上传的文件完整无误。
服务器配置检查:
检查 Web 服务器(如 Nginx)是否正常运行。
确保文件权限和路径配置正确,避免访问被拒绝。
访问验证:
手动访问服务器地址,确认页面加载正常。
如果出现问题,需要回溯到生成或上传步骤逐一排查。
这些步骤虽然看似简单,但在频繁发布或团队协作时,容易出现以下问题:
耗时:每次发布都需要手动执行多个步骤,效率低下。
易错:手动操作容易导致文件遗漏、路径错误或权限问题。
效率低下 ...
1. 文件与目录操作查看目录内容
使用 ls 命令查看当前目录下的文件和子目录。常用选项:
-l:以长格式显示文件信息(权限、大小、修改时间等)。
-a:显示所有文件,包括隐藏文件(以 . 开头的文件)。示例:
12ls -lls -la
创建文件
使用 touch 命令创建一个空文件。示例:
12touch newfile.txttouch file1.txt file2.txt
删除文件或目录
使用 rm 删除文件,使用 rm -r 删除目录。常用选项:
-r:递归删除目录及其内容。
-f:强制删除,不提示确认。示例:
123rm file.txtrm -r directory/rm -rf directory/
移动或重命名文件
使用 mv 命令移动文件或重命名文件。示例:
123mv oldname.txt newname.txt # 重命名文件mv file.txt /path/to/destination/ # 移动文件mv *.txt /path/to/destination/ # 移动所有 .txt 文件
创建目录
使用 mkdir 命令创建新目录 ...
1.认识算法1.1 什么是算法
解决某个实际问题的过程和方法
1.2 为什么要学习算法
可以训练编程思维
1.3 时间复杂度
时间复杂度是用于衡量算法运行时间随着输入规模增长而变化的趋势的指标。它通过分析算法中基本操作的执行次数与输入规模 n 的关系,并用大 O 符号表示,忽略常数因子和低阶项,专注于最高阶的项。
1.3.1 核心概念:
大 O 符号(O):表示算法的最坏时间复杂度,即运行时间的上界。例如:
O(1):常数时间复杂度,如数组索引访问。
O(n):线性时间复杂度,如遍历数组。
O(n²):平方时间复杂度,如双重循环。
O(log n):对数时间复杂度,如二分查找。
O(n log n):线性对数时间复杂度,如归并排序。
其他符号:
Ω(Omega):表示最好情况下的时间复杂度(下界)。
Θ(Theta):表示平均时间复杂度(紧确界)。
计算方法:
基本操作:确定算法中的基本操作(如循环、条件判断)。
执行次数:计算基本操作执行的次数与 n 的关系。
简化表达式:保留最高阶项,忽略常数和低阶项。例如,3*n² + 2*n + 1 简化为 O(n²)。
...
在一个繁忙的国际机场里,航班起降频繁,乘客(请求)络绎不绝。机场的调度中心(Nginx)负责管理所有航班的起降、乘客的分流以及资源的合理分配。通过这个故事,我们将了解 Nginx 的核心功能和实际应用。
一、问题:机场的调度难题机场每天要处理大量的航班和乘客,但随着航班数量的增加,问题逐渐显现:
跑道拥堵:高峰期航班争抢跑道(服务器),导致效率低下。
资源浪费:部分登机口(备用服务器)闲置,而其他登机口却超负荷。
单点故障:某条跑道损坏(服务器宕机),导致机场运行瘫痪。
安全问题:恶意请求(如 DDoS 攻击)威胁机场安全。
机场管理者小明决定引入 Nginx,解决这些问题。
二、解决方案:引入调度中心(Nginx)Nginx 的核心功能包括:
负载均衡:分配请求到不同服务器,避免拥堵。
反向代理:作为中间人转发请求,隐藏后端服务器。
静态资源缓存:缓存常用资源,提升访问速度。
高可用性:支持故障转移,保障服务稳定。
安全防护:限制恶意请求,保护服务器安全。
三、Nginx 的核心功能1. 负载均衡:让跑道不再拥堵配置示例:12345678910111213141516 ...
模板设计模式(Template Method Pattern)模板设计模式是一种行为型设计模式,其核心思想是 定义一个算法的骨架,将某些步骤延迟到子类中实现,从而使得子类可以在不改变算法整体结构的情况下,重新定义某些步骤的具体逻辑。
一、核心思想与要点核心思想模板设计模式的核心是 固定算法流程,延迟实现细节。通过在父类中定义算法的主要步骤,子类只需实现具体的细节逻辑即可。
核心要点
固定流程:父类定义算法的主要步骤(如“烧水 → 冲泡 → 倒入杯子 → 加调料”)。
可变细节:子类实现具体的步骤(如“如何冲泡茶叶”或“加什么调料”)。
控制反转:父类控制流程,子类填充细节。
二、Java 实现模板模式的步骤1. 定义抽象类(模板类)
模板方法:用 final 修饰,定义算法的流程(防止子类覆盖流程)。
抽象方法:用 abstract 修饰,表示必须由子类实现的方法。
具体方法:父类提供默认实现的方法(如公共步骤)。
钩子方法(可选):提供默认逻辑的方法,子类可选择性覆盖(用于控制流程分支)。
1234567891011121314151617181920212223242526 ...