自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 找不到地方的稀碎知识点

java在使用一个类的时候会经历几个过程:加载,链接,初始化,使用,卸载。在初始化阶段才会真正实现new对象的过程(具体的类的加载过程后面会总结)我们这里定义了两个wuhu,一个内部类一个辅助类。可以看到new辅助类的对象时需要标明他是在thread_lock包中的。一个java文件中可以定义不止一个类,根据他们被定义的位置不同将他们称为内部类和辅助类。总得来说,静态的东西和这个类本身共存亡,普通的东西和实例(对象)共存亡。static可以用来修饰变量或方法以及部分类。

2024-07-17 17:10:55 391

原创 transformer总结

transformer这几年都比较火。因此来学习一下他的具体内容和主要工作。感谢李沐老师的视频和deepseek老师的帮助。transformer本质上也是一个RNN,decoder使用之前的输出内容,所以先从RNN说起,后面一点点深入

2025-05-26 21:26:22 782

原创 计算机网络八股

面相连接的可靠字节流传输。面相连接:通过一组四元数(因为协议已经相同了)标志,一对端口只能建立一个一次连接。可靠:通过重传机制保证数据按顺序,无损的到达上层。字节流:都是二进制传输的,不保留消息边界保证可靠传输和流量控制的一系列状态信息。比如源目的端口,窗口大小,socket,序列号四次的话冗余了,两次的话没法避免历史链接初始化,没法同步收发双方的序列号。如果只是两次握手的话,服务端在接受到一个syn包就会直接进入全开队列。

2025-05-15 11:41:52 1107

原创 Redis 八股

这期间父进程和子进程是共享物理内存的,当父进程对某一块内存进行修改的时候,才会将这块内存原有的内容复制给子进程,父进程修改内存(所谓的写时复制)。其实逻辑跟aof重写差不多,只不过aof重写的时候是生成语句并保存,rdb重写是记录对应的数据内容,用的时候直接读取就可以了。这样获取长度的复杂度为O(1),并且执行字符串拼接的时候不用再考虑内存分配(C的问题),最后,由于已经标明了字符串的长度,因此不需要再为字符串添加‘/0’的终止符,使得字符串现在不止可以储存文本,也可以储存二进制数据了。

2025-05-15 11:41:22 922

原创 java 八股

死锁的四个条件:互斥,占有且等待,不可抢占,循环等待。

2025-05-15 11:28:09 691

原创 关于Spring

这种实际上也是,SPring默认是jdk动态代理,这种代理要求被代理类实现接口(他的代理是一个实现了接口的类),接口方法的实现要求一定是public的,所以从效果来看是非public方法的事务失效,其实还是代理失效。事务失效:在SPring中,事务有个很重要的知识点是事务的失效。其实从根上说,SPring的事务是基于数据的事务的,所以不存在什么错误的问题,所谓事务失效其实指的更多的是由于没有正确使用代理等导致的@Transcational注解失效,即注解没有被正确识别并执行。这个说的是子事务嵌套父事务。

2025-05-10 17:05:25 948

原创 mysql 八股

如果是联合了多个列的索引,那么执行的时候从最左边开始匹配,能匹配上的可以用索引,从第一个匹配不上的开始,后面就都用不了了。对于没有使用过的页(free页,空闲页),使用但没有发生修改的页(clean页,干净页),发生修改的页(dirty页,脏页)用不同的链表维护。read view(下称快照)储存四个值:创建快照的事务id(creator_trx_id),未提交事务的最小id(min_trx_id),本事务认为的下一个可以被创建的事务id(max_trx_id),未提交的事务列表(m_ids)

2025-03-30 17:23:04 1013

原创 关于SpringBoot的理解

写一点我在做云盘项目的时候对SpringBoot框架的理解。

2025-02-10 17:35:33 1006

原创 关于工厂模式和单例模式

工厂模式就是将对象的创建过程封装在一个工厂类中,将创建对象的任务交给工厂完成。外部只能通过工厂类来指定创建或查找一个什么类型的对象,但不能直接创建对象。这样的好处在于实现了创建逻辑和业务逻辑的解耦。让代码变得更好看。工厂模式又可以细分为简单工厂模式、工厂方法模式和抽象工厂模式。

2025-02-10 15:12:07 658

原创 关于JVM

主要介绍JVM

2025-02-08 22:10:58 1310

原创 java小知识点:线程池的使用

具体方法如下:如果线程池中有空闲核心线程,那么任务由主线程放到阻塞队列中,主线程继续向后执行,空闲的核心线程(原本处于waiting等待状态)会来处理这个任务。如果线程池中没有空闲核心线程,但任务队列未满,那么主线程把任务放进线程池类的阻塞队列,主线程继续向后执行。如果任务队列已满,但运行线程数小于最大线程数,那么主线程唤醒一个非核心线程,并把任务交给非核心线程。在使用线程池解决任务时,实际上是拥有任务的线程(主线程)调用线程池的execute方法,来要求线程池处理任务。

2024-12-25 09:49:09 252

原创 java小知识点:比较器

当然,如果又自己写了一个比较器的话(Comparator),自己写的比较器优先级更高。主要用法是传入两个数(也可以不是Integer或int类型,这里只是把他们都统称为数),然后根据返回值来判断这两个数哪个在前那个在后。比如a大于b的时候返回一个负数,那么a在b的前面,如果返回正数,那么a在b后面。他内部实现用的是Timsort策略。关于compare接口的实现和Comparator类的区别,以下是gpt的一个总结。Comparartor在使用时,一般是以下的语法,这样来实现一个内部匿名类。

2024-12-22 20:46:47 446

原创 关于java中的锁

云盘的基本登录注册文件上传下载功能都已写完,下一步考虑并发情况。这里总结一下Java中的锁都有哪些锁大致可以分为乐观锁和悲观锁两类。java中大部分类都是由悲观锁实现的悲观锁认为并发任务中冲突情况发生较多,因此有必要显式地在操作数据时加锁;而乐观锁认为冲突情况较少,因此不去显式地加锁,而是在更新数据时进行验证,如果没有冲突就直接更新,有冲突的话根据一些准则来采取措施。

2024-12-10 21:27:54 678

原创 关于JSON格式

在后端中,如果处理前端请求的方法被@ResponseBody修饰,那么返回值的内容就会被被转化为JSON格式(这一步是Spring干的,一般要求返回值本身是Map或list等),然后放到相应消息的消息体中。这样前端在接受到响应消息时,就可以用.json()方法将消息中的消息体抽离出来,并将这个消息体(此时为JSON格式)转化为JavaScript对象或数组,储存在data变量中方便后面使用。JSON被设计出来是为了在不同系统之间传输,这里就是说JSON用于在前后端之间传输。

2024-12-06 10:56:29 375

原创 计算机网络习题解答--个人笔记(未完)

本篇文章为关于《计算机网络-自顶向下方法第七版》的阅读总结和课后习题解答(未完待续)

2024-11-26 19:49:52 622

原创 一个简单的登录注册任务

写一个注册登录的小任务,为后续自写一个云盘做准备先完成一个小的注册登录的内容来熟悉整个流程,使重点更突出。

2024-11-25 20:45:49 803

原创 ArrayList源代码阅读

ArrayList是非线程安全的,如果要多线程修改结构,则一定要加锁,否则可能导致灾难后果。size、isEmpty、get、set、iterator 和 listIterator都是常数时间的操作。ArrayList是List接口的大小可变数组的实现。他实现了List的全部可选操作,并且允许空值。实现了fast-fail的迭代器,但不建议用迭代器来判断异常,他仅应用于检测错误。扩容时会按照一个内置方法扩容,一般扩容为原本的1.5倍。(实现了一个长度可变的数组)普通方法:(棕色为私有方法)

2024-11-18 21:57:30 1055

原创 关于操作系统

关于操作系统,其实内容不是特别多,这里只把重点内容总结一下。这一块的内容比较细碎,因此以知识点的形式总结,不做完整的流程解释。

2024-09-17 20:06:43 747

原创 关于常量池

大体上可以分为编译时常量池和运行时常量池。

2024-09-04 21:21:42 374

原创 线程学习-2-通讯系统

要写一个简单的通讯系统,我们首先要明确几点:一:我们要有一个服务器和多个客户端、服务器和客户端之间通过套接字连接二:套接字之间通过输入输出流传递信息三:传递的信息的过程中要做好信息分割。四:一些技术细节。

2024-08-27 15:49:40 527

原创 java并发编程实战-初阅读-持续更新

从应用的角度来看,加锁实际上就是用synchronized关键字对一段代码或一个方法进行修饰。比如说,对一个类的实例(对象)中的某一个属性或方法进行访问时,从逻辑的角度上讲我们希望同时只有一个线程可以访问这个属性或方法,这时就需要加锁。就相当于我们有一个房间,但同一时间仅希望一个一个人进入,很简单地方法就是给这个房间加个锁。房间就相当于将要访问的属性或方法,人就相当于线程,加锁的动作就相当于用synchronized关键字修饰,加的锁就是使用关键字时加的参数。前面都比较好理解,这里再解释一下这个关键字。

2024-08-19 19:20:05 380

原创 HashMap源代码阅读初总结-看完线程安全之后再来看一遍

在刚开始的时候,HashMap中数量比较小,此时应该更倾向于将HashMap扩容而不是将List改为Tree。当List中元素多于第一个值(8)而HashMap整体元素少于第三个元素(64)时,对HashMap进行扩容而不是改变结构。即当他被遍历的过程中如果出现了结构改变的情况(增删元素,改变value的值不算),那么会报错。在普通初始化的时候,HashMap中每个值是List,当List中元素多到一定程度的时候会转化为(红黑)树。在HashMap中的元素多到一定程度的时候会将HashMap进行扩容。

2024-08-19 18:19:11 344

原创 计算机网络-入门版-持续更新

在刚开始学习计算机网络时,发现国内教材的切入点十分奇怪,上手十分困难,对初学者极不友好。因此在这里整理一下对计算机网络的整体框架做一下梳理,希望可以对后来者有一些帮助。

2024-08-16 18:05:17 497

原创 刷题笔记之动态规划

可以发现每次更新的时候都在使用上一行的内容,且只使用上一行的内容。区别就在于普通版的方法中,不放当前nums时用到的数据是上一行(01,从后往前)还是当前行(完全,从前往后)。现在感觉这类问题的难度主要集中在两点,一是发现这个问题可以用动态规划求解、一般情况下问题会披一个外衣,如何把这个外衣扒下来是有一些难度的。对于背包问题,一般会令一个数组,横坐标是背包容量+1,纵坐标为待选数组长度。01背包就是可以选择的元素只能选一次,完全背包则是可以选择无穷次。主要是要找到迭代的公式和对背包数组的初始化。

2024-08-01 20:46:28 235

原创 线程学习-1

可以认为并发是逻辑上同时进行(先一后二,但间隔极短),并行是严格意义上同时进行(一二同时,没有间隔)。在另一个类中new一个Runnable对象,然后new一个Thread对象,参数为新建的Runnable对象。例如对于一个8核16线程的CPU,他仅有8个物理核心(core)因此从物理上讲他只能同时处理8个并行的进程,但由于超线程技术(16线程),因此在逻辑上将可同时处理的线程增加到了16。线程和进程是两个不同的概念,可以简单理解为多个线程(Thread)组成一个进程(Process)。

2024-07-12 11:10:51 337

原创 刷题笔记之回溯算法①

写过二叉树,对递归算法有一些理解之后再来写回溯算法,其实会简单很多。回溯算法三步走:第一步:确定递归参数和返回值(参数根据实际情况确定,返回值大多数为void)第二步:确定递归停止条件第三步:确定循环中的逻辑(现在的感觉是用最后一层递归的逻辑来写比较好写)回溯算法实际上就是在原有递归的基础上又加了一个循环。如果把递归理解为深入的话,那么回溯就是浅出。下面用具体的例子来理解这一算法。

2024-05-20 11:38:18 294

原创 刷题笔记之二叉树 ①

二叉树有普通二叉树,满二叉树,完全二叉树,平衡二叉树,二叉搜索数等。二叉树实际上是某种意义上的链表。每个结点有左右两个子节点。每个节点储存相应的值。满二叉树指的是每个节点的左右子节点要么都为空,要么都不为空。完全二叉树指的是,如果把他相应的满二叉树按层级对节点标号,那么完全二叉树的节点标号和满二叉树一样。平衡二叉树:每个节点的左右子树的高度相差小于等于1.二叉搜索数:如果对二叉树按中序遍历,则得到的结果是从小到大排列的,并且没有重复元素。求解二叉树相关问题,一般有两套方法。递归或者迭代。

2024-05-17 10:21:46 896

原创 刷题笔记之字符串

首先来说一下字符串字符串不是一个基本数据类型(和int等不同)。他是java自己定义的一个类。

2024-04-15 16:09:15 830 1

原创 题外话之KL散度的一个简短说明

为了定义KL散度,我们需要依次定义信息量,熵,然后才能得到KL散度。并可以在最后延伸到交叉熵。

2024-04-12 10:14:36 415

原创 刷题笔记之哈希

由于本题要求的是返回下标,因此不能将数组进行重新排序(如果要求返回数组中的值而非下标的话,就可以考虑使用和三数之和,四数之和一样的双指针法了)。具体处理方法为:从头开始,先判断它是否可以和之前的元素一起构成题目需要的数组,如果可以的话将他们的下标一起输出,如果不可以的话就把这个元素存入HashMap里,Key为他的值,Value为他的下标。这题的思路纯纯的好东西,挺天才的。这就是标准的使用哈希法的题,因为他明确表明了唯一,哈希法是处理这类唯一问题的一个最好的方法(现阶段来看,以后怎么样不好说)

2024-04-01 11:36:52 689

原创 刷题笔记之链表

第二个为get,由于链表的性质,因此要求index一定大于0,小于0时直接返回,后续就是一个个向后找,找到了就返回对应的val,找不到就返回-1.第三个方法为添加头结点,依然是创建一个虚拟节点(不创建也行,这里创建实际上意义不大)。定义三个节点,一个当前操作的节点,一个前节点(希望当前节点指向的对象),一个临时节点储存当前节点的下一个节点(防止链表断掉)。在处理链表类问题的时候,要时刻记住自己处理的实际上不是变量,而是变量对应的那一块内存,一个变量可以有很多名字,他的名字也是随时可以被某个别的节点拿走的。

2024-03-24 16:30:17 303 1

原创 刷题笔记之数组

或者使用双指针法,一个指针对应最后要得到的数组,一个指针对应当前数组,如果当前数组指针对应的元素不是要被删除的元素,那么就把他令到得到数组指针对应的值上,并且两个指针都向后移动一位,如果是要删除的元素,那就只将当前数组指针向后移动一位,其他全部不变。双指针法的思路为从后和从前比较数的平方的大小,把大的数放在新数组的末尾,然后对应的指针向前或向后移动一位。暴力想法为依次遍历,找到相同的元素值时数组后的元素就都向前移动一位,然后从这一位接着往后找,这种方法需要注意循环结束条件。

2024-03-19 21:15:57 281 1

原创 知识应用之五子棋

需要用到的属性:标识黑棋或白棋的int变量count(后续取值只取0或1),记录落子次数的int变量num(从0开始),储存落子的stackLink变量chessLink,储存落子的数组变量Array,储存按钮文本的String变量str,储存绘图界面的Graphics变量g(需要在UI类中先定义Listener类的对象,并将Graphics传给Listener中的g以实现绘图。undo方法实现悔棋。首先创建UI类,继承JFrame类,设置窗口的布局方式,关闭键,标题,大小,位置,添加按钮,设置可视化。

2024-01-03 22:13:11 474 1

原创 哈希表的初步学习

问题主要出在哈希表的扩容上。对于链表中每一个节点的传递,我们都应该新令一个节点,它初对下一个节点的指向外,都与原节点相同,并把这个新节点挂在相应的链表上。而不建议把老节点直接挂在新链表上,这样会导致老节点之后的节点由于没有节点指向它而出现丢失的情况。

2024-01-01 21:31:27 419

原创 链表的初步学习

链表和数组一样,也是一种数据结构,但与数组在以下几个方面有所不同。首先,在所占用地址方面,数组占用固定长度的内存,也就意味着数组的长度是不可变化的。而链表占用的内存不固定,这就使得链表的长度可变。其次,在下标方面,数组的每一个元素都有与之对应的下标,但链表没有。这就意味这链表想要找到某一位置的元素,就只能从头开始遍历。最后,在每个位置的元素方面,数组的元素只储存这个位置的值。链表则不止储存这个位置的值,还储存下一个元素的地址。

2023-12-21 21:46:05 416 1

原创 创建一个长度可变的数组

数组定义有三个初始化方法1没有输入参数,这时候我们自己定义数组及其长度2输入参数为数组长度,这时候我们根据输入长度来定义数组3输入参数为数组,这时候将输入数组的内容传给我们自己的数组注意,我们希望我们自己定义的数组null元素只出现在末尾。

2023-12-11 11:38:47 763 1

原创 使用java进行简易绘图板制作

在这个类里面定义一个方法,实现窗口本身的定义(名字,大小,位置,x键的作用,窗口类型)实现按钮的定义(类型和颜色)对于按钮监听器,获取按钮上的文本,如果为空表示为颜色按钮,获取按钮颜色(此时要用到转型的方法),否则为类型按钮,获取其文本。对于鼠标监听器,依据文本的不同实现图形的绘制。同时定义一个数组,将每一次的操作都保存到这个数组里。(具体方法为定义一个新类,其中属性为一次点击或操作需要保存的数据,将这个类的对象作为数组来保存数据)注意,绘制图形的时候需要Graphic对象及其相应方法。

2023-12-03 22:35:43 228 1

原创 动作监听器的总结_1

# 动作监听器本质上是接口的应用,目的是为了在用户点击不同的按钮时可以得到不同的效果。

2023-11-23 22:23:49 145

原创 关于界面开发之动作监听器之接口11.22(初学者笔记_4)

从某种意义来说,接口和类是相互对应的。类的属性可以是抽象或具体的(换句话说,可以只定义属性(抽象)但不具体赋值)。但类的方法一定要是有完整定义的(参数只是没有具体数值,他的逻辑都是完整的)

2023-11-22 11:52:42 75

原创 关于界面开发之登陆界面11.20(初学者笔记_3)

在创建登录页面时,实际上就是构建了一个新的类。并在这个类中定义了一个方法来实现页面的创造。

2023-11-20 16:10:30 92 1

空空如也

空空如也

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

TA关注的人

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