- 博客(52)
- 收藏
- 关注
原创 Spring相关
包含功能:@Getter、@Setter、@ToString、@EqualsAndHashCode生成equals()方法、hashCode()方法、@RequiredArgsConstructor生成包含所有final字段或带有@NonNull注解字段的构造方法。当@Data 和@EqualsAndHashCode(callSuper = true)一起使用时,会使@Data生成的equals()方法、hashCode()方法包含父类的字段。
2025-04-14 01:54:15
159
原创 Spring AOP
AOP就是一种思想,Aspect Oriented Programming,面向切面编程,是对某一类事情的集中处理。核心思想就是将横切关注点与业务逻辑分离,如事务管理、日志记录、权限控制等,允许开发者通过切面将这些通用功能模块化,并将其应用到程序多个地方,从而避免代码重复。实现方式有Spring AOP、AspectJ、CGLIB等。
2025-04-14 01:50:05
806
原创 “拈彩”测试报告
当今数字化时代,抽奖活动作为一种极具吸引力的互动形式,受到众多组织和平台的青睐。“拈彩“是一款面向管理员的抽奖管理平台,集用户管理、奖品管理与活动管理、抽奖操作及中奖通知于一体的综合性管理系统,有效提升抽奖活动的策划执行效率与管理规范性,满足各类线上抽奖场景的需求。
2025-04-08 18:34:52
842
原创 性能测试工具篇
适用于只想要在固定的场景中使用参数化,改动后不希望影响到其他的脚本。变量需要在多个脚本中使用,方便统一管理和修改使用时直接在HTTP请求取样其中引入定义的变量:${参数名}发送JSON格式的数据。
2025-02-14 21:48:12
903
原创 七大排序总结
比如待排序序列N个元素本身已经有序或逆序时,选取的基准元素又是两边的最大值或是最小值,则划分出来的两个子序列一个为空,另一个包含N-1个元素,这样就会导致递归树高度变为N(单分支树);任取待排序元素序列中的某元素作为基准值,按照该排序码将待排序集合分割成两子序列,左子序列中所有元素均小于基准值,右子序列中的所有元素均大于基准值。比如用Hoare版进行划分的话,【7,5,4,7*,3,2】以7为基准,经过一次划分后:【2,5,4,7*,3,2】,两个7的相对位置这就发生了变化。
2024-12-03 09:48:13
1098
原创 栈Stack和队列Queue
给定一个只包含' ( '、' ) '、' { '、' } '、' [ '、' ] '的字符串s,判断括号是否匹配。Queue是个接口,在实例化时必须实例化LInkedList的对象,因为LinkedList实现了Queue接口。匹配示例:(){}[]、({}[])、([{}])、()[{}]队列:只允许在一端进行插入和删除数据操作,在另一端进行删除数据操作的特殊线性表。在实际工程中,使用Deque接口是比较多的,栈和队列均可以使用该接口。栈是一种特殊的线性表,其只允许在固定的一端进行插入和删除元素操作。
2024-11-18 23:13:23
1074
原创 LinkedList与链表
LinkedList的底层是无头双向非循环链表结构,由于链表没有将元素存储在连续的空间中,元素存储在单独的结点中,然后通过引用将结点连接起来 ,因此在任意位置插入或删除元素时不需要搬运元素,效率比较高,时间复杂度为O(1)那我们让a指针头节点开始走,b指针从相遇点开始走饶了好几圈之后再走y距离就能和a指针相遇,相遇点就为入环点。链表是一种物理存储结构上非连续存储结构,数据元素的逻辑顺序是通过链表中的引用链接次序实现的。slow=L+C-y。则L+nC+(C-y)=2L+2C-2y。(快慢指针、翻转链表)
2024-11-15 11:40:26
1271
原创 ArrayList与顺序表
而直接通过System.out.print(list)不属于对list的遍历,这实际上是将整个List对象转换成字符串并打印出来,而不是遍历List中的每个元素。①ArrayList底层使用连续的空间,任意位置删除或插入元素时,需要将该位置后续元素整体往前或往后搬移,时间复杂度O(N),不适合删除和插入操作。但是在物理结构上并不一定是连续的,线性表在物理上存储时,通常以数组和链式结构的形式存储。输出:[[1],[1,1],[1,2,1],[1,3,3,1],[1,4,6,4,1]]②预估需要扩容的大小。
2024-11-10 19:49:26
1109
原创 java常用类介绍
种子数是随机数生成器的初始值,决定了随机数生成序列的起点。只是随机算法的起源数字,和生成的随机数字的区间无关。(使用相同的种子数创建多个Random对象,这些对象生成的随机数序列将完全相同)(适用于需要每次运行时生成不同随机数序列的场景,如模拟实验、游戏开发)(适用于需要可重复生成相同随机数序列的场景,如科学计算、算法测试)(每次调用时由于时间在变化,因此生成的随机数序列也会不同)②无参:使用当前时间的毫秒值作为种子数。①有参:通过指定种子数进行创建。
2024-10-30 14:34:31
179
原创 策略模式和模板模式的区别
策:当一个系统中有许多类,它们之间的区别仅在于。策:算法自由切换,避免多重条件判断,扩展性好。模:封装不变部分,扩展可变部分,提取公共代码。,可以在多个子类中共用时。
2024-10-07 01:16:50
434
原创 点儿企业规范
1、类名使用大驼峰风格,但以下类型例外:DO/BO/DTO/VO/AO。3、包名统一使用小写,点分隔符之间有且仅有一个自然语义的英语单词。2、方法名、参数名、成员变量、局部变量统一使用小驼峰风格。
2024-09-01 12:15:06
265
原创 Spring Web MVC入门
SpringWeb MVC是基于Servlet API构建的原始Web框架Servlet是一种实现动态页面的技术,准确来讲Servlet是一套Java Web开发的规范,或者说是一套Java Web开发的技术标准MVC,即Model View Controller,它是软件工程中的一种软件架构模式,他把软件系统分为模型、视图和控制器三个部分。
2024-08-24 13:06:16
2372
原创 IDEA 2022.1.4用前需知
正确再次创建新项目的方式是先关闭当前项目再创建新项目,这样就能创建成功,不会卡死。再一次创建新项目时,可能会出现创建页面卡死的情况,这时候就要强制结束任务。2、设置国内源-添加Setting.xml文件内容。3、修改目录(考虑到当前硬盘空间大小,英文目录名)2)复制粘贴整个maven目录下的内容。3)修改idea配置(当前项目)4)修改ideal配置(新项目)1)创建你要移动过去的目录。1、查看本地仓库地址。接下来就可以写项目了。
2024-08-09 09:55:03
655
原创 JVM(面试用)
虚拟机是指软件模拟的具有完整功能的、运行在一个完全隔离的环境中的完整计算机系统常见的虚拟机:JVM、VMwave、Virtual BoxJVM是一台被定制过的现实当中不存在的计算机一个运行起来的Java进程就是一个JVM虚拟机,就需要从操作系统申请一大块内存就会把这个内存划分成不同的区域,每个区域都有不同的作用。
2024-08-06 23:56:56
821
原创 Ubuntu配置项目环境
为了保护你的服务器安全,云服务器厂商就对哪些端口能够访问做出限制,默认情况下就只有22(xshell登录时使用端口)和3389(Windows的服务器的远程桌面)能够访问。当把程序放到云服务器上执行,程序访问的就是云服务器上的数据库了,需要确保数据库里面有数据(有表有库)注意这里进行JDBC访问mysql的密码就要是云服务器上mysql的访问密码,而不是本地主机上的。1、登录到云服务器得后台,找到对应的机器,查看详情,选择防火墙标签页。5)登录mysql(默认安装之后不需要密码就可登录)
2024-08-01 20:07:59
1112
原创 应用层的重点协议
HTTP工作过程中涉及到的密钥有3组:第一组(非对称加密):用于校验证书是否被篡改。服务器持有私钥(私钥在注册证书时获得),客户端持有公钥(操作系统包含了可信任的CA认证机构有哪些,同时持有对应的公钥)。服务器使用这个私钥对证书签名进行加密。客户端通过这个公钥解密获取到证书的签名,从而校验证书内容是否被篡改过第二组(非对称加密):用于协商生成对称加密的密钥。服务器生成这组私钥-公钥对,然后通过证书把公钥传递给客户端。
2024-07-21 21:41:51
1093
原创 数据链路层重点协议
目的主机接收到广播的ARP请求发现其中的IP地址与本机相符,则发送一个ARP应答数据包给源主机,将自己的硬件地址填写在应答包中。双方在发送SYN时会在TCP头部写入自己能支持的MSS值,然后双方得知对方的MSS值之后,选择较小的作为最终MSS。最理想的情况下,MSS的值正好是在IP不会分片处理的最大长度(这个长度仍然是受制于数据链路层的MTU)MTU相当于发快递时对包裹尺寸的限制,这个限制是不同的数据链路对应的物理层产生的限制。以太网是当前应用最广泛的局域网技术,和以太网并列的还有令牌环网、无线LAN网。
2024-07-16 14:18:56
685
原创 超级初始网络
本机环回主要用于本机到本机的网络通信(系统内部为了性能,不会走网络的方式传输),对于开发网络通信的程序(即网络编程)而言,常见的开发方式都是本机到本机的网络通信。IP地址和端口号可以定位到网络中唯一的一个进程,计算机之间的传输媒介是光信号和电信号,通过”频率“和”强弱“来表示1和0这样的信息。一般的家用路由器,常见的有5个网口,要想让这几个电脑在同一个局域网上网,就要把他们连接到Lan口,Wan口是用来连上级的路由器的。网游打破了局域网的限制,成就了广域网对战-“传奇”(网游系列的开山之作)“PK”
2024-05-25 14:16:31
885
原创 Linux实用操作
环境变量是操作系统(Windows、Linux、Mac)在运行的时候,记录的一些关键性信息,用以辅助系统运行。o在一些IP地址限制中,表示所有IP的意思,如放行规则设置为0.0.0.0,表示允许任意IP访问。为管理运行的程序,每一个程序在运行的时候,便被操作系统注册为系统中的一个:进程。num1:刷新间隔(不填就查看一次结束),num2:查看次数(不填无限次数)IPv4版本的地址格式是:a.b.c.d,其中abcd表示0~255的数字。计算机程序之间的通讯,通过IP只能锁定计算机,但是无法锁定具体的程序。
2024-05-23 19:32:37
977
原创 Linux用户和权限
普通用户的权限,一般在其HOME目录内是不受限的;一旦出了HOME目录,大多数地方,普通用户仅有只读和执行权限,无修改权限。但是并不是所有的用户都有权利使用sudo,需要先为普通用户配置sudo认证才有权利使用sudo。-r:删除用户的HOME目录;不使用-r,删除用户时,HOME目录保留。Linux系统中,拥有最大权限的账户名为:root(超级管理员)指定-g需要组已经存在,如已存在同名组,必须使用-g 选项。不指定,HOME目录默认在:/home/用户名。文件夹:可更改工作目录到此文件夹(cd)
2024-05-20 18:41:36
752
原创 JSP - Java Servlet基础
当服务器创建Servlet对象后,该对象会调用init() 初始化自己,以后每当服务器再接收到一 个Servlet请求时,就会产生一个新线程,并在这个线程中让Servlet对象调用service(),检查 HTTP请求类型(GET、POST等),并在service() 中根据用户的请求方式,对应地再调用doGet() 或doPost()因 此,不同线程的service()方法中的局部变量互不干扰,一个线程改变了自己的service()方法中局部变量的值不会影响其他线程的service()方法中的局部变量。
2024-05-18 14:51:01
282
原创 Linux基础命令
cat b.txt | grep apple | wc -l 或 grep "apple" b.txt | wc -l。表示以易于阅读的形式,列出文件大小,如K、M、G(4096->4.0k)(必须要搭配 -l 使用)演示:su -root输入密码123456临时切换到root用户->强制删除->exit退出。/usr/local/hello.txt (开头/表示根目录,后面/表示层级关系。查找小于10KB的文件:find / -size -10k。ls [-a -l -h] [路径]
2024-05-16 21:43:13
936
原创 龟兔赛跑(基于GUI与多线程实现)
直击龟兔赛跑现场下面这张图是我们设计龟兔赛跑界面的初始效果与基本组成结构:接下来是我仅代表我个人提出的一些疑问与解答:其实在这里两个动物类就像标签一样标签组件是什么?用于短文本字符串或图片显示固定提示信息。下面给出这个初始界面的代码与效果图:2、多线程实现俩小动物比赛在上面的代码中,我们把兔子乌龟都定为标签类,但是俩东西参加比赛,是要同时参与比赛过程的,这里要利用多线程实现,也就是兔子、乌龟这俩标签要在比赛过程中(进程)移动,他俩的行为都属于这个进程(比赛)中的俩线程。我们知道线程的创建方式有很多
2024-05-11 20:27:47
843
原创 GUI-图形化的用户界面
所谓GUI,即图形化的用户界面/接口(Graphical User Interface),实现了采用图形方式显示的计算机操作用户界面。比如下面的QQ登录界面:为了不被落下,Java依旧稳定发挥,它也提供了一套可以轻松构建GUI的工具,将GUI界面封装为类,其中若干类放在了java.awt包和javax.swing包内:java.awt(抽象窗口工具包)依赖于本地操作系统的GUI,缺乏平台独立性,属重量级控件包中主要包括界面组件、布局管理器、事件处理模型及图形和图像工具...java.swing。
2024-05-09 19:33:04
1415
原创 JSP与JavaBean
如果这样的Bean存在,Tomcat服务器就分配这样的Bean给用户;通过Tomcat服务器创建Bean的过程可以看出,首次创建一个新的Bean需要用相应类的字节码文件创建对象,当某些JSP页面再需要同样的Bean时,Tomcat服务器直接将pageContent中已经有的Bean分配给JSP页面,提高了JSP使用Bean的效率。当JSP页面使用getProperty标记获取属性xxx的值时,必须保证bean有相应的getXxx方法,即对方法的名字的命名有特殊的要求。用于设置和访问Bean的属性。
2024-05-04 23:24:55
1420
原创 JSP内置对象
内置对象就是不加声明就可以在JSP页面脚本(Java程序片和Java表达式)中使用的成员变量,使用这些对象可以使用户更容易使用收集客户端发送的请求信息,并响应客户端的请求以及存储客户信息,从而简化了JSP程序开发的复杂性。JSP一共有9种基本内置对象:request、response、session、application、out、page、config、pageContext、exception。
2024-05-03 15:59:45
1006
原创 Tag文件与Tag标记
Tag文件为了给JSP页面返回一个对象,就必须将返回的对象的名字以及该对象的引用存储到Tomcat服务器提供的内置对象jspContext中。Tag文件与JSP文件很类似,可以被JSP页面动态加载调用,实现代码的复用,但用户不能通过该Tag文件所在Web服务目录直接访问Tag文件。Tag标记的名字和Tag文件的名字一致,也就是说,当我们编写了一个Tag文件并保存到特定的目录中,也就给出了一个Tag标记,该标记格式为。可以将Tag文件中的返回对象给调用该Tag文件的JSP页面。
2024-05-01 12:44:00
1088
原创 JSP基础知识
HTML标记、CSS样式、变量和方法的声明、表达式、Java脚本、JSP标 记(指令标记、动作标价),其他脚本元素(JavaScript等)HTML:Java://内容 或者 /*内容*/JSP:如果想把声明的变量和方法用到多个页面中,可以把它们写成一个独立的文件,使用时用指令包含进来由变量、常量、运算符等组成,表达式必须能够求值,表达式的值由服务器计算,并输送到客户端显示在脚本中也可以声明变量,但二者是不一样的。
2024-05-01 00:47:52
1755
1
原创 区区多线程...面试题
Servlet本身是工作在多线程环境下,若在Servlet中创建了某个成员变量,此时若有多个 请求到达服务器,服务器就会多线程进行操作,是可能出现线程不安全的情况的。在创建线程的同时需要指定线程完成的任务,可以直接重写Thread的run()方法,也可以使 用Runnable来描述这个任务。堆区就是多个线程之间共享的,只要把数据放到堆内存中,就可以让多个线程都能访问到。synchronized加在非静态方法上相当于针对当前对象加锁。
2024-04-28 21:41:50
428
2
原创 多线程(六)
可以看出,上述代码需要一个辅助类Result,还需要一系列的加锁和wait、notify操作,代码复杂,容易出错;比如我们知道的StringBuffer中的方法都是加了锁的,这里只是在单线程下使用,但append()方法每次调用都要加锁解锁,这没必要,浪费了大量的资源开销,这下就要给锁消除了...使用细粒度锁,是期望释放锁时其它线程可以使用,这样能够并发执行的逻辑更多,更有利于充分利用多核cpu资源,但是也有可能。Semaphore的PV操作的加减计数器都是原子的,可以在多线程环境下直接使用。
2024-04-28 20:40:14
1592
1
原创 多线程—CAS(五)
可以引入版本号version,约定每次修改余额version++,此时在使用CAS判定时,就不是直接 判定数值了,而是判定版本号,看版本号是否变化:若版本号不变,则表示没有其他线程穿插执行。全称Compare-And-Swap,即“比较并交换”,相当于一个原子的操作,同时完成“读取内存,比较是否相等,修改内存”这三个步骤,本质上需要cpu指令的支持。当多个线程同时对某个资源进行CAS操作,只能有一个线程操作成功,但是并不会阻塞其他线程,其他线程只会收到操作失败的信号。CAS则是通过重试的方式避免穿插执行。
2024-04-26 18:14:08
738
1
原创 多线程—锁策略(四)
按照之前对锁的设定,第二次加锁的时候,就会阻塞等待,直到第一次的锁被释放,才能获取到第二个锁,但是释放第一个锁也是由该线程完成的,结果这个锁没有解锁反而又加锁,这也就无法进行解锁操作,这时候就会死锁。若调用increase2( ),则increase()先加了一层锁,在increase2里又调用increase(),这就又加了一层锁,但是上个锁还没释放。一旦该线程锁之后,接下来哪个线程能拿到锁?若线程t1加锁时,发现锁已被占用,而这个占用者正是自己,这时是仍可以获取到锁的,并且让计数器自增;
2024-04-24 20:57:52
867
原创 多线程基础—案例(三)
这个时候就可以把这些请求 都放到一个阻塞队列中,然后再由消费者线程慢慢的来处理每个支付请求。这种饿汉模式即便是在多线程的情况下也是线程安全的,因为它在类加载的时候就已经创建了实例,后续只能通过getinstance获取对象,而即便多个线程同时调用getinstance也只是都在进行读取操作,这显然是非常安全的。上面我们已经说了,线程安全问题只会出现在首次创建对象的时候,实例一旦创建好了,后面在多线程环境调用getinstance就不再修改instance了,而只是读取返回,这是线程安全的。
2024-04-24 12:57:37
1618
原创 多线程—线程安全(二)
比如说ATM,一个人取款发现里面没钱了,那他得等人来把钱放进去才能有钱,这时候为了避免让他近水楼台先得月一直在那里跟后面的人排队竞争,让他wait(不让他参与排队直接让他在旁边等人放钱进去),让后面的人进行存款业务,等ATM里面有钱了再叫他去取款,这样存款的人跟取款的人都不会饿死。按照之前对锁的设定,第二次加锁的时候,就会阻塞等待,直到第一次的锁被释放,才能获取到第二个锁,但是释放第一个锁也是由该线程完成的,结果这个锁没有解锁反而又加锁,这也就无法进行解锁操作,这时候就会死锁。但可惜的是,寄存器贵。
2024-04-20 16:42:10
730
原创 多线程基础(一)
执行 isInterrupt() 方法将标志位改为true,线程被唤醒,sleep()抛出InterruptedException异常,但sleep()方法又同时自动清除刚才的标志位,又改回false,循环又继续执行,线程就又无法结束。而start()方法会启动一个新的线程,并在新的线程中异步执行run()方法中的指令,而当前线程会继续执行后续的代码,这就实现了并发执行的效果;所以实际在Java的线程中,直接调用run()方法 和 调用start()方法的主要区别在于线程的执行方式。
2024-04-06 16:37:50
644
1
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人