- 博客(31)
- 收藏
- 关注
原创 JavaWeb_Web基础
Spring-boot-starter-web:包含了web应用开发所需要的常见依赖。Spring-boot-starter-test:包含了单元测试所需要的常见依赖。当运行项目的启动类中的main方法时,它将引入的内部集成的tomcat服务器启动起来,在src中main下的java目录和resources目录下的文件。②为Controller和Service注入运行时所依赖的对象:在。①在Dao和Service层的实现类,交给IOC容器管理:在。如果存在多个相同类型的bean,将会报错。
2025-12-20 08:14:31
887
原创 JavaWeb_Maven
重新加载依赖,依赖下载之后,maven面板如果还报红,此时可以关闭IDEA,②项目构建:标准化的跨平台(Linux、Windows、MacOS)的。(test文件夹范围内)单元测试方法运行不报错,不代表业务方法没问题。的特性:如果A依赖了B,B依赖了C,C依赖了D,那么在项目中。(所有的开发工具用maven构建出来的项目结构都是统一的)运行项目的过程当中,目录结构多了一个target目录,这个。上述方法形参中的最后一个参数msg,表示错误提示信息,当运行maven中test生命周期的阶段时,当前项目中。
2025-12-20 08:12:16
688
原创 JAVA -- 12
一般情况下,程序只要没出异常,测试就会通过。之前通过在main方法编写测试代码,去调用其他方法进行测试。目前上面的代理类不够通用,只能为UsrService这个实现类对象做代理。注解可以用在类上、构造器上、方法上、成员变量上、参数上等位置处。③开始测试:选中测试方法,右键选择“Junit运行”,如果。,一个方法测试失败,可能影响其他方法a的测试。④把成员变量名、和其值,写出到文件中去即可。②无法得到测试的报告,需要程序员。,此时拿泛型集合的对象,这个时候。(成员变量、方法、构造器等)。
2025-12-20 08:07:31
1026
原创 JAVA -- 11
这个界面上参照上面的图片进行设计,中间黑的是聊天区域,下部是输入框区域,右侧上面是展示在线用户的区域,下部是一个发送按钮.AI Prompt:我是Java开发人员,请你使用Swing代码设计一个美观的局域网聊天的进入界面,这个界面上只有昵称,输入框,进入和取消按钮。5.7.接收客户端的群聊消息:线程每接收到一个客户端的群聊消息,就应该把这个消息转发给全部在线的客户端对应的socket管道。//将来收到管道发来的消息时,要知道这是哪个用户的管道,以便群发消息时指明是谁发的消息,因此应该用一个Map集合。
2025-12-20 08:04:01
983
原创 JAVA -- 10
②交给Thread线程对象。方式二的优点:任务类只是实现接口,可以继续继承其他类,实现其他接口,扩展性强。定义一个类实现Callable接口,重写call方法,封装要做的事情,和要返回的数据。用户每发起一个请求,后台就需要创建一个新线程来处理,下次新任务来了肯定又要创建新线程处理的,④线程执行完毕后、通过FutureTask对象的get方法去获取线程任务执行的结果。方式三的优点:线程任务类只是实现接口,可以继续继承类和实现接口,扩展性强;①设计一个账户类,用于创建小明和小红的共同账户对象,存入10万元。
2025-12-20 08:00:10
1053
原创 JAVA -- 09
②准备一个字节数组和一个整型变量记录每次读入的长度,通过循环先将源文件的数据装入桶中(字节数组),再通过文件字节输出流管道接收桶中的数据并将其写入到目标文件中。(读多少,就写入多少!UTF-8是Unicode字符集的一种编码方案,采取可变长编码方案,共分四个长度区:1个字节,2个字节,3个字节,4个字节。如果要实现追加,则需要将一个可以追加的低级字节输出流作为参数构造一个打印流则可以实现追加。但是如果文件过大,创建的字节数组也会过大,可能引起。,即便断电,或者程序终止,文件中的数据也不会丢失。
2025-12-19 20:00:52
599
原创 JAVA -- 08
使用Map集合,玩家的名称作为键,装牌的容器作为值。⑤对牌进行排序,是对list集合中的牌对象进行排序。将此功能独立成方法,使用Collections工具类中的sort方法对集合进行排序,接收一个比较器参数,重写比较规则。entrySet( )方法底层会去遍历map集合里的各个元素,每遍历到一个数据都会把键和值封装为Entry对象存到set集合里。,在用二重循环制牌时,在外层对点数的循环处,声明一个整型变量记录牌的大小,并将此属性注入到每张牌中)TreeSet集合:不重复,无索引,可排序(默认升序)。
2025-12-19 19:48:25
615
原创 JAVA -- 07
元素加满后二次增长,增长的长度是老容量的1.5倍。valueOf方法已经提前在缓存数组中封装好了-128到127的所有对象,这些对象是共享的,拿的都是同一个对象。迭代器是用来遍历集合的专用方式(数组没有迭代器),在Java中迭代器的代表是Iterator。自定义异常:java无法为这个世界上全部的问题都提供异常类来代表,如果企业自己的某种问题想通过异常来表示,Collection是单列集合的祖宗,它规定的方法(功能)是全部单列集合都会继承的。(如:<E>)称为泛型类、泛型接口、泛型方法,它们统称为泛型。
2025-12-19 19:44:30
585
原创 JAVA -- 06
AI Prompt:我是一名Java开发人员,帮我用Swing开发一个员工信息管理界面,要求包含输入框,搜索按钮,表格,表格展示20个员工信息,并包含添加、修改、删除功能。*人事信息的管理界面:展示全部员工信息,根据名称查询某个员工信息展示,添加员工信息,删除员工信息,修改员工信息。系统中需要存在用户信息,先开发注册,注册一些用户信息。中去,则后者就可以调用信息界面对象中的方法,在方法里加载到信息界面的集合,渲染到表格中。-员工信息:ID、姓名、性别、年龄、电话、职位、入职时间、薪水、部门信息。
2025-12-19 19:35:49
468
原创 JAVA -- 05
方法重写在开发中的常见应用场景:子类重写Object类的toString()方法,以便返回对象的内容。--定义第二套实现类,实现接口,实现打印学生信息(男女人数),实现打印平均分(去掉最高分和最低分)。方法重写:如果子类觉得继承自父类的某个方法不好用,或者无法满足自己的需求时,子类可以重写一个。一个类实现了多个接口,如果多个接口中存在同名的默认方法,可以不冲突,这个类重写该方法即可。Java中提供关键字extends,用这个关键字,可以让一个类和另一个类建立父子关系。③定义一个银卡类,继承卡片父类。
2025-12-19 19:31:16
450
原创 JAVA —— 04
方法的执行放在栈内,局部变量依然存放在栈内存中,new出的对象放到堆里面,对象里还存放了类的地址。可以通过类地址找到对应的类文件,再通过方法名定位到类文件中对应的方法,找到方法后将对应方法放到栈中去执行。例如,要知道某个类创建了多少个对象,则需要定义一个静态变量来记录创建对象的个数,在构造器内对该静态变量进行自增即可。在方法区加载类时会扫描类中有无static修饰的变量,若有则将此静态变量同时加载一份放入堆内存中。实例方法需要创建对象来调用,此时对象只是为了调用方法,对象占内存,这样会。
2025-12-13 00:31:56
861
原创 JAVA —— 03
先定义一个方法来判断是否为素数:用一个for循环,循环边界是参数的开平方,在循环体中判断从2到边界是否存在一个数满足参数与之取余等于0即参数可以整除其中的一个数,若存在则该数不为素数,如果循环结束仍未返回,则返回真表示该数是素数。做牌:动态初始化一个长度为54的数组准备存牌,准备4种花色以及12种点数存放到静态数组中,遍历点数再遍历花色进行牌的拼装,拼装后将牌放入起始动态初始化的数组中(需要定义一个变量来记录牌存储的索引位置),最后单独存放大小王。Java内部类指在一个类的内部定义的类。
2025-12-11 18:10:31
924
原创 JAVA —— 02
而java8之后出现默认方法,此时强制规定,若多个接口内有相同的默认方法,子类必须重写这个方法,不然编译期就会报错。引用数据类型传递的是引用的副本即对象引用的内存地址。而接口的实现相当于能力的实现,能力可以后天培养,可以结合多个角度整合(重写)出自己的能力。这里的num是Main类的实例变量,但它是private的。基本数据类型存储在栈内存中,引用数据类型的变量存储的是对象在堆中的内存地址。B、C都继承了A,而D又继承了B、C,当D要调用A中的方法时,因为B、C有不同的实现,此时不知调用哪个会出现歧义。
2025-12-11 03:30:31
580
原创 JAVA —— 01
比如一个想要设置一个电竞房间的游戏模式的场景,可以把灯光、香氛、电脑、音箱等类都抽象为游戏模式这个抽象的用于满足用户体验的类。在使用时,对象都是游戏模式这个抽象类,但是new不同的实现类,表现的形式不同。一个Java程序先通过javac对程序进行编译,再通过java把编译后的结果交给JVM,程序在JVM执行的过程中可以去调用核心类库里面的功能。IDEA中的java程序是自动编译和执行的,编译后的class文件放在工程路径下的一个out文件夹里。通过父类引用调用方法时,实际执行的是子类重写后的方法。
2025-12-10 01:53:45
797
原创 1227.分巧克力--二分法
听完讲解后明白不要先去考虑整体所有的巧克力怎么划分,先考虑普普通通的其中一块巧克力怎么分析,里面任意一块巧克力的长假设为x,宽假设为y。第一眼看题的思路很乱,考虑的是切出的最大边长需要受到所有巧克力中最小规格巧克力大小的束缚,后来又感觉如果这堆巧克力中大部分巧克力都远大于最小规格的巧克力,就可以不使用最小规格的巧克力。小于等于a的值都可以满足这个块数大于等于k的条件,而我们要取的是满足这个条件时这些a的取值中的最大值,假设为amax。即判断条件:当a取某一值时满足可以切出的巧克力的块数大于等于k。
2024-05-27 20:11:11
434
1
原创 平衡二叉树,二叉树的路径,左叶子之和
这道题目要求从根节点到叶子的路径,所以需要前序遍历,这样才方便让父节点指向孩子节点,找到对应的路径。判断当前节点是不是左叶子是无法判断的,必须要通过节点的父节点来判断其左孩子是不是左叶子。判断一个树的左叶子节点之和,那么一定要传入树的根节点,递归函数的返回值为数值之和,所以为。因为是前序遍历,需要先处理中间节点,中间节点就是我们要记录路径上的节点,先放进。当遇到左叶子节点的时候,记录数值,然后通过递归求取左子树左叶子之和,和。的左孩子不为空,且左孩子的左右孩子都为空(说明是叶子节点),那么。
2024-03-03 10:37:16
906
原创 二叉树最小深度,最大深度,完全二叉树结点数
确定单层递归的逻辑:先求它的左子树的深度,再求右子树的深度,最后取左右深度最大的数值 再+1 (加1是因为算上当前中间节点)就是目前节点为根节点的树的深度。确定单层递归的逻辑:先求它的左子树的深度,再求右子树的深度,最后取左右深度最大的数值 再+1 (加1是因为算上当前中间节点)就是目前节点为根节点的树的深度。确定单层递归的逻辑:先求它的左子树的节点数量,再求右子树的节点数量,最后取总和再加一 (加1是因为算上当前中间节点)就是目前节点为根节点的节点数量。
2024-03-01 16:42:22
1298
原创 d13_二叉树的翻转和对称
因为我们要比较的是根节点的两个子树是否是相互翻转的,进而判断这个树是不是对称树,所以要比较的是两个树,参数自然也是左子树节点和右子树节点。对于二叉树是否对称,要比较的是根节点的左子树与右子树是不是相互翻转的,理解这一点就知道了。首先想清楚,判断对称二叉树要比较的是哪两个节点,要比较的可不是左右节点!比较二叉树外侧是否对称:传入的是左节点的左孩子,右节点的右孩子。左节点为空,右节点不为空,不对称,return false。层序遍历一个二叉树。比较内侧是否对称,传入左节点的右孩子,右节点的左孩子。
2024-02-28 12:16:27
1432
原创 day_12二叉树理论基础以及遍历
运行的时候,经常会遇到栈溢出的错误,就是没写终止条件或者终止条件写的不对,操作系统也是用一个栈的结构来保存每一层递归的信息,如果递归没有终止,操作系统的内存栈必然就会溢出。分析一下为什么刚刚写的前序遍历的代码,不能和中序遍历通用呢,因为前序遍历的顺序是中左右,先访问的元素是中间节点,要处理的元素也是中间节点,所以刚刚才能写出相对简洁的代码,那么再看看中序遍历,中序遍历是左中右,先访问的是二叉树顶部的节点,然后一层一层向下访问,直到到达树左面的最底部,再开始处理节点(也就是在把节点的数值放进。
2024-02-26 20:46:11
1742
2
原创 d11栈与队列
push(value):如果push的元素value大于入口元素的数值,那么就将队列入口的元素弹出,直到push元素的数值小于等于队列入口元素的数值为止。此时我们需要一个队列,这个队列呢,放进去窗口里的元素,然后随着窗口的移动,队列也一进一出,每次移动之后,队列告诉我们里面的最大值是什么。其实队列没有必要维护窗口里的所有元素,只需要维护有可能成为窗口里最大值的元素就可以了,同时保证队列里的元素数值是由大到小的。你只可以看到在滑动窗口内的。但如果把窗口里的元素都放进队列里,窗口移动的时候,队列需要弹出元素。
2024-02-09 12:39:25
914
1
原创 d10栈的应用
在进一步看,本题中每一个子表达式要得出一个结果,然后拿这个结果再进行运算,那么这岂不就是一个相邻字符串消除的过程,和1047.删除字符串中的所有相邻重复项中的对对碰游戏是不是就非常像了。栈的目的,就是存放遍历过的元素,当遍历当前的这个元素的时候,去栈里看一下我们是不是遍历过相同数值的相邻元素。第三种情况:遍历字符串匹配的过程中,栈已经为空了,没有匹配的字符了,说明右括号没有找到对应的左括号。因为从栈里弹出的元素是倒序的,所以再对字符串进行反转一下,就得到了最终的结果。返回一个表示表达式值的整数。
2024-02-03 20:12:30
1362
1
原创 d9栈队列的模拟练习
boolean offerFirst(E element): 将指定元素添加到双端队列的头部,如果成功则返回true,如果队列已满则返回false。boolean offerLast(E element): 将指定元素添加到双端队列的尾部,如果成功则返回true,如果队列已满则返回false。队列是先进先出的规则,把一个队列中的数据导入另一个队列中,数据的顺序并没有变,并没有变成先进后出的顺序。E peekFirst(): 获取双端队列的头部元素,但不移除它,如果队列为空则返回null。
2024-02-03 16:36:38
884
1
原创 d8KMP算法练习
数组长度减去最长相同前后缀的长度相当于是第一个周期的长度,也就是一个周期的长度,如果这个周期可以被整除,就说明整个数组就是这个周期的循环。找到了最长相等的前缀和后缀,匹配失败的位置是后缀子串的后面,那么我们找到与其相同的前缀的后面重新匹配就可以了。最长相等前后缀的规则,当一个字符串由重复子串组成的,最长相等前后缀不包含的子串就是最小重复子串。,这样组成的字符串中,后面的子串做前串,前面的子串做后串,就一定还能组成一个。为模式串长度,因为在匹配的过程中,根据前缀表不断调整匹配的位置,可以看出。
2024-02-03 14:39:04
950
1
原创 d7字符串练习
对于字符串,我们定义两个指针(也可以说是索引下标),一个从字符串前面,一个从字符串后面,两个指针同时向中间移动,并交换元素。返回的结果字符串中,单词间应当仅用单个空格分隔,且不包含任何额外的空格。,它包含小写字母和数字字符,请编写一个函数,将字符串中的字母字符保持不变,而将每个数字字符替换为。思路:很多数组填充类的问题,其做法都是先预先给数组扩容带填充后的大小,然后在从后向前进行操作。扫描结束后,光标在读取的最后一个数字后面,光标在本行中。扫描结束后,光标在读取的最后一个字符后面,光标在本行中。
2024-02-01 00:12:36
837
1
原创 d6哈希表练习
在遍历大C和大D数组,找到如果 0-(c+d) 在map中出现过的话,就用count把map中key对应的value也就是出现次数统计出来。数组里出现过,其实这个思路是正确的,但是我们有一个非常棘手的问题,就是题目中说的不可以包含重复的三元组。首先定义 一个map,key放a和b两数之和,value 放a和b两数之和出现的次数。遍历大A和大B数组,统计两个数组元素之和,和出现的次数,放到map中。就不能使用双指针法,因为两数之和要求返回的是索引下标,不能有重复的三元组,但三元组内的元素是可以重复的!
2024-01-30 20:44:04
1025
1
原创 d5哈希表练习
set是一个集合,里面放的元素只能是一个key,而两数之和这道题目,不仅要判断y是否存在而且还要记录y的下标位置,因为要返回x 和 y的下标。目的用来存放我们访问过的元素,因为遍历数组的时候,需要记录我们之前遍历过哪些元素和对应的下标,这样才能找到与当前元素相匹配的(也就是相加等于。本题,就需要一个集合来存放我们遍历过的元素,然后在遍历数组的时候去询问这个集合,某元素是否遍历过,也就是是否出现在这个集合。直白来讲其实数组就是一张哈希表。给出一个元素,判断这个元素是否出现过,如果出现过,返回这个元素的下标。
2024-01-30 17:48:51
805
1
原创 d4链表练习
题目:给你一个链表,两两交换其中相邻的节点,并返回交换后链表的头节点。你必须在不修改节点内部的值的情况下完成本题(即,只能进行节点交换)。,请你找出并返回两个单链表相交的起始节点。走一个节点,有环的话,一定会在环内相遇呢,而不是永远的错开呢。我们求出两个链表的长度,并求出两个链表长度的差值,然后。也出发一个指针,这两个指针每次只走一个节点,题目:给你一个链表,删除链表的倒数第。,返回链表开始入环的第一个节点。来表示链表尾连接到链表中的位置(,仅仅是为了标识链表的实际情况。因为要找环形的入口,那么要求的是。
2024-01-29 13:03:44
826
原创 d3链表移除元素,设计,反转
void addAtIndex(int index, int val) 将一个值为 val 的节点插入到链表中下标为 index 的节点之前。如果 index 等于链表的长度,那么该节点会被追加到链表的末尾。链表是一种通过指针串联在一起的线性结构,每一个节点由两部分组成,一个是数据域一个是指针域(存放指向下一个节点的指针),最后一个节点的指针域指向。移除头结点和移除其他节点的操作是不一样的,因为链表的其他节点都是通过前一个节点来移除当前节点,而头结点没有前一个节点。以指示链表中的上一个节点。
2024-01-28 13:05:32
913
原创 d2有序数组的平方、长度最小的子数组、螺旋矩阵
滑动窗口根据个人理解就是,先通过遍历起始位置一直到形成第一个大于数组内元素的值的和大于目标值的子数组,接着将这个子数组称为起始窗口。指针进行更新,当其中一个指针到达边界时循环结束,接着分别用两个循环,将其中未遍历到边界的指针进行遍历到边界并将值赋给新数组即可,最后。值为止然后移动结束位置的指针,添加新的元素进入到原来子数组中,接着继续移动起始位置的指针,并修改。并不能决定每一圈的起始位置和边界条件,它们只是循环遍历时的一个进行遍历的工具,的值进行比较,将小的赋值给新数组的方向指针所指向的空间,并对。
2024-01-26 00:16:04
474
1
原创 d1递归练习
第三层有n*(n-1)个分支,每个分支含有一个o(n)的for循环;时间复杂度为o(n*n*(n-1));个分支,每个叶节点需要输出一个方案(也是o(n)的复杂度),因此时间复杂度也是n!(通常按从小到大的顺序枚举得出的结果就是按字典序最小的顺序)个分支,每个分支含有一个o(n)的for循环;第二层有n个分支,每个分支含有一个o(n)的for循环;时间复杂度为o(n*n);第一层只有一个结点,有一个o(n)的for循环;时间复杂度为o(n);简单的斐波那契:(递归实现)总时间复杂度化简为O(n*n!
2024-01-24 20:45:48
792
1
原创 二分查找、移除元素
if (nums[middle] > target) right 更新为 middle,因为当前nums[middle]不等于target,去左区间继续寻找,而寻找区间是左闭右开区间,所以right更新为middle,即:下一个查询区间不会去比较nums[middle]while (left <= right) 要使用 <= ,因为left == right是有意义的,所以使用 <=因为数组在内存空间的地址是连续的,所以我们在删除或者增添元素的时候,就难免要移动其他元素的地址。元素的顺序可以改变。
2024-01-24 15:00:52
884
1
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅