自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(30)
  • 问答 (3)
  • 收藏
  • 关注

原创 记一次使用线程池解决性能问题

(1.b)当前线程数大于等于核心线程数,(1.b.1)任务队列如果是无界队列,新任务会被加入队列等待执行,(1.b.2)任务队列如果是有界队列,并且未满,新任务会被加入队列等待执行;(1.b.3)任务队列是有界队列并且队列已满,如果当前线程数小于最大线程数,线程池会创建一个线程执行新任务,否则线程池会执行拒绝策略。线程池本来就是Java为我们提供用来管理线程和任务的工具,提供了很多可选参数,比如核心线程数,最大线程数,任务队列类型等供开发者配置合适的线程池适用于不同的业务场景,降低资源浪费和提高响应速度。

2023-08-16 22:38:04 101

原创 读者写者问题

互斥:线程A和线程B不能在同一个时刻对临界区进行操作。比如线程A是A某人,B线程B某人,碗就是临界区,饭就是临界区的数据,吃饭就是对临界区的数据进行操作,A某人不可能和B某人在同一个时刻吃碗里的饭。要是它们在同一个时刻吃了碗里的饭,A某人吃了一口,然后发现碗里少了两口饭,百思不得其解…。同步:线程A必须在线程B之前对临界区进行操作。比如线程A的操作:用碗盛饭,线程B的操作:用碗吃饭。要是线程B在线程A前面执行,你吃什么。

2023-02-19 18:47:42 446

原创 Linux命令学习总结

Shell是命令解释器,用于解释用户对操作系统的操作比如用户输入ls命令,ls命令交给文件管理系统(内核态),文件系统处理好后将结果返回给用户。Linux启动过程BIOS 基本输入输出系统MBR 硬盘的引导记录BootLoader(grup) 启动和引导内核的一种工具kernelsystemd系统初始化shell开机时按F2进入BIOShexdump -C mbr.bin (以十六进制查看)Centos6使用initCentos7使用systemdShell脚本格式。

2022-10-10 13:22:31 942

原创 二叉树的三种遍历实现(迭代法)

为什么右子节点比左子节点先入栈,因为这样右子节点就比左子节点后出栈,节点出栈的顺序就是中左右了,正好和二叉树的前序遍历顺序一样。前序遍历的顺序是中左右,我们可以创建一个栈,利用栈的特性帮助我们前序遍历二叉树,先将二叉树的根节点入栈,再将根节点出栈,加入到结果集中,再将根节点的右子节点先入栈,左子节点再入栈,后序遍历的顺序是左右中,我们只需稍稍改变前序遍历的迭代法实现,得到遍历顺序为中右左的结果集,再将结果集翻转就可以得到后序遍历为左右中的结果集了。当要处理的节点放入栈中,可以再放入一个空节点做标记来实现。

2022-09-14 20:58:42 488

原创 MYSQL5.7 版本zip格式安装

MYSQL5.7 版本zip格式安装先去MySQL官网 http://devmysql.com/downloads/ 下载MySQL5.7版本的zip格式文件。将zip文件解压到指定目录添加MySQL安装目录下bin文件夹所在的绝对路径到系统环境变量path以管理员的权限运行命令行窗口,并切换目录到MySQL安装目录下的bin文件夹使用 mysqld --install命令安装MySQL服务(MySQL服务可通过mysqld --remove命令卸载)使用mysql --initialize

2022-03-23 09:48:58 1235

原创 浅谈Java的Object类

而Java作为一个面向对象的语言,每一个对象也一定会有一些共同的行为,比如比较对象是否相等、计算对象的哈希值、让线程在这个对象上等待、唤醒等待在这个对象上的一个或者多个线程等,我们把这些行为封装到一个类中,让Java中所有对象默认继承这个类,从而拥有通用的行为,这个类就是Object类。需要知道一个对象存储位置的下标时,就需要hashcode()方法;需要知道对象的信息、回收对象、克隆对象就分别调用toString()方法、finalize()方法、clone()方法。

2023-05-22 18:24:14 112

原创 以一个简单的例子说明MySQL的索引

比如每8栋楼排成一列,你只能看到每一列的第一栋楼的号码,现在你要去18号楼,你看到的第一列的楼栋号是1,第二列的楼栋号是9,你就知道18号楼不在第一列,然后看第三列的楼栋号是17,第四列的楼栋号是25,你就知道去第三列找第18号楼,这是顺序查找,可以通过二分查找加快查找速度。同理,你知道去17到20这个区找18号楼,于是你就走入17到20这个区,相当于加载17号到20号上的磁盘页到内存中,如果你找到18号后,又想找到19号,20号,就直接在这个区里顺序找,因为你就在这个区,相当于数据就在内存中。

2023-03-04 23:58:13 173

原创 一条SQL查询语句是怎么执行的

首先,在mysql客户端工具的命令行中输入mysql -h$目标主机ip地址 -p$端口号 -u$MySQL用户名 -p,然后在交互命令行输入密码(可以防止密码泄露),当MySQL客户端和服务端完成TCP握手后,MySQL服务端会校验用户名和密码,校验不通过,服务端会返回给客户端错误信息;mysql连接分长连接和短连接,长连接是指客户端后续发来的请求都在这个连接中执行,短连接是指客户端后续发来的请求执行几次就断开这次连接,然后新建一个连接执行。因为建立连接是一个复杂的操作,所有推荐使用长连接。

2023-02-07 15:07:13 140

原创 LeetCode 225. 用队列实现栈

入栈时直接入队到queue1中,出栈时queue1队尾的元素就是栈顶元素,我们需要获得它,直接将queue1队尾之前的元素全部入队到queue2,取得它,再把queue2的元素全部入队到queue1中。leetcode官方题解的两种思路:一种用了两个队列queue1(作为真正的栈),queue2,入栈时元素e入队到queue2中,在把queue1的元素全部入队到queue2中,最后交换queue1、queue2,这样queue1队首的元素就是栈顶的元素,而queue2是空队。

2022-10-26 13:55:45 70

原创 剑指 Offer 35. 复杂链表的复制

直接在原链表上复制每一个节点在原节点的后面(复制操作),1->2->3复制后为1->1->2->2->3->3。再让新的复制节点的random的指针域指向原节点指针的下一个节点,最后把新链表从原链表拆分出来。用两个Node型的动态数组ArrayList,一个为temp,另一个为res,temp存放原链表的每一个节点,res存放复制过来的每一个节点(节点中next指针域和random指针域都没有赋值),然后遍历res,给res中每一个节点的next指针域和random指针域赋值。可以用哈希+递归实现。

2022-10-23 13:53:30 127

原创 实现基本数据结构之二分搜索树

【代码】实现基本数据结构之二分搜索树。

2022-10-15 20:37:58 171

原创 进程的fork、wait、exec

C语言用fork()创建一个子进程时,子进程会复制父进程,子进程会从fork()函数的调用出返回。子进程对于fork()函数的返回值是0,父进程返回值是子进程的PID,如果创建子进程失败,fork()返回值小于0。调用wait,父进程会等待子进程完成后再执行。wait的返回值是父进程等待的子进程的PID。子进程不一定会比父进程执行的慢,当父进程创建子进程时,子进程会和父进程抢占CPU的资源。

2022-10-11 11:40:45 512

原创 统计网站人数

【代码】统计网站人数。

2022-10-10 20:59:05 384

原创 leetcode290. 单词规律(一种巧妙解法)

【代码】leetcode290. 单词规律(一种巧妙解法)

2022-10-10 09:22:52 82

原创 实现基本数据结构之链表

因为链表不是对称的,而队列需要一端添加元素,一端取出元素,但可以用一个尾指针指向链表尾部,头指针作为队首(因为从尾指针删除元素时间复杂度为O(N),而从头指针删除元素时间复杂度为O(1)),尾指针作为队尾,这里不使用虚拟头节点。可以发现普通队列所用时间较长,与循环队列和链表队列相差百倍,是因为普通队列的出队的时间复杂度为O(n),另外两个队列出队的时间复杂度为O(1)。在上面的链表实现过程中,向链表头插入元素和向链表指定位置插入元素逻辑上有些区别,可以用一个虚拟头节点来指向头节点,使两者逻辑一样。

2022-10-08 15:26:10 266

原创 实现基本数据结构之队列

上面实现的队列其中出队的时间复杂度为O(n),因为它是将动态数组的第一个元素删除并返回,还需要将后面的元素都向前移动一位。但循环队列使用front指针指向队首,tail指针指向队尾来时出队和入队的时间复杂度都为O(1)。当front==tail,队列为空,当(tail + 1) % capacity == front队列为满(浪费了一个空间以此来区分队列为空和队列为满时判断条件不一样)。

2022-10-01 21:38:49 153

原创 实现基本数据结构之栈

【代码】实现基本数据结构之栈。

2022-10-01 16:16:05 184

原创 实现基本数据结构之数组

数组

2022-10-01 14:49:59 376

原创 leetcode回溯法相关题目

*解题思路:**数组中有重复的元素,但不能重复的组合,这题还是用回溯法解题,只不过需要去重,有两种方法,法一,用一个used[]数组记录一个元素是否在一次递归中使用,如果nums[i] = nums[i -1]&&used[i - 1] == false,则跳过当前遍历,法二,直接用i > stratIndex && nums[i] == nums[i -1]来判断是否需要去重。回溯法,**难点:**数组中有重复的元素,但结果集中要求不能有重复的组合,注意数组中的每个元素只能使用1次。

2022-09-29 21:51:22 253

原创 48. 旋转图像

*思路二:**向将数组上下翻转,后沿着主对角线翻转,最终可以达到将数组顺时针旋转90度的效果。:通过旋转模拟,由外向内,每一次都交换四个元素的位置,直到一层元素都顺时针旋转完毕。

2022-09-26 17:09:54 89

原创 56. 合并区间

*解题思路:**先将intervals数组按左边界从小到大排序,要是下一个区间的左边界小于或等于区间的右边界,说明这两个区间可以合并成一个区间,同时更新右边界的值为两个右边界中的最大值,比如[1,5],[2,3],[4,5]可以合并成[1,5]。先将[1,5],[2,3]合并成[1,5],再合并[4,5]为[1,5]。

2022-09-26 10:44:57 102

原创 706. 设计哈希映射

*思路一:**用一个大小为10的6次方+1的大小来对应哈希表的键值对映射。缺点:元素太多,存不下去,元素太少浪费空间。数组+链表实现,平衡时间和空间,用链地址法实现。

2022-09-26 09:03:34 71

原创 前端用axios发送不为空的数据给后端,后端接受数据为空

看看后端接口的接受参数是否加上@RequestBody注解,接受json格式的数据,还要注意前后端变量名的一致性。

2022-09-21 23:28:51 306

原创 77. 组合

【代码】77. 组合。

2022-09-19 21:37:23 75

原创 226.翻转二叉树

【代码】226.翻转二叉树。

2022-09-16 19:57:49 118

原创 二叉树的层次遍历(迭代法、递归实现)及leetcode相关刷题

因为需要存放树节点的值和根据一个值来判断是否开始遍历下一层的元素,所以递归函数的参数列表中应该有一个树节点和一个int的值,函数不需要返回数据,只需在递归函数对数据进行处理时,将结果加入到res中,所以返回类型是void。当树节点的值为null时,就终止递归,最后是函数的处理逻辑,在递归函数中实现。队列的特点是元素先进先出,符合一层一层的打印二叉树元素的逻辑,只需用一个变量记录每一层有多少个节点,结合广度优先遍历二叉树就可以实现。

2022-09-15 20:46:23 229

原创 Cookie和Session的基础知识

Cookie : 客户端会话技术,将数据保存到客户端,以后每次请求都携带Cookie数据访问,让服务端通过Cookie来识别客户端。

2022-09-14 14:41:18 280

原创 用递归法实现二叉树的三种遍历

而二叉树的中序、后序遍历只需改变下单层递归处理逻辑就行了。

2022-09-12 11:15:25 168

原创 剑指 Offer 32 - I. 从上到下打印二叉树(Java迭代法实现)

找下规律, 发现队列可以实现层次遍历, 比如根节点3先入队,再将队列的第一个节点出队,并将出队的左右子节点(不为空)入队,直到队列为空。给定二叉树: [3,9,20,null,null,15,7]

2022-09-12 09:37:52 229

原创 剑指 Offer 19. 正则表达式匹配(Java动态规划)

【代码】剑指 Offer 19. 正则表达式匹配(Java动态规划)

2022-09-11 17:42:12 136

空空如也

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

TA关注的人

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