- 博客(98)
- 收藏
- 关注
原创 Windows安装Docker Desktop
首先确保自己的电脑打开了虚拟化,可以在BIOS中查看,不同的电脑名字可能不一样,有的是。下载完,在商店里点击打开。第一次打开会设置用户名和密码,然后可以试一下有没有问题。,CPU是AMD的可能是其他名字。右键,以管理员身份运行,一直下一步就安装完成了。第二步,打开"启用或关闭Windows功能"如果显示默认版本为1,则更新wsl,输入命令。这两个选项是必须勾选的,第一个就是。如果更改了配置请重启,不然不生效。查看版本,如果不是2需要更新到2。第四步,检验wsl2安装成功。第三步,安装wsl2。
2024-12-17 11:45:44
461
原创 JVM机制
JVM 是 Java Virtual Machine 的简称,意为 Java虚拟机。JVM 是 Java 运行的基础,也是实现一次编译到处执行的关键。虚拟机是指通过软件模拟的具有完整硬件功能的、运行在一个完全隔离的环境中的完整计算机系统。常见的虚拟机:JVM、VMwave、Virtual BoxVMwave与VirtualBox是通过软件模拟物理CPU的指令集,物理系统中会有很多的寄存器JVM则是通过软件模拟Java字节码的指令集,JVM中主要保留了PC寄存器,其他的寄存器都进行了裁剪。
2024-10-27 01:31:21
893
原创 网络原理 - HTTP/HTTPS
Cookie就是浏览器给网页提供的特定机制,不是让网页随意访问硬盘,而是对硬盘的操作做了特殊的封装,提供了一个/一组特殊的文件,只能在这个特殊的文件里写,并且是键值对的形式。旧地址和新地址之间的映射关系是固定的,浏览器会缓存这样的映射关系,后续再次访问旧地址的时候,浏览器就可以直接构造新地址的请求,减少一次HTTP访问了。存储键值对格式的内容,和query string类似,都是程序猿自定义的,可以根据不同的需求定义不同的数据,增加HTTP的可扩展性,但往往有一个键值对用来标识用户的身份信息。
2024-10-14 19:41:39
1299
原创 测试-BUG篇
工作中开发人员通常需要按照bug的级别来分配优先级来处理bug,除此之外,通过bug级别也能够体现出开发人员的开发质量。测试人员在执行测试的过程中如有发现bug,需要在对应的bug管理平台来创建bug(bug生命起源),创建好的bug需要被开发人员修复,以及测试人员的持续跟踪和测试。描述bug的基本要素:问题出现的版本、问题出现的环境、问题出现的步骤、预期结果、实际结果、bug级别。在心理学上说,人们在编写文档的时候,经常会出现自己想表达的和写出来的内容往往南辕北辙。为什么描述bug还有要素要求?
2024-10-06 17:16:19
1095
原创 网络原理 - TCP/IP
当数据层层分用到TCP这一层时会被放入这个接收缓冲区中,放的过程中,会根据当前数据的序号,判定这个数据是否在队列中存在(或者曾经在队列中存在过),只要存在过,这个数据就会被直接丢弃,不过即使判定出现重复了也会继续返回应答报文,不然发送方继续会认为自己没发送成功而重传。接收缓冲区,除了去重之外,还有一个很重要的功能:针对收到的数据进行排序,并且数据和数据之间的序号始终是连续的,如果后面的数据先到,队首会留有空位等待前面的数据到达。在网络传输的过程中,经常会出现一个情况:后发先至,这是客观存在的改变不了。
2024-09-27 00:12:52
1096
原创 网络编程套接字(含Java示例)
Socket套接字,是系统提供用于网络通信的技术,是基于TCP/IP协议的网络通信的基本操作单元。基于Socket套接字的网络程序开发就是网络编程。操作系统提供的网络编程的API就称为"socket API"
2024-09-01 17:54:06
869
1
原创 网络原理 - 初识
计算机之间通过网络来传输数据,也称为网络通信。根据网络互连的规模不同,可以划分为局域网和⼴域网。所谓 “局域网” 和 “广域网” 只是⼀个相对的概念。
2024-08-28 23:24:53
1348
原创 HTML 基础
文章目录HTML 结构认识 HTML 标签HTML 文件基本结构快速生成代码框架HTML 常见标签注释标签标题标签: h1-h6段落标签: p换行标签: br格式化标签图片标签: img超链接标签: a表格标签列表标签表单标签form 标签input 标签label 标签select 标签textarea 标签无语义标签: div & span综合案例: 填写简历信息Emmet 快捷键HTML 特殊字符HTML: 页面有哪些元素组成CSS:这些元素的样式、布局、排版等JS:这些元素之间如何交
2024-07-11 22:36:37
997
原创 文件操作和IO
IO包括Input(输入)和Output(输出)数据靠近cpu就是输入,远离cpu就是输出通过控制台读取数据到内存也是输入,把数据打印显示到控制台上也是输出。
2024-07-08 21:05:13
910
原创 CAS(compare and swap)
CAS的机制是"比较-发现相等-交换"假设存在两个线程 t1 和 t2. 有⼀个共享变量 num, 初始值为 A.接下来, 线程 t1 想使用 CAS 把 num 值改成 Z, 那么就需要先读取 num 的值, 记录到 oldNum 变量中.使用 CAS 判定当前 num 的值是否为 A, 如果为 A, 就修改成 Z.但是, 在 t1 执行这两个操作之间, t2 线程可能把 num 的值从 A 改成了 B, 又从 B 改成了 A (A->B->A)
2024-07-04 23:44:24
832
原创 常见锁策略
读写锁就是把读操作和写操作分别进行加锁.读锁和读锁之间不互斥.写锁和写锁之间互斥.写锁和读锁之间互斥.读写锁最主要用在 “频繁读, 不频繁写” 的场景中.如果获取锁失败, 就会立即再尝试获取锁, 无限循环, 直到获取到锁为止. ⼀旦锁被其他线程释放, 就能第⼀时间获取到锁.优点: ⼀旦锁被释放就能第⼀时间获取到锁, 更高效. 在锁持有时间比较短的场景下非常有用.缺点: 如果锁的持有时间较长, 就会浪费 CPU 资源.
2024-07-03 15:31:07
1069
原创 进程以及多线程编程
一个程序运行起来,在操作系统中,就会出现一个对应的进程。也就是说,进程就是一个跑起来的应用程序我们可以在任务管理器中就把当前运行的所有进程都列出来除了自己运行的程序是进程外,还有一些系统自带的程序也是进程右边显示的那些CPU,内存,磁盘…就是当前进程占用了多少对应的系统资源。要想让一个程序运行,就必须给这个进程分配系统资源,包括不限于CPU,内存,硬盘,网络带宽,显卡…所以在操作系统内部,进程又是操作系统进行资源分配的基本单位。而进程多了就需要进行管理,做法则是先描述,再组织。
2024-07-02 16:59:10
431
原创 计算机是如何工作的
比如: 一个Java程序,写出来是一个.Java源代码文件,编译得到.class二进制文件(仍然是在硬盘上),运行程序的时候,JVM就会把这个.class加载到内存中,再进一步翻译成CPU能识别的二进制指令。再比如:一个 C程序,写出来是一个.c源代码文件,编译得到 .exe二进制文件(也是在硬盘上),运行的时候,操作系统会把这个.exe文件加载到内存中,再进一步由CPU执行。, 因为是ADD指令,此时就不是内存地址了,而是表示l两个寄存器的ID,一个是01(B寄存器),一个是00(A寄存器)
2024-06-01 19:33:32
943
原创 Java的JDBC编程
也都提供了这样的API让程序猿调用,这些数据库都是不同的厂商/不同的人开发的,这些不同数据库的API提供的功能大同小异,但是细节上存在很大的差异。对于Java来说,Java提供了"标准库",只要安装了Java,此时就可以使用标准库中的类和方法(标准库的API), 也可以使用其他大佬写好的类和方法(第三方库的API),但这不是自带的,需要额外安装。这两个都是MySQL提供的JDBC的驱动包,我的数据库是 mysql 5.7 就搭配旧版本使用了,如果是 mysql 8, 使用新版本就行。
2024-05-31 11:21:08
666
原创 MySQL表的增删改查
在进行表操作之前,一定要use选中数据库注释:在SQL中可以使用--空格+描述 来表示注释说明CRUD 即增加(Create)、查询(Retrieve)、更新(Update)、删除(Delete)四个单词的首字母。
2024-05-03 00:30:16
908
原创 MySQL数据库基础知识(数据库/表的基础操作 + 基本类型)
给程序猿使用的专业软件,不会像游戏设置界面那样的图形化界面进行编辑"配置项",而是直接用一个文件的方式进行呈现,这样的文件就是配置文件。如果系统没有 db_test 的数据库,则创建一个使用utf8mb4字符集的 db_test 数据库,如果有则不创建。如果系统没有 db_test2 的数据库,则创建一个名叫 db_test2 的数据库,如果有则不创建。创建数据库时还可以指定"校验规则"(可以认为是字符串比较时对应的规则),一般不用修改,使用默认即可。里面有这样的配置项描述的就是数据库存储的数据是在哪里。
2024-04-21 20:28:05
1150
原创 BFS算法--宽度优先搜索(广度优先搜索)
文章目录树N叉树的层序遍历二叉树的锯齿形层序遍历二叉树最大宽度在每个树行中找最大值FloodFill算法图像渲染岛屿数量岛屿的最大面积被围绕的区域最短路径问题迷宫中离入口最近的出口最小基因变化单词接龙为高尔夫比赛砍树多源BFS矩阵飞地的数量地图中的最高点地图分析拓扑排序(核心与多源BFS一样)课程表课程表II火星词典树N叉树的层序遍历class Solution { public List<List<Integer>> levelOrder(Node root) {
2024-04-09 12:08:14
609
原创 字符串相关算法
整体思路就是模拟列竖式计算两个数相乘的过程。但是为了书写代码的方便性,我们选择优化的版本,就是在计算两数相乘的时候,先不考虑进位,等到所有结果计算完毕之后,再去考虑进位。
2024-04-02 12:07:54
480
原创 分治-算法
与逆序对的问题不同的是,逆序对我们可以⼀边合并⼀边计算,但是这道题要求的是左边元素大于右边元素的两倍,如果我们直接合并的话,是⽆法快速计算出翻转对的数量的。因此,我们可以利⽤归并排序的过程,先求出左数组中逆序对的数量,再求出右数组中逆序对的数量,最后求出⼀个选择左边,另⼀个选择右边的逆序对的数量,三者相加即可。这道题的解法与 求数组中的逆序对 的解法是类似的,但是这道题要求的不是求总的个数,而是要返回⼀个数组,记录每⼀个元素的右边有多少个元素比自己小。在归并排序合并的过程中,我们得到的是两个有序的数组。
2024-03-28 14:05:20
991
原创 数据库MySQL
存储数据用文件就可以了,为什么还要数据库?文件的安全性问题文件不利于数据查询和管理文件不利于存储海量数据文件在程序中控制不方便内存与外存外存是一个统称,包括硬盘、U盘、光盘…CPU(中央处理器),进行各种逻辑判断和算术运算,是通用的,也可以计算图形图像GPU(显卡),专用计算芯片,专门用来计算图形图像,所以在某些方面速度比GPU快很多平时的内存都是给CPU使用的,为了不冲突,一般会在显卡上单独焊上一些内存单元,专门给显卡使用,这就是显存。
2024-03-24 21:45:27
729
4
原创 模拟-算法
定义的哈希表hash记录蛙叫次数,除了’k’其他字符会被下一个字符消掉,'k’只有在新增’c’的时候消掉,最后留下多少’k’就是几只蛙。第一行、第二行第⼀个数取值为行数,第二个数夹在等差数列中间, 就是第零行的等差数列第二个数减去行数。不难发现,第零行和最后一行的数据是以 2numRows - 2 为公差递增的等差数列。所谓「外观数列」,其实只是依次统计字符串中连续且相同的字符的个数。依照题意,依次模拟即。ii. 如果差值小于中毒时间,那么上次的中毒只能持续两者的差值。以此规律,我们可以写出迭代算法。
2024-03-23 10:28:18
834
2
原创 位运算算法
由于整个数组中,需要找的元素只出现了「⼀次」,其余的数都出现了「三次」,因此我们可以根据所有数的「某⼀个比特位」的总和 %3 的结果,快速定位到 ret 那位「比特位」的值是0 还是 1。利用「位图」的思想,每⼀个「比特位」代表⼀个字符,⼀个 int 类型的变量有 32 位足够表示所有的小写字⺟。如果我们把数组中的数,以及 [0, n] 中的数全部「异或」在⼀起,那么根据「异或」运算的两个相同的数异或的结果一定为0,最终的异或结果就是缺失的数。给一个数n,确定它的二进制表示中的第x位是0还是1。
2024-03-21 15:39:18
444
原创 前缀和算法
前缀和可以快速求出数组中某个连续区间的和为了处理边界情况,下标从1开始dp[i]表示原数组[ 1 , i ]区间内所有元素之和dp[i]=dp[i-1]+原数组[i]
2024-03-20 18:19:13
890
原创 二分查找算法
大家⼀定不要觉得背下模板就能解决所有二分问题。二分问题最重要的就是要分析题意,然后确定要搜索的区间,根据分析来写出二分查找算法的代码。要分析题意,确定搜索区间,不要死记模板,不要看左闭右开什么乱七⼋糟的题解要分析题意,确定搜索区间,不要死记模板,不要看左闭右开什么乱七⼋糟的题解要分析题意,确定搜索区间,不要死记模板,不要看左闭右开什么乱七⼋糟的题解重要的事情说三遍。
2024-03-18 12:23:45
798
原创 滑动窗口算法
因为字符串 p 的异位词的长度⼀定与字符串 p 的长度相同,所以我们可以在字符串 s 中构造⼀个长度与字符串 p 相同的滑动窗口,并在滑动中维护窗口中字母的数量。可以用两个大小为 26 的数组来模拟哈希表(全是小写字母),⼀个来保存 s 中的子串每个字符出现的个数,另⼀个来保存 p 中每⼀个字符出现的个数。既然是连续区间,可以考虑使用「滑动窗口」来解决问题。题目要求的是数组「左端+右端」两段连续的、和为 x 的最短数组,我们可以转化成求数组内⼀段连续的、和为 sum(nums) - x 的最长数组。
2024-03-14 15:09:30
1049
原创 双指针算法
而「快慢指针」有⼀个特性,就是在⼀个圆圈(循环)中,快指针总是会追上慢指针,也就是说速度相差一个元素时他们总会相遇在同⼀个位置。设两个指针 left , right 分别指向容器的左右端点,容器的左边界为 height[left] ,右边界为 height[right]。快慢指针的实现方式有很多种,最常用的⼀种就是:在⼀次循环中,每次让慢的指针向后移动⼀位,而快的指针往后移动两位,实现⼀快⼀慢。由于上述两种情况只会出现⼀种,因此,只要我们能确定死循环是「情况⼀」,还是「情况⼆」,就能得到结果。
2024-03-12 11:41:50
870
原创 哈希表与HashMap
虽然哈希表一直在和冲突做斗争,但在实际使用过程中,我们认为哈希表的冲突率是不高的,冲突个数是可控的,也就是每个桶中的链表的长度是一个常数,所以,通常意义下,我们认为哈希表的插入/删除/查找时间复杂度是O(1)。开散列法又叫链地址法(开链法),首先对数据集合用散列函数计算散列地址,具有相同地址的数据归于同一子集合,每一个子集合称为一个桶,桶中的元素通过一个单链表链接起来,各链表的头结点存储在哈希表中。那如何寻找下一个空位置呢?进行同样的计算,求得的函数值为元素的存储位置,进行元素比较,若相等,则搜索成功。
2024-03-06 14:08:32
785
2
原创 七大排序算法
快速排序整体的综合性能和使用场景都是比较好的,所以才叫快速排序时间复杂度:O(N*logN)空间复杂度:O(logN)稳定性:不稳定。
2024-03-02 20:48:10
1030
原创 优先级队列(堆)
查看向上调整的源码知PriorityQueue是通过comparator或comparable来决定元素存放顺序的如果实现了comparator就用comparator,不然就看comparablecomparablekey是child;e是parentkey.compareTo((E) e) < 0,就不执行break,而执行交换} }} }@Override对age进行比较来建堆comparatorx是child;
2024-02-24 10:41:59
1090
原创 二叉树及其练习题
文章目录树概念及结构树的概念树的相关概念树的表示形式树的应用二叉树概念及结构概念两种特殊的二叉树二叉树的性质二叉树的存储二叉树的基本操作二叉树的遍历前中后序遍历递归实现二叉树的基本操作二叉树相关oj题树概念及结构树的概念树是一种非线性的数据结构,它是由n(n>=0)个有限结点组成一个具有层次关系的集合。把它叫做树是因为它看起来像一棵倒挂的树,也就是说它是根朝上,而叶朝下的。有一个特殊的结点,称为根结点,根节点没有前驱结点除根节点外,其余结点被分成M(M>0)个互不相交的集合T1、T2
2024-02-21 00:22:45
862
原创 Java的集合框架和泛型
Java 集合框架,又被称为容器 container ,是定义在 java.util 包下的一组接口 interfaces和其实现类 classes。其主要表现为将多个元素 element 置于一个单元中,用于对这些元素进行快速、便捷的存储store、检索retrieve、管理manipulate,即平时我们俗称的增删查改CRUD。数据结构(Data Structure)是计算机存储、组织数据的方式,指相互之间存在一种或多种特定关系的数据元素的集合。
2024-02-16 22:21:30
923
原创 时间和空间复杂度
算法效率分析分为两种:第一种是时间效率,第二种是空间效率。时间效率被称为时间复杂度,而空间效率被称作空间复杂度。时间复杂度主要衡量的是一个算法的运行速度,而空间复杂度主要衡量一个算法所需要的额外空间,在计算机发展的早期,计算机的存储容量很小。所以对空间复杂度很是在乎。但是经过计算机行业的迅速发展,计算机的存储容量已经达到了很高的程度。所以我们如今已经不需要再特别关注一个算法的空间复杂度。
2024-02-14 13:34:40
814
原创 KMP算法
KMP 和 BF 不一样的地方在,主串的的下标 i 并不会回退,只需要让子串的下标 j 回退就够了(通过一个next数组找到回退的位置)
2023-12-22 22:28:19
932
原创 Clonable 接口和深拷贝
Object 类中存在一个 clone 方法, 调用这个方法可以创建一个对象的 “拷贝”.但还是会报错要想合法调用 clone 方法, 必须先实现 Clonable 接口, 否则就会抛出 CloneNotSupportedException 异常,而它是空的,没有需要重写的方法如果一个类实现了这个空接口/标记接口,那么证明当前类是可以被克隆的。
2023-12-20 19:32:47
389
原创 Java的异常
Java 中虽然已经内置了丰富的异常类, 但是并不能完全表示实际开发中所遇到的一些异常,此时就需要维护符合我们实际情况的异常结构我们可以基于已有的异常类进行扩展(继承), 创建和我们业务相关的异常类.自定义异常类,继承自Exception 或者 RunTimeException实现一个带有String类型参数的构造方法,参数含义:出现异常的原因仿照NullPointerException创建自定义异常类(含两个构造方法)if(!
2023-12-19 20:45:26
961
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人