- 博客(531)
- 资源 (2)
- 收藏
- 关注
原创 实现双端队列和阻塞队列
当多线程并发的情况下,队列只有一个空位时,唤醒了阻塞的线程,可能这个时候恰好又有一个线程也要操作入队,恰好比他这个刚被唤醒的线程抢先一步拿到了锁,发现队列没有满,就添加元素,队列又满了,执行完释放锁;此时又来了一个offer线程,抢到了锁,又把队列放满了,那么被唤醒的线程此次为虚假唤醒,但是不能再继续等待5s了,已经等待了2s,只需要再等待3s;针对单锁的实现,出队和入队都使用了一把锁,实际出队和入队是不冲突的,所以为了提高性能,这里出队使用一把锁,入队使用另一把锁。让offer线程进入阻塞状态。
2025-02-13 13:20:19
942
原创 实现B-树
B树(B-Tree)结构是一种高效存储和查询数据的方法,它的历史可以追溯到1970年代早期。B树的发明人Rudolf Bayer和Edward M. McCreight分别发表了一篇论文介绍了B树。这篇论文是1972年发表于《ACM Transactions on Database Systems》中的,题目为"Organization and Maintenance of Large Ordered Indexes"。
2025-01-25 13:14:46
1918
原创 实现红黑树
红黑树是一种自平衡二叉查找树,最早由一位名叫Rudolf Bayer的德国计算机科学家于1972年发明。然而,最初的树形结构不是现在的红黑树,而是一种称为B树的结构,它是一种多叉树,可用于在磁盘上存储大量数据。在1980年代早期,计算机科学家Leonard Adleman和Daniel Sleator推广了红黑树,并证明了它的自平衡性和高效性。从那时起,红黑树成为了最流行的自平衡二叉查找树之一,并被广泛应用于许多领域,如编译器、操作系统、数据库等。
2025-01-23 14:48:00
808
原创 实现AVL树
AVL 树是一种自平衡二叉搜索树,由托尔·哈斯特罗姆在 1960 年提出并在 1962 年发表。它的名字来源于发明者的名字:Adelson-Velsky 和 Landis,他们是苏联数学家,于 1962 年发表了一篇论文,详细介绍了 AVL 树的概念和性质。AVL 树是用于存储有序数据的一种重要数据结构,它是二叉搜索树的一种改进和扩展。它不仅能够提高搜索、插入和删除操作的效率,而且还能够确保树的深度始终保持在 O(log n) 的水平。int key;
2025-01-21 16:37:15
487
原创 堆的底层和实现及相关应用
堆是一种基于树的数据结构,通常用完全二叉树实现。完全二叉树:除了最后一层外,其他层的节点都达到最大,并且最后一层的节点从左到右排列。满二叉树:每一层的节点都被完全填满的二叉树,并且每个非叶子节点都有两个子节点完全二叉树1/ \2 3/ \ /4 5 6满二叉树1/ \2 3/ \ / \4 5 6 7满二叉树也是完全二叉树。
2025-01-15 15:04:11
1096
1
原创 【判环】Floyd 龟兔赛跑算法
Floyd 龟兔赛跑算法(也称为Floyd 判圈算法或Floyd 循环检测算法是一种用于检测链表中是否存在环的算法。如果链表上存在环,那么在环上以不同速度前进的两个指针必定会在某个时刻相遇。
2025-01-09 20:31:37
1097
原创 【递归与分治】Leetcode23:合并K个升序链表
将两个升序链表合并为一个新的 升序 链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。分而治之,分到区间内只有一个链表,合并区间;所以问题就转化为了合并两个有序链表。请你将所有链表合并到一个升序链表中,返回合并后的链表。给你一个链表数组,每个链表都已经按升序排列。
2025-01-08 15:22:07
347
原创 Java中的类加载器
名称加载哪的类说明无法直接访问上级为 Bootstrap,显示为 nullclasspath上级为 Extension自定义类加载器自定义上级为 App启动类加载器(bootstrap class loader):由 C++ 实现的,没有对应的 Java 对象,因此在 Java 中只能用 null 来指代。负责加载最为基础、最为重要的类,比如存放在 JRE 的 lib 目录下 jar 包中的类(以及由虚拟机参数 -Xbootclasspath 指定的类)扩展类加载器。
2024-11-22 10:58:33
1124
1
原创 运行期优化
另一方面,对于仅占据小部分的热点代码,我们则可以将其编译成机器码,以达到理想的运行速度。当调用到第 16 次(从0开始算)时,会采用运行时生成的类代替掉最初的实现,可以通过 debug 得到类名为 sun.reflect.GeneratedMethodAccessor1。以上代码在C2编译器中执行了逃逸分析的优化,因为new Object不会逃离出该方法,则不会再继续创建对象,时间就降低了很多。profiling 是指在运行过程中收集一些程序执行状态的数据,例如【方法的调用次数】,【循环的回边次数】等。
2024-11-22 10:56:58
722
原创 【多路递归】汉诺塔&杨辉三角
在经典汉诺塔问题中,有 3 根柱子及 N 个不同大小的穿孔圆盘,盘子可以滑入任意一根柱子。一开始,所有盘子自上而下按升序依次套在第一根柱子上(即每一个盘子只能放在更大的盘子上面)。每次求出的元素缓存到数组中,判断当前要求的数组里是不是有了,如果有了,就直接从数组中拿出来,不用再递归计算了。总结:两片圆盘的移动方法就是最终的移动方法,大于2片的都能拆解成2片的移动方法。从图中可以看出,已知的元素是每一行的第一个元素和最后一个元素都是1;在「杨辉三角」中,每个数是它左上方和右上方的数的和。
2024-07-29 11:57:20
456
1
原创 Redis哨兵集群搭建
准备6台机器,都安装上Redis,一台作为主节点,两台作为从节点,三台作为哨兵节点。只有master节点上可以执行写操作,两个slave节点只能执行读操作。这里我的redis版本很低,因为项目太老了,支持不了高版本。测试:主节点中设置的值,可以在两个从节点中get到。注意:日志文件要创建好。只需要在从节点配置上。
2024-06-24 22:17:45
813
原创 【算法】递归
递归是一种解决计算问题的方法,解决方案取决于同一类问题的更小子集。自己调用自己,如果说每个函数对应着一种解决方案,自己调用自己意味着解决方案是一样的(有规律的)每次调用,函数处理的数据会较上次缩减(子集),而且最后会缩减至无需继续递内层函数调用(子集处理) 完成,外层函数才能算调用完成return;
2024-05-19 18:40:26
818
原创 【算法】滑动窗口
在算法中,滑动窗口是一种处理连续子数组或子字符串的技术。它通过定义一个固定大小的窗口,使用两个指针,在数组或字符串上移动这个窗口,以便对窗口内的数据进行操作或计算。
2024-05-05 19:22:40
461
原创 【算法】双指针
头指针和尾指针,头指针从下标0开始,尾指针从最后一个元素(下标nums.length-1)开始,头指针前进,尾指针后退,直到相遇就是遍历完了;遍历的过程中,每次都取出更大的那个数,存入一个新的数组中,从最后一个下标往前存,因为是非递减的。给你一个按 非递减顺序 排序的整数数组 nums,返回 每个数字的平方 组成的新数组,要求也按 非递减顺序 排序。没有遇到目标元素时所指向的元素(符合的元素),都存入新数组(slow指向)定义一个慢指针slow,用来指向新的数组的元素(删除了目标元素后的)
2024-05-03 15:55:32
466
原创 【算法】二分查找
给你一个按照非递减顺序排列的整数数组nums,和一个目标值target。请你找出给定目标值在数组中的开始位置和结束位置。如果数组中不存在目标值target,返回[-1, -1]。你必须设计并实现时间复杂度为O(log n)的算法解决此问题。// 查找最左侧元素}else{// 查找最右侧元素int i = 0;j = mid -1;}else {// 最左元素}else{//最右元素。
2024-05-02 15:26:46
962
3
原创 Leetcode29:两数相除
例如,8.345 将被截断为 8 ,-2.7335 将被截断至 -2。思路:判断乘数b的位数是不是1,通过让他和1进行&运算,如果是1,说明当前位是1。得到的 ^运算结果 和 &运算结果左移 相加就是和,依次执行,直到进位信息没有了,就通过位运算实现了加法。如果两个都为1,那么就会有进位信息,用&运算,得到的就是1,再往左移动一位,结果就是进位信息。&完的结果如果是1,把被乘数a作为要相加的和,左移一位(下一次如果是1的和)。使用^运算(^ : 两个位相同为0,相异为1)的到的结果就是无进位相加的结果。
2024-02-14 23:53:01
586
原创 Leetcode21:合并两个有序链表
一开始先找出头更小的那个链表作为头节点,依次取出两个指针指向的链表元素,谁小,就改变当前节点的指向,让当前节点始终指向更小的元素。两个指针一直前进,当指向为空时,遍历结束。将两个升序链表合并为一个新的 升序 链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。思路:分别用两个指针遍历两个链表,再用一个指针专门改变链表的指向。
2024-02-06 19:38:24
639
原创 Leetcode02.05:链表求和
思路:因为链表是按照个位十位百位逆序存储的,所以直接顺序遍历链表,第一个就是个位,接着十位,百位等。两个链表的值相加存储作为一个新节点存储,进位信息单独存到一个变量中,每次都加上这个进位信息。给定两个用链表表示的整数,每个节点包含一个数位。编写函数对这两个整数求和,并用链表形式返回结果。这些数位是反向存放的,也就是个位排在链表首部。
2024-02-05 18:31:50
577
原创 Leetcode24:两两交换链表中的节点
思路:让一个指针指向要交换的两个节点的前一个节点(cur),每次让两个要交换的节点的后一个节点来到cur的后面。cur指针再向前移动两位。直到cur的后一位没有元素(奇数个元素)或者cur的后一位的后一位没有元素(偶数个元素)给你一个链表,两两交换其中相邻的节点,并返回交换后链表的头节点。你必须在不修改节点内部的值的情况下完成本题(即,只能进行节点交换)。因为第一个节点没有前一个元素,所以设置一个虚拟头节点,方便第一个元素和后面的元素能走相同的逻辑。
2024-02-04 14:27:43
564
原创 Leetcode92:反转链表II(区间反转链表)
每次让left后面的节点(cur指针指向的元素)插入到left前面(preHead指针的位置)。即头插法(可以看我上一篇文章的反转链表的第一种解法,只是这里不创建新的节点,而是直接改变前后节点的指针;因为按照3个指针的写法,left位置前面是有一个节点的,但是如果要逆序的就是第一个和第二个,如果没有头节点,preHead就不存在了,就又要特殊处理。请你反转从位置 left 到位置 right 的链表节点,返回 反转后的链表。left和right是索引,但是是从1开始(很无语,,,害我写了好多次才通过)
2024-02-03 22:46:22
567
原创 Leetcode206:反转链表
在递归内部的操作把指针的指向改变,为了防止循环引用,在改变完当前节点的指向后,还要把前一个节点的指针指为空。构造一个新链表,从旧链表中取出节点,一个个插入到新链表的头部,最后就逆序了。给你单链表的头节点 head ,请你反转链表,并返回反转后的链表。通过递归调用每次让头指针往后移,即相当于执行了。
2024-02-02 12:39:01
535
原创 Java中的读写锁
方法(乐观读),读取完毕后需要做一次 戳校验, 如果校验通过,表示这期间确实没有写操作,数据可以安全使用,如果校验没通过,需要重新获取读锁,保证数据安全。乐观读,StampedLock 支持。持有写锁的情况下去获取读锁,支持。不支持条件变量,不支持重入。
2024-01-18 09:37:04
710
原创 MySql存储引擎
InnoDB是一种兼顾高可靠性和高性能的通用存储引擎,在 MySQL 5.5 之后,InnoDB是默认的MySQL 存储引擎。MyISAM是MySQL早期的默认存储引擎Memory引擎的表数据时存储在内存中的,由于受到硬件问题、或断电问题的影响,只能将这些表作为临时表或缓存使用。
2023-12-30 09:42:53
916
原创 JVM垃圾回收
当年轻代进行minor gc时,把eden和from放到to区的时候,to区不够用了,需要把存活的对象移动至老年代,当老年代没有足够的空间或者有足够的空间但是太碎片化(标记-清除算法)时,就会发生Promotion Fail。回收的这些对象所占用的内存地址的起始和结束地址纪录下来,放入空闲地址列表,下次再分配内存时,在空闲地址列表中找是否有足够的空闲空间容纳新对象,有则使用。当引用发生改变时,加入写屏障,把发生了引用的对象加入到队列中,将对象的颜色改为灰色,重新标记阶段会把队列中的对象再标记一次。
2023-12-20 11:10:22
1035
原创 Java线程
当 Context Switch 发生时,需要由操作系统保存当前线程的状态,并恢复另一个线程的状态,Java 中对应的概念就是程序计数器(Program Counter Register),它的作用是。有一种特殊的线程叫做守护线程,只要其它非守护线程运行结束了,即使守护线程的代码没有执行完,也会强制结束。正常运行的线程被打断之后,不会终止运行,只是收到了一个被打断的标识,如果需要根据被打断做处理,需要手动写代码处理,被打断的线程自己决定是要继续运行还是停止运行。
2023-12-19 09:14:08
886
原创 Docker容器数据卷
卷就是目录或文件,存在于一个或多个容器中,由docker挂载到容器,但不属于联合文件系统,因此能够绕过Union File System提供一些用于持续存储或共享数据的特性。卷的设计目的就是数据的持久化,完全独立于容器的生存周期,因此Docker不会在容器删除时删除其挂载的数据卷。
2023-12-14 16:14:13
758
原创 Docker命令详解
启动docker : 停止docker:重启docker:查看docker状态:开机启动:查看docker概要信息:查看docker总体帮助文档:查看docker命令帮助文档:二、镜像命令1.docker images列出本地主机上的镜像:OPTIONS:REPOSITORY:镜像的仓库源TAG:镜像的标签版本号IMAGE ID:镜像IDCREATED:镜像创建时间SIZE:镜像大小虚悬镜像dangling image:上图中仓库名、标签都是的镜像:从docker hub(https
2023-07-15 17:51:56
1539
原创 Docker基本介绍
Docker 是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的 Linux 机器上,也可以实现虚拟化。解决了运行环境和配置问题的软件容器, 方便做持续集成并有助于整体发布的容器虚拟化技术。容器是完全使用沙箱机制,相互之间不会有任何接口。传统虚拟机技术是虚拟出一套硬件后,在其上运行一个完整操作系统,在该系统上再运行所需应用进程;容器内的应用进程直接运行于宿主的内核,容器内没有自己的内核且也没有进行硬件虚拟。因此容器要比传统虚拟机更为轻便。
2023-06-11 17:13:15
2702
原创 Docker基本介绍
Docker 是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的 Linux 机器上,也可以实现虚拟化。解决了运行环境和配置问题的软件容器, 方便做持续集成并有助于整体发布的容器虚拟化技术。容器是完全使用沙箱机制,相互之间不会有任何接口。传统虚拟机技术是虚拟出一套硬件后,在其上运行一个完整操作系统,在该系统上再运行所需应用进程;容器内的应用进程直接运行于宿主的内核,容器内没有自己的内核且也没有进行硬件虚拟。因此容器要比传统虚拟机更为轻便。
2023-06-02 22:44:34
698
原创 线程池
Java 语言中创建线程看上去就像创建一个对象一样简单,只需要 new Thread() 就可以了,但实际上创建线程远不是创建一个对象那么简单。创建对象,仅仅是在 JVM 的堆里分配一块内存而已;而创建一个线程,却需要调用操作系统内核的 API,然后操作系统要为线程分配一系列的资源,这个成本就很高了,所以线程是一个重量级的对象,应该避免频繁创建和销毁。
2023-03-02 15:35:22
288
原创 Tomcat性能调优
开篇介绍大家好,我是Java最全面试题库的提裤姐,今天这篇是分布式技术的第六篇,主要介绍Tomcat性能调优;在后续,会沿着第一篇开篇的知识线路一直总结下去,做到日更!如果我能做到百日百更,希望你也可以跟着百日百刷,一百天养成一个好习惯。怎样给 tomcat调优1.JVM参数调优-Xms<size>示JVM初始化堆的大小,-Xmx<size>表示JVM堆的最大值。这两个值的大小一般根据需要进行设置。当应用程序需要的内存超出堆的最大值时虚拟机就会提示内存溢出,并且导致应用服务
2020-09-29 17:01:37
404
原创 SpringMVC流程分析及相关组件介绍
一、入门程序pom.xml:<?xml version="1.0" encoding="UTF-8"?><project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org
2020-06-05 09:52:59
301
原创 Elasticsearch初识
一、安装和配置1.安装elasticsearch默认不允许以root账号运行,所以创建一个用户创建用户:useradd tracy设置密码:passwd xxx此时可能由于密码过于简单提示,直接再输入一次回车即可切换用户:su - tracy上传安装包切回root用户,分配tracy用户权限:chown tracy:tracy elasticsearch-6.3.0.tar.gzchmod 755 elasticsearch-6.3.0.tar.gz解压之后的目录:2.配置如果
2020-05-15 00:38:47
348
原创 CentOS上redis的安装及基本使用
一、安装wget工具下载:yum -y install wget在CentOS上安装redis:$ wget http://download.redis.io/releases/redis-5.0.5.tar.gz$ tar xzf redis-5.0.5.tar.gz 解压$ cd redis-5.0.5$ make 编译解压redis到指定位置:tar xzf redis-5....
2020-03-12 23:11:02
609
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人