- 博客(78)
- 收藏
- 关注
原创 JavaWeb
servlet是一个接口,有一个HttpServlet extends GenericServlet,这个GenericServlet implements Servlet, ServletConfig, Serializable。在这么复杂的继承以及实现关系下,当我们定义的类继承了HttpServlet后,就可以通过前人写好的方法来进行Java Web的开发。来实现在网页上的呈现。那么就得通过一个服务器来实现。没错这个服务器就是Tomcat。
2024-10-29 17:55:14 336
原创 Linux
ls -l 显示的内容如上图所示前面的那串乱码是什么意思呢??chown newowner 文件/目录 改变所有者chown newowner:newgroup 文件/目录 改变所有者和所在组-R 选项,如果是目录,就使得其目录下所有的文件和目录所有者递归生效任务调度:是系统在某个时间执行的特定的命令或程序任务调度分类: 1. 系统工作:有些重要的工作必须周而复始的执行2. 个别用户工作:个别用户可能希望执行某些程序。
2024-10-08 15:38:10 1237
原创 JVM内存模型与线程
Java内存模型的主要目的是定义程序当中各种变量访问规则,即关注在虚拟机中把变量存储到内存和从内存当做取出变量值这样的底层细节。此处的变量不包括局部变量和方法参数,因为后者是线程私有的。Java内存模型当中规定了所有的变量都存储在主内存当中。每条线程还有自己的工作内存,线程的工作内存当中还保存了被该线程使用的变量的主内存副本(这个对象的引用,对象中某个在线程当中访问到的字段是有可能会被复制的,并不会复制全部内容)。线程对变量的多有操作都需在工作内存当中进行,而不能直接读写主内存当中的数据。
2024-09-02 19:29:48 778 1
原创 虚拟机字节码执行引擎
栈帧是用于支持虚拟机进行方法调用执行背后的数据结构每一个栈帧都在Java程序进行编译的时候,他需要多大的空间,多么深的操作都被计算好了后写入了Code属性当中,所以一个栈帧需要多少内存只取决于程序源码和虚拟机的栈内存结构每一个栈帧都包括局部变量表,操作数栈,动态连接,方法返回地址和一些额外的附加信息。在活动线程线程当中只有位于栈顶的方法才是运行的,只有处于栈顶的栈帧才是生效的,我们称其为“当前栈帧”
2024-09-02 18:01:20 1072
原创 类文件及其加载机制
Class文件是一组以8个字节为基础单位的二进制流,各个数据项目严格按照顺序紧凑排列在文件当中,中间没有任何的分隔符,这使得整个Class文件当中存储的内容几乎完全都是程序运行的必要数据。当Class文件需要占用8个字节以上空间的数据项时,则会按照高位在前的方式分割成若干个8位字节进行存储。根据《虚拟机规范》的规定,Class文件格式采用类似C语言结构体的伪结构来存储数据。这种伪结构当中只有两种数据类型:“无符号数”和“表”。
2024-09-01 01:32:15 987
原创 内存区域与内存溢出异常
程序计数器就是当前线程的字节码的行号指示器,是程序控制流的指示器,分支,循环,跳转,异常处理,均要这个计数器来完成。Java虚拟机的多线程是线程轮流切换,分配执行时间来实现的,所以在任何一个时刻,一个处理器只会执行一条指令,执行完后会依赖程序计数器恢复到正确的执行位置,每条线程都有一个独立的程序计数器,放置他们的内存是线程私有的内存,其互不影响,独立存储。
2024-08-28 13:08:46 762
原创 算法模块方法总结(数组)
二分查找(Binary Search)是一种在有序数组(必须是不能重复的,因为如果有重复的,会从几个符合的选项中输出一个,可能不合题意)中查找某一特定元素的搜索算法。搜索过程从数组的中间元素开始,如果中间元素正好是要查找的元素,则搜索过程结束;如果某一特定元素大于或者小于中间元素,则在数组大于或小于中间元素的那一半中查找,而且跟开始一样从中间元素开始比较。如果在某一步骤数组为空,则代表找不到。二分查找的思想是便于理解的,但是边界条件是很容易写错的。比如下面的。
2024-05-17 21:07:59 242
原创 回溯算法1
上面说过了,每一个回溯法都可以抽象为一个二叉树,这个一维数组就是path,用于记录路径。回溯算法可以解决 组合问题,切割问题,子集问题,排列问题,棋盘问题(n皇后)。在java语言中可以使用list来写。在解决这些问题的时候可以使用n循环,但是十分困难,使用回溯就比较容易。回溯法通常可以抽象为一个n叉树往下是递归,宽度是一个for循环。我们首先声明两个数组,一个是一维数组,一个是二维数组。组合问题:集合1234,找出大小为2的组合。回溯函数又称为递归函数,是纯暴力搜索。我使用一个例子来说明该问题。
2024-05-09 01:06:40 298 1
原创 Tire 字典树、前缀树
字典树(又称单词查找树或Trie树)是一种树形结构,它是哈希树的变种,通常用于统计、排序和保存大量的字符串(但不仅限于字符串)。字典树在搜索引擎系统中常用于文本词频统计。它的主要优点在于能够利用字符串的公共前缀来减少查询时间,从而最大限度地减少无谓的字符串比较,因此查询效率通常比哈希树高。字典树的基本操作包括查找、插入和删除,但删除操作相对较少见。在查找操作中,通常从根节点开始,依次搜索关键词的每个字母,直到找到对应的节点或确定关键词不存在于树中。
2024-05-02 23:17:19 417
原创 前K个高频元素
这块我们得考虑清楚,因为堆中只去维护k个大小的,所以当堆的大小达到k的时候,我们push进去一个新的元素,就要去pop栈顶元素,这块要是我们使用的大顶堆,每次都会pop出大的元素,到了最后剩下的就是小的元素,要是我们使用的小顶堆,剩下的就是频率较大的元素。我们首先想到的是map,map当中存储key和value,value代表着频率,最后在根据value进行排序,输出前k的元素,时间复杂度是nlogn。但是我们仅仅需要的是前k个高频元素,所以无需对全部元素进行排序,只需要去维护一个大小为k的有序集合即可。
2024-04-26 19:26:57 228
原创 桶排序(Bucket Sort)
当要被排序的数组内的数值是均匀分配的时候,桶排序使用线性时间(Θ(n))。桶排序的核心在于合理设计桶的数量和每个桶的范围,使得数据能均匀分布到各个桶中,进而降低后续排序的复杂度。桶排序的步骤主要包括初始化桶确定桶的数量及每个桶对应的数据范围,遍历待排序序列将每个元素放入对应的桶中,以及对每个非空桶内部使用其他排序算法进行排序。总的来说,桶排序是一个利用函数映射关系将数据分布到有限数量的桶中,再对每个桶内的数据进行排序,最后按顺序合并得到全局有序序列的排序算法。的键是数组元素的“桶”ID,值是数组元素的值。
2024-04-26 16:45:24 300
原创 递归解决树的相关问题
这道题,我首先想到删除该节点的标志在于左右节点为null,并且该节点的值为0,使用栈对树进行层序遍历后存储,接着删除即可,但是这里存在着一个问题,使用栈弹出的节点,进行删除,并不能影响到原树中的元素,删除节点时,你需要确保父节点正确地更新其子节点的引用。递归算法的基本思想是将一个大规模的问题拆分成若干个规模较小的子问题来解决,子问题的解决方式与原问题相同,只是规模更小。那么就得保存一个路径可以告知父节点,这个时候就可以使用递归的方法。对于删除节点,查找特殊节点的时候,我们就可以使用这种方法来解决。
2024-04-25 15:15:42 159
原创 使用队列对二叉树进行广度遍历
我们首先创建一个队列,开始遍历二叉树,这里记录一个值len,表示当前层有多少个元素,当然第一层也就是根(root),只有一个元素,那么就是len=1,在遍历的过程当中,我们将使用while循环,而len是否大于0作为判断条件,这样就可以知道这一层是否遍历完,进入遍历时,弹出root,len--,接着对root的左右节点进行判断是否为null,不为null的话就offer进队列当中。我们要对二叉树进行广度遍历,经典的数据结构就是队列,这也是许多算法题中要用到的基础,下面是一些基本思想。
2024-04-24 15:20:32 197
原创 LCR 039
对于每个元素,如果栈不为空且栈顶元素对应的柱子高度大于等于当前柱子高度,那么就将栈顶元素弹出,因为当前柱子会遮挡住它,使得它无法成为其他柱子的左侧第一个比它矮的柱子。这样,栈中的元素对应的柱子高度是单调递减的。right[i] 存储的是 heights[i] 右侧第一个比它矮的柱子的下标,如果不存在,则设为 n 是 heights 的长度。left[i] 存储的是 heights[i] 左侧第一个比它矮的柱子的下标,如果不存在,则设为 -1。,数组中的数字用来表示柱状图中各个柱子的高度。
2024-04-21 18:06:56 368
原创 单调栈习题
经过遍历之后,我们很容易就会得到答案,但是两个for循环所带来的时间复杂度是O(n^2),是很大的,我们可以使用单调栈来优化这个问题,将时间复杂度降低到O(n)。单调栈的基本思想是在遍历数组时维护一个单调递减的栈,栈中的每个元素对应一个温度,且栈顶元素对应的温度是栈中所有元素对应温度中的最大值。遍历温度列表当中的温度,若栈为空则进栈,若是不为空就可以将栈顶元素取出与当前元素进行对比,若是当前元素大于栈顶所代表的温度那么就将栈顶元素移除,这个时候将等待天数进行更新。如果气温在这之后都不会升高,请在该位置用。
2024-04-18 18:23:54 196
原创 逆波兰表达式求值
注意先取出来的是num2,接下来才是num1,因为栈是先进后出的。每个运算对象可以是整数,也可以是另一个逆波兰表达式。那么我们就可以根据这些特性来写出代码完成操作。,求该后缀表达式的计算结果。
2024-04-18 17:24:46 192
原创 使用滑动窗口解决数组子数组问题
给定一个含有n个正整数的数组和一个正整数target找出该数组中满足其和≥ target的长度最小的,并返回其长度如果不存在符合条件的子数组,返回0。解:因为一个数组要知道的是他的子数组,所以数据不能改动,是一个死数组,那么此时就可以使用滑动窗口的方法解决这个问题。
2024-03-19 15:54:42 388
原创 MySQL深入——25
Join语句的两种算法,分别为Index Nested-Loop Join和Block Nested-Loop JoinNLJ在大表Join当中还不错,但BNL在大表join时性能就差很多,很耗CPU资源。
2024-03-04 19:33:42 916 1
原创 MySQL深入——24
join语句用于两个或多个表当中检索数据。INNER JOIN或者JOIN 当两个表当中有匹配的值时,返回行LEFT JOIN或者LEFT OUTER JOIN 返回所有左边的行,即使右表当中没有相匹配的行RIGHT JOIN或者RIGHT OUTER JOIN 返回所有右边的行,即使左表当中没有相匹配的行FULL JOIN或FULL OUTER JOIN 左表或右表有匹配的行时,返回行。
2024-03-02 01:38:44 1070
原创 MySQL深入——22
在MySQL当中有两个kill命令一个是kill query +线程id表示中止这个线程当中正在执行的语句,另外一个是 kill Connection+线程id表示断开这个连接。在使用MySQL时,使用kill命令之后看show processlist显示的command列为killed,这是为什么呢??收到kill命令之后线程会做以下的操作前提:表正在执行Update操作,使表持有DML读锁。对表进行kill之后,表会直接中止掉线程后什么都不管退出吗?
2024-02-29 00:40:08 501
原创 MySQL深入——21
误删数据分为以下几种:1.使用delete语句误删2.使用drop table或者truncate table语句误删3.使用drop database误删4.使用rm命令误删整个MySQL实例(rm命令是Unix和Linux操作的命令,表示强制删除文件)
2024-02-28 02:17:35 932
原创 MySQL深入——20
若select 1成功则表明主库进程没问题。但是仔细想想,这ok吗?我们来看看下面这个例子,t是加锁的会被堵住。在InnoDB当中,有innodb_thread_concurrency参数,其目的是控制InnoDB的并发线程上限,当达到上限的时候,会进入sleep状态,直到有线程退出,它的默认值为0,表示不限制并发线程的数量,通常情况下设置为64-128之间。并发连接和并发查询并不是一个概念,在show processlist中看到几千个连接,指并发连接,正在执行的语句为并发查询。
2024-02-20 21:53:12 423
原创 数据结构-树
它是树型结构(非线性结构)结点之间具有分支,具有层次结构定义:Tree为n(n>=0)个结点的有限集n=0时为空树,n>0时满足以下两种情况:1.有且仅有一个特定的结点称之为root(根)。2.其余结点可以分为m个互不香蕉道有限集,称其为子树。度:结点的分支数,树的度为结点度的最大值。树的深度为结点的最大层次。
2024-02-14 03:02:32 745 1
原创 Java集合补充
注意,这里的3是指创建array的大小,当数组小的话,会自动扩容为刚好的大小,若是大了,剩下的空间会变为null。可以使用list.size()来刚好创建数组。
2024-02-13 00:49:37 353
原创 MySQL深入——19
一主多从结构就是基本的读写分离结构,主要目的在于分摊主库的压力。其中一种架构是将数据库的连接信息放在客户端,由客户端选择后端数据库进行查询。还有一个架构是MySQL与客户端之间有一个中间代理层proxy,客户端只连proxy由proxy决定分发路径。第一种架构来说,结构金丹,便于维护,只出现主备切换,库迁移时,只需要在客户端调整数据库连接信息proxy的架构,对客户端较为友好,因为连接是由proxy决定的,proxy的维护成本高,proxy需要高架构。
2024-02-05 02:11:19 1004
原创 MySQL深入——18
我们来看看一主多从的情况比如A是主库,A’ B C D都是副库,但A与A'互为备库,当A库出现问题,我现在要将主库转到A’该怎么办。以下是基于位点的主备切换其中的MASTER_LOG_FILE和MASTER_LOG_POS表示要从主库的MASTER_LOG_FILE文件的MASTER_LOG_POS这个位置的日志继续同步,这个位置就是指同步位点,即为主库对应的文件名和日志偏移量。这里就有一个问题,既然A'是新的主库,就要把节点B设置为A’的从库,就要执行change master命令。
2024-02-05 01:30:30 946
原创 MySQL深入——17(主备延迟)
之前说的延迟为分钟级的,备库稳定之后都能追上来,但若备库的执行日志速度持续低于主库的生成日志速度,延迟就有可能变为小时级的。这就设计到了备库的并行复制能力。InnoDB支持行锁,除了并发事务都更新同一行的情况下,对于业务的友好度还是很好的。日志在备库上执行,备库上sql_thread更新数据的逻辑,若是用单线程的话就会导致备库应用日志不够快,造成主备延迟。在5.6版本以前的MySQL,只支持单线程复制,由此在主库并发度高,TPS高的时候,就会出现严重的主备延迟问题。
2024-02-04 22:33:21 914
原创 MySQL深入——14
Mysql是如何保证数据不全的,Mysql的数据写入是两阶段提交完成的,即为redo log的prepare阶段和bin log阶段还有redo log的commit阶段,那么数据就和redo log 和bin log 有关。我们来看看bin log 和redo log的写入机制。
2024-01-19 00:45:04 877
原创 MySQL深入——12
这意味着,当一个事务对某行数据加上共享锁之后,其他事务也可以对该数据加共享锁,但不能加排他锁,并且只能进行读操作,不能进行写操作。当一个事务对数据加上排他锁之后,其他事务不能对该数据加任何的锁,包括共享锁和排他锁。我们接下来举一些例子来说明,在举例子之前,我要特别说明隔离级别为可重复读,因为在可重复读下间隙锁才是有效的。优化:1.在索引上的等值查询,给唯一索引加锁的时候,next-key lock 会退化为行锁。next-key lock(临键锁)是记录锁与间隙锁的结合,锁定一个范围。
2024-01-13 12:06:14 438
原创 MySQL深入——11
但是这种间隙锁的引入,也带来了一些问题,就比如说触发死锁,(问题大概是:查询数据,数据不存在时进行更新插入)当A事务对一个不存在的数据进行查询的时候会加入间隙锁,然后B查询一个不存在的数据,也会触发间隙锁,但是如果A和B这个时候要进行数据的插入,A会被B的间隙锁挡住进入等待,B也会被A的间隙锁挡住,进入等待,最终成为死锁。首先C事务将数据加入,然后对这个刚加入的数据进行修改工作,因为这行是没有加锁的,然后事务A提交,释放锁,开始执行,将所以的d=5的行改为100,然后进行B事务的操作。
2024-01-12 00:34:15 409
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人