自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(34)
  • 收藏
  • 关注

原创 606.根据二叉树创建字符串

根节点后面跟上两个括号里面是它的左右子树,当根节点有左子树没有右子树的情况下,右子树的括号不用写,直接省略,当根节点的左右子树都为空的时候,两个括号都去掉。初步转化后得到 "1(2(4)())(3()())" ,但省略所有不必要的空括号对后,字符串应该是"1(2(4))(3)"。初步转化后得到 "1(2(4)())(3()())" ,但省略所有不必要的空括号对后,字符串应该是"1(2(4))(3)"。,请你采用前序遍历的方式,将二叉树转化为一个由括号和整数组成的字符串,返回构造出的字符串。

2024-04-21 13:23:59 428

原创 105.从前序遍历与中序遍历序列构造二叉树

因此我们可以从前序遍历的过程中获得根节点,从中序遍历的过程中将根节点的左右子树分出来。该问题要我们根据前序遍历和中序遍历构造出一个二叉树,中序遍历的遍历过程是: 左,根,右。递归这个过程,最终完成二叉树的创建。前序遍历的遍历过程是:根,左,右。,请构造二叉树并返回其根节点。

2024-04-19 11:17:54 310

原创 MyBatis中的动态SQL的用法

上面两张图片分别展示的是在XML和UserInfoXmlMapper这个接口中写的代码可以看到id 对应的是接口中使用这个SQL语句的方法名。通过日志可以观察出我们在XML中写的SQL语句已经被MyBatis识别成正确的SQL语句并且在MySQL数据库中查询到了相对应的结果;可以从两次打印出来的日志看到,当我们传递的参数个数,类型发生改变时,就会动态的生成不同的SQL语句,提高了代码的可用性。下面是一个关于查询的动态SQL的代码,对于要用到的参数用了一个对象接收。

2024-04-11 17:50:59 306

原创 206. 反转链表

将链表反转我们可以看作将头节点的next置为空,然后将后面的节点利用头插法插在head之前,重复以上操作我们就可以将链表反转。,请你反转链表,并返回反转后的链表。

2024-03-27 10:53:15 244

原创 SpringMVC 中的常用注解和用法

以下将介绍几种常用的注解,以及他们的用法。

2024-03-22 17:38:46 439

原创 CSS 选择器的常见用法

我们要学习css选择器的用法首先要知道css选择器是什么?CSS选择器是一种用于选择HTML或XML文档中特定元素的模式。通过使用CSS选择器,你可以指定要应用样式的元素,从而控制它们的外观和布局。

2024-03-04 19:13:20 499

原创 类加载的过程

在类加载过程中,类加载器负责实陵对类加载的任务,根据双亲委派模型,类加载器首先会委托给父类加载器进行加载,如果父类加载器无法完成加载任务,则由子类加载器自行加载。5. 初始化(Initialization):在类初始化阶段,JVM 负责对类进行初始化,包括执行类构造器方法(<clinit>)、对静态变量赋值等操作。1. 加载(Loading):通过类的全限定名(Fully Qualified Name)来获取类的二进制字节流,并将其转换成方法区中的运行时数据结构。

2024-02-29 18:39:05 369

原创 垃圾回收的知识点

然而,在手动管理内存的情况下,程序员需要显式地跟踪内存的分配和释放,容易出现内存泄漏(分配的内存未被释放)或者野指针(指向已释放内存的指针)等问题。回收阶段是垃圾回收的另一个关键步骤,目的是将已经标记为垃圾的对象进行回收,并释放它们所占用的内存空间。这个过程通过从根对象开始,递归遍历对象图,标记所有可以访问到的活动对象,而无法访问到的对象则被标记为垃圾等待回收。3. 标记-整理(Mark and Compact):标记出所有活动对象,然后将它们整理到一端,清除另一端的垃圾对象。

2024-02-29 18:32:51 625

原创 HTTPS 的加密流程

2. 服务器证书:服务器将自己的数字证书发送给客户端。6. 建立加密通道:客户端和服务器使用协商好的对称密钥来加密和解密数据,在这个对称密钥加密下,双方之间的通信内容得到保护。4. 生成对称加密密钥:客户端使用服务器的公钥(通常在证书中)来加密一个对称密钥,然后将加密后的对称密钥发送给服务器。3. 客户端验证证书:客户端收到服务器的证书后,会验证证书的有效性,包括检查证书是否过期、是否由受信任的CA签发等。5. 服务器解密对称密钥:服务器收到加密的对称密钥后,使用自己的私钥解密,得到对称密钥。

2024-02-29 18:31:00 797

原创 TCP协议的相关特性(1)

如果仍然得不到应答,等待 4*500ms 进行重传。[ESTABLISHED -> CLOSE_WAIT] 当客户端主动关闭连接(调用close),服务器会收到结束 报文段,服务器返回确认报文段并进入CLOSE_WAIT;[FIN_WAIT_1 -> FIN_WAIT_2] 客户端收到服务器对结束报文段的确认,则进入FIN_WAIT_2, 开始等待服务器的结束报文段;[FIN_WAIT_2 -> TIME_WAIT] 客户端收到服务器发来的结束报文段,进入TIME_WAIT,并发 出LAST_ACK;

2024-01-31 15:06:18 405

原创 UDP 的报文结构和注意事项

报文结构:

2024-01-27 16:25:26 669

原创 File 类提供的方法

1.创建文件或目录:使用 File 对象的 createNewFile() 方法可以创建一个新的文件,使用 mkdir() 或 mkdirs() 方法可以创建一个新的目录。它们定义了一些通用的方法,可以用于读取和写入字节流。3.读取文件属性:使用 File 对象的各种方法可以读取文件的属性,例如文件名、路径、大小、修改时间等。4.遍历目录:使用 list() 或 listFiles() 方法可以列出一个目录中的所有文件和子目录。2.删除文件或目录:使用 delete() 方法可以删除一个文件或目录。

2024-01-20 16:07:43 572

原创 计算机存储和文件系统的相关知识

文件系统:文件系统是操作系统使用的一种组织和管理存储设备上文件和目录的方法。它确定了如何命名、组织和访问文件,并提供了对文件的读取、写入和删除操作。存储:存储是计算机用于保存数据和程序的介质或设备。主存储器用于临时存储正在被计算机处理的数据和指令,而辅助存储器用于长期存储数据和程序。硬盘:硬盘是一种常见的辅助存储设备,用于永久性地存储数据。输入/输出(I/O):I/O 是计算机与外部设备之间交换数据的过程。目录:目录是文件系统中用于组织和管理文件的容器。文件:文件是存储在计算机上的一组数据。

2024-01-20 15:46:03 370

原创 cas 和 synchronized 优化过程

需要注意的是,对于绝大多数情况下,JVM 和编译器会自动进行优化,选择合适的同步机制,使代码达到最佳性能。因此,在大部分情况下,开发者不需要手动进行这些优化,而是关注代码的正确性和可读性。总的来说,CAS 通过原子性操作和自旋重试提供了无锁并发的机制,适用于无竞争的情况下。而 synchronized 通过锁粗化、锁消除和锁重入优化来降低锁的开销,适用于有竞争的情况下。CAS(Compare and Swap)和 synchronized 都是用于实现线程同步的机制,但它们在优化过程上有一些不同。

2024-01-20 15:26:10 318

原创 synchronized 和 ReentrantLock 之间的区别

可重入性:synchronized 是可重入锁,即一个线程持有锁时,可以再次获取这个锁,而不会造成死锁。ReentrantLock 也是可重入锁,并且提供了公平锁和非公平锁两种模式,可以根据需要选择不同的锁模式。锁的获取方式:synchronized 是隐式锁,当进入代码块时自动获取锁,代码块执行完毕时自动释放锁。锁的粒度:synchronized 的锁的粒度比较大,一旦获取锁就会锁住整个对象,而 ReentrantLock 可以通过使用多个锁来细化锁的粒度,从而提高并发性能。

2024-01-20 15:15:48 435

原创 HashTable, HashMap, ConcurrentHashMap 之间的区别

而 HashTable 在现代 Java 应用中已经很少使用了,因为它的性能相对较低,且不支持键或值为 null。线程安全性:HashTable 是线程安全的,而 HashMap 和 ConcurrentHashMap 则是非线程安全的,但 ConcurrentHashMap 通过使用锁分段技术实现了更高的并发性能。迭代器性能:ConcurrentHashMap 的迭代器设计为弱一致性,可以在不加锁的情况下进行迭代,而 HashMap 和 HashTable 的迭代器则是强一致性的,需要在迭代时加锁。

2024-01-20 15:14:23 298

原创 网络中的一些基本概念(1)

端口号范围从0到65535,其中0到1023是被一些特定的协议保留的,用于常见的服务,如HTTP(端口号80)、FTP(端口号21)、SSH(端口号22)等。其中网络层负责路由选择和数据包转发,传输层负责数据的可靠传输和数据流量控制,应用层则定义了各种应用程序使用的通信协议和服务。这些分层模型提供了一种结构化的方式来组织网络协议,每个层次都有其特定的功能和责任,通过协同工作来实现可靠的数据传输和网络通信。不同的协议可以相互配合,形成一个完整的通信系统,实现数据的可靠传输和高效交换。

2024-01-19 15:54:28 362

原创 synchronized关键字

当线程进入一个被 `synchronized` 修饰的方法或代码块时,它会尝试获取该方法或代码块所对应的对象的内置锁。线程每次获取锁时,会将锁的持有计数加一,释放锁时,会将计数减一,只有计数为零时才真正释放锁。5. 通知等待:当一个线程获取到锁并执行完同步代码块后,会释放锁并通知其他等待的线程,从而使它们有机会获取到锁并执行。3. 公平性:内置锁是非公平的,也就是说,当多个线程都在等待获取锁时,不保证按照先来先得的顺序分配锁。保证了被它修饰的方法或代码块作为一个整体的执行是原子的,不会被其他线程中断。

2024-01-15 15:38:11 476

原创 线程池的介绍

核心线程数(Core Pool Size):指定线程池中最小的线程数量,即线程池保持的最低线程数。即使线程池处于空闲状态,也会一直保持这些核心线程。最大线程数(Maximum Pool Size):指定线程池中允许存在的最大线程数量。当核心线程已满且工作队列也已满时,新任务会创建额外的线程,直到达到最大线程数。空闲线程存活时间(Keep Alive Time):指定非核心线程在空闲状态下的最大存活时间。当线程池中的线程数量超过核心线程数,并且空闲时间超过设定的时间时,多余的线程会被销毁。

2024-01-15 15:01:29 1457

原创 746. 使用最小花费爬楼梯

可以这样理解,从第零个台阶或第一个台阶到第i个台阶的最少花费,就是从前往后的推导,一旦你支付此费用,即可选择向上爬一个或者两个台阶。- 支付 1 ,向上爬两个台阶,到达下标为 2 的台阶。- 支付 1 ,向上爬两个台阶,到达下标为 4 的台阶。- 支付 1 ,向上爬两个台阶,到达下标为 6 的台阶。- 支付 1 ,向上爬一个台阶,到达下标为 7 的台阶。- 支付 1 ,向上爬两个台阶,到达下标为 9 的台阶。- 支付 15 ,向上爬两个台阶,到达楼梯顶部。- 支付 1 ,向上爬一个台阶,到达楼梯顶部。

2023-11-29 17:01:06 437 1

原创 面试题 08.01. 三步问题

运用动态规划的思想,创建一个大小为N+1的数组来存放数据,可以保障数组不越界,

2023-11-29 15:31:08 363 1

原创 第N个泰波那契数

T0 = 0, T1 = 1, T2 = 1, 且在 n >= 0 的条件下 Tn+3 = Tn + Tn+1 + Tn+2。相比于法1,法2在空间上更节省,没有创建数组来保存大量数据,而是通过四个变量保存数据,更加节省空间。,请返回第 n 个泰波那契数 Tn 的值。

2023-11-28 20:13:56 396

原创 Volatile 关键字

由结果可以看到,t2修改counter中flag的值,t中感受不到,因此t中的while循环不会结束。从主内存中读取volatile变量的最新值到线程的工作内存中。这时当我们再t2线程中修改flag,t线程可以感知到,并且结束循环。改变线程工作内存中volation变量副本的值。从工作内存中读取volatile变量的副本。将改变后的副本的值从工作内存刷新到主内存。代码在写入volatile修饰的变量的时候,代码在读取volatile修饰的变量的时候,

2023-11-28 18:43:56 467

原创 线程安全问题

synchronized 会起到互斥效果, 某个线程执行到某个对象的 synchronized 中时, 其他线程如果也执行到同一个对象 synchronized 就会阻塞等待。如果是在单线程情况下,JVM、CPU指令集会对其进行优化,比如,按 1->3->2的方式执行,也是没问题,可以少跑一次前台。运用synchronized关键字,当使用了synchronized关键字后,得到的结果就是我们想要的结果了。如果一个线程正在对一个变量操作,中途其他线程插入进来了,如果这个操作被打断了,结果就可能是错误的。

2023-11-26 14:38:23 374 1

原创 JAVA线程的几种状态

RUNNABLE: 可工作的. 又可以分成正在工作中和即将开始工作.TIMED_WAITING: 这几个都表示排队等着其他事情。BLOCKED: 这几个都表示排队等着其他事情。WAITING: 这几个都表示排队等着其他事情。NEW: 安排了工作, 还未开始行动。TERMINATED: 工作完成了.

2023-11-24 19:22:12 325 1

原创 Thread类的基本用法

有时,我们需要等待一个线程完成它的工作后,才能进行自己的下一步工作。例如,张三只有等李四转账成功,才决定是否存钱,这时我们需要一个方法明确等待线程的结束。2. 调用 interrupt() 方法来通知。1. 通过共享的标记来进行沟通。

2023-11-24 19:00:23 324 1

原创 进程和线程的区别和联系

要了解进程和线程之间的区别和联系,首先要知道什么是进程,什么是线程,本篇博客首先分别介绍进程和线程,这样更有利于大家理解进程和线程。每个应用程序运行于现代操作系统之上时,操作系统会提供一种抽象,好像系统上只有这个程序在运行,所有的硬件资源都被这个程序在使用。这种假象是通过抽象了一个进程的概念来完成的,进程可以说是计算机科学中最重要和最成功的概念之一。进程是操作系统对一个正在运行的程序的一种抽象,换言之,可以把进程看做程序的一次运行过程;

2023-11-23 16:56:21 20

原创 MySQL表的增删改查(基础)(1)

本篇博客主要大家简单的描述在MySQL表中的一些基本的操作(增删改查)。希望对大家了解MySQL提供帮助。

2023-11-16 18:24:34 26 1

原创 Java中类的定义和使用

类是用来对一个实体(对象)来进行描述的,主要描述该实体(对象)具有哪些属性(外观尺寸等),哪些功能(用来干啥),描述完成后计算机就可以识别了。例如:洗衣机,它是一个品牌,在Java中可以将其看成是一个类别。属性:产品品牌,型号,产品重量,外观尺寸,颜色...功能:洗衣,烘干、定时....在java中定义类时需要用到class关键字,具体语法如下// 创建类field;// 字段(属性) 或者 成员变量method;// 行为 或者 成员方法。

2023-07-31 15:46:40 545 1

原创 模拟实现 strncpy 函数

strncpy 是 C语言的库函数之一,来自 C语言标准库,定义于 string.h,char *strncpy(char *dest, const char *src, int n),把src所指向的字符串中以src地址开始的前n个字节复制到dest所指的数组中,并返回被复制后的dest。dest – 指向用于存储复制内容的目标数组。返回值:该函数返回最终复制的字符串。n – 要从源中复制的字符数。1.strncpy函数介绍。src – 要复制的。

2023-07-18 10:25:29 162 1

原创 结构体详解

结构的每个成员可以是不同类型的变量。不是所有的硬件平台都能访问任意地址上的任意数据的;如果嵌套了结构体的情况,嵌套的结构体对齐到自己的最大对齐数的整数倍处,结构体的整。结构体总大小为最大对齐数(每个成员变量都有一个对齐数)的整数倍。(4). Linux中没有默认对齐数,对齐数就是成员自身的大小。所以当结构体的对齐方式不合适的时候我们可以自己更改默认对齐数。其他成员变量要对齐到某个数字(对齐数)的整数倍的地址处。上面的两个结构在声明的时候省略掉了结构体标签(编译器默认的一个对齐数与该成员大小的。

2023-07-17 09:10:06 33 1

原创 库函数的模拟实现(一)

size_t 是一个无符号长整型类型,直接作为数值运算时得注意,计算结果是否会越界。计算字符串sting的长度,并返回字符串string的长度。如果返回值为0,表示两个字符串相等;如果返回值大于0,表示s1大于s2。函数,它的功能就是在一个字符串后面追加上另外一个字符串。是把src所指向的字符串复制到dest中去。dest---指向用于存储复制内容的目标数组。指向要比较的两个字符串的指针变量。要连接的两个字符串首元素的地址。连接后的字符串首元素的地址。src--- 要复制的字符串。

2023-07-12 16:25:15 29

原创 扫雷-------C语言实现

扫雷c语言实现

2023-05-16 20:44:13 49 2

原创 三子棋----C语言实现

我们首先应该构建一个棋盘,根据棋盘的特点,可以使用二维数组,并且运用循环将棋盘打印出来,接下来要设计两个函数,分别让玩家,电脑下棋,走到这一步就该想到了不管是玩家还是电脑下完棋后,得有一个函数来判断输赢,当出现输赢或平局后应该结束该函数。以上就是三子棋游戏所有的实现步骤,先建立一个大的框架,在框架中一步一步的添加需要的东西,最后就可以构建出一个“三子棋”游戏。构建好主函数后,就可以见缝插针,将程序中缺少的函数补进去就好。在写代码前要提前考虑设计思路,根据要设计的游戏,逐步构建。2,棋盘的设计(初始化棋盘)

2023-05-10 18:19:29 71 4

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除