- 博客(75)
- 收藏
- 关注
原创 final 关键字
引用类型的变量存储的是指向空间的地址,其中指向的元素内容可以被修改,指向也可以被修改;但是当 final 修饰引用类型变量时,只可以修改指向的元素内容,不可以改变其指向。被 final 修饰的方法和未被 final 修饰的方法在成员访问上来说没有任何区别,内部都可以对未被 final 修饰的成员进行修改。静态成员变量,即类变量,可以在实例方法和静态方法中被访问。当 final 修饰内置类型的变量时,该变量的值就不能更改,也就变成了常量。实例方法,也称为非静态成员方法,可以访问实例成员变量和静态成员变量。
2025-04-01 20:19:49
221
原创 代码块及执行顺序
构造代码块:又称为实例代码块,是定义在类中的代码块,一般用来初始化实例成员变量。静态代码块:使用 static 定义的代码块,一般用于初始化静态成员变量。普通代码块:定义在方法中的代码块。
2025-04-01 11:05:02
252
原创 类和对象—继承
上述是 Dog 和 Cat 类的成员信息,不难看出,Dog 和 Cat 类都有共同的成员变量和成员方法,且每次定义宠物,相同的字段和方法又会重复出现,这样会导致做很多重复的事情,代码的可读性也不高,此时我们可以将这些类的共性抽取出来,从而实现代码复用,即需要用到继承。构造方法用来初始化成员变量,那么子类继承了父类的成员,也需要调用父类的构造方法来初始化从父类继承下来的成员变量,即:在构造子类对象时,需要先调用父类的构造方法,然后执行子类的构造方法。super 关键字的作用主要是在子类方法中访问父类的成员。
2025-03-27 20:31:45
752
原创 static 成员
因为在类中定义的实例变量,每个对象都会包含一份,用于描述具体的对象,但是 classRoom 这个属性每个学生保存一份是不合理的, classRoom 也不能描述具体的学生,而是需要所有学生都共享。一般来说,类中的数据成员设置为 private,而类中的方法设置为 public,那么当静态成员变量设置为 private 时,其他类如何访问该静态成员变量呢,答案是使用静态成员方法。被 static 修饰的方法称为静态成员方法,是类的方法,不是某个对象特有的,静态成员变量一般是通过静态方法访问的。
2025-03-26 19:26:24
862
原创 类和对象—封装
如果需要使用 java.util 中的其他类,可以使用 java.util.* ,意思是导入该包下的所有类。但是这样使用容易出现问题,例如 java.sql 和 java.util 中都有类 Date,此时使用 Date 就会出现歧义,编译出错,在这种情况下就需要使用完整的类名。封装就是套壳屏蔽细节,比如计算机厂商在出厂时,在外部套上壳子,将内部实现细节隐藏起来,仅仅对外提供开关机、键盘以及 USB 插孔等,用户无需知道主机内部的核心部件、电路走线等,仅仅只需要通过开关机、键盘等与计算机交互即可。
2025-03-25 16:31:16
364
原创 类和对象—基础知识
面向对象关注的是对象,而对象是现实生活中的实体,比如上述例子的洗衣机,但是计算机并不认识洗衣机,需要程序员告诉给计算机什么是洗衣机。上述就是对洗衣机的简单描述,该过程称为对洗衣机对象(实体)进行抽象,即对复杂事物的重新认知,但是抽象的结果计算机仍然不能识别,需要程序员采用面向对象的编程语言进行描述,此时就需要用到类。类是对对象/实体进行描述的,可以描述对象的属性、行为等信息,描述完成之后计算机即可识别。field;// 字段(属性)或成员变量method;// 行为或成员方法。
2025-03-25 14:54:26
975
原创 数组的定义与使用
数组在内存中是一段连续的空间,空间的编号从0开始,依次递增,该编号称为数组的下标,数组可以通过下标访问其任意位置的元素。创建数组时也可以按照C语言的方式创建:T 数组名[] = new T[N],但是不推荐。数据类型[][] 数组名称 = new 数据类型 [行数][列数] { 初始化数据 };数组是相同类型元素的集合,在内存中是一段连续的空间,每个空间有自己的编号,即下标。定义数组的语法格式:T[] 数组名 = new T[N];遍历数组指的是将数组中的所有元素都访问一遍。
2025-03-19 16:20:59
564
原创 Java程序的逻辑控制
执行流程:①②③④—>②③④—>②③④—>②③④—>②③④—>②③④—>…—>②为false,循环结束。顺序结构比较简单,按照代码书写的顺序一行一行执行。如果调整代码的书写顺序, 则执行顺序也发生变化。表达式1成立,执行语句1,否则表达式2成立,执行语句2,否则执行语句3。先执行循环语句, 再判定循环条件,循环条件成立则继续执行,否则循环结束。continue 的功能是跳过这次循环,立即进入下次循环。注意 do while 循环最后的分号不要忘记。break 的功能是让循环提前结束。
2025-03-14 20:51:43
436
原创 Java 运算符
语法规则:表达式1 || 表达式2,左右表达式必须是boolean类型的结果。当两个表达式中只要有一个是真,结果就为真,如果两个表达式都是假,则结果是假。语法规则:表达式1 && 表达式2,左右表达式必须是boolean类型的结果。当两个表达式都为真,结果才是真,只要有一个是假,结果就是假。关系运算符包括:>、<、>=、<=、==、!移位运算符有三个: <<、>>、>>> ,都是二元运算符,且都是按照二进制比特位来运算的。位运算符主要有四个: &、|、~、^ ,除 ~ 是一元运算符外,其余都是二元运算符。
2025-03-14 20:31:45
729
原创 数据类型与变量
Java 是强类型编程语言,当不同类型的变量相互赋值时会进行严格的校验;注意:由于计算机内存是以4个字节为单位来读写数据,因此为了硬件上实现方便,对于 short、byte类型,会先提升成 int 类型再进行转换。在程序中,经常改变的量称为变量,而数据类型就是来定义变量的。引用数据类型不是语言自带的,可以理解为用户自定义的类型,比如:字符串类型。不同数据类型的数据进行运算时,数据类型小的会被提升为数据类型大的。Java 中数据类型分为两类:基本数据类型和引用数据类型。程序运行期间,固定不变的量是常量。
2025-03-13 18:19:32
1338
原创 详细解释 Write once,Run anywhere
Java 程序边解释边执行,会导致运行效率降低,因此 JVM 优化出了 JIT(Just In Time),即时编译器,当 JVM 发现有一些代码在频繁执行时,会直接将该代码翻译成机器可以识别的机器指令,从而提高程序运行的效率。虽然字节码文件有自己固定的文件格式,有自己的指令集,但具体操作系统的 JVM(Java 虚拟机)会将字节码文件中的指令翻译成具体硬件平台对应的指令,这里 JVM 担任的是翻译解释的作用。其他语言编写的程序,经过编译之后,如果严格按照规定生成字节码文件,也可以在 JVM 上运行。
2025-03-12 16:07:27
261
原创 Spring 中事务的实现
常用的是声明式自动提交事务,只需要在方法上添加 @Transactional 注解即可实现,无需手动开启事务和提交事务,进入方法时自动开启事务,方法执行完会自动提交事务,如果中途发生了没有处理的异常会自动回滚事务。比如:A 转账给 B 100元,分为两个操作,第一步:A 的账户 - 100元,第二步:B 的账户 + 100元。如果没有事务,第一步执行成功,而第二步执行失败,那么 A 账户的100元就平白无故消失了,因此需要使用事务来解决这个问题,要不全部成功,要不全部失败。
2025-03-10 22:17:28
545
原创 Spring AOP 统一问题处理
Aspect + @Component:定义一个切面,由于 @Aspect 是 aspectj 下的注解,因此需要另外使用 @Component 注解来将该类注册到容器中。@PointCut:定义一个切点,切点表达式由切点函数组成,其中 execution() 是最常用的切点函数,用来匹配方法,语法为 execution(<修饰符><返回类型><包.类.方法(参数)><异常>),修饰符和异常可以省略。
2025-03-10 21:59:04
942
原创 动态 SQL 的使用
以上标签也可以使用 < trim prefix=“where” prefixOverrides=“and”> 替换。以上标签也可以使用 < trim prefix=“set” suffixOverrides=“,”> 替换。只有当条件语句满足条件,才会拼接 < if> 标签内容,因此可用于可选字段。如果有多个可选字段,一般使用< trim>标签结合< if>标签。< if test=“条件语句”> xxxx < /if>根据传入的对象属性来更新数据,使用该标签来指定动态内容。
2025-03-07 17:12:13
540
原创 MyBatis 操作数据库
MyBatis 是一个操作数据库的持久层框架,它支持自定义 SQL、存储过程以及高级映射,是更简单完成程序和数据库交互的工具,也就是更简单的操作和读取数据库的工具。一般来说,ORM 框架会把数据库的每张表映射成一个类,也就是说使用 MyBatis 可以像操作对象一样操作数据库的表,可以实现对象和数据库表之间的转换。resultMap 属性:设置当前查询结果集使用的映射。select 标签的 id 和接口方法名称一样的,表示是对接口方法的具体实现,接口方法和某个 sql 语句通过 id 的值相对应。
2025-03-07 15:48:39
1449
原创 统一数据返回格式
controller的请求映射方法返回的对象可以设置为统一的格式,一般的做法是先设计一个统一的响应格式类,再实现一个控制器增强类。
2025-03-05 16:56:44
375
原创 SpringBoot 异常处理
自定义异常提供了更具体的错误消息、更灵活的异常处理逻辑以及更好的代码可读性和可维护性。自定义异常类当程序出现自定义异常时执行的操作程序抛出自定义异常,且传递了异常信息。
2025-03-05 16:26:58
342
原创 SpringMVC 的配置及拦截器
创建自定义拦截器,实现 HandlerInterceptor 接口的 preHandle(请求前拦截)方法。如果用户未登录,则拦截,否则不拦截。在系统配置中重写添加拦截器的方法,在方法中配置需要拦截的路径,配置路径的方法是添加某些要拦截的路径,排除某些不拦截的路径,SpringMVC 支持模糊匹配的写法,其中 * 代表一级路径,** 代表任意多级路径。在方法配置中添加自定义拦截器,并且配置拦截路径。
2025-03-04 16:34:17
473
原创 解决:This file isn‘t in your working directory.
利用 Postman 上传文件时出现问题:This file isn‘t in your working directory. Teammates you share this request with won‘t be able to use this file.原因是上传的文件不在设置的工作区中,只需要重新设置即可。
2025-03-04 10:31:24
313
原创 解决:org.springframework.web.multipart.support.MissingServletRequestPartException
用 Postman 上传文件时出现下述错误:检查代码后发现是发送请求的变量名和参数名不一致导致的错误,有两种解决办法:
2025-03-03 19:52:07
363
原创 Spring MVC 处理请求
由于 Cookie 中有多个字段,使用 getCookies 方法获取的是数组,因此可以通过 @CookieValue 注解获取请求头中 Cookie 的某个字段的值。请求路径中的路径变量类型需要满足代码中定义的路径变量类型,例如上述例子的路径变量类型是 Integer,那么在请求路径中只能是整型,否则会出现 400 报错。当客户端发送 HTTP 请求时,通常会发送请求头,可以通过 @RequestHeader 注解获取请求头中某个字段的值。url 路径中,某个部分是动态变化的,可以绑定在变量中。
2025-03-03 19:30:07
1095
原创 Spring MVC 返回数据
1、Tomcat 和 Servlet 分别是什么?有什么关系?Servlet 是 java 官方定义的 web 开发的标准规范;Tomcat 是 Servlet 容器(遵循 Servlet 规范来实现的 Web 服务器),可以统一管理 Servlet (整个生命周期)。2、SpringMVC 和 Web 服务器,Servlet 的关系?SpringMVC 是内置的定制过的 Web 服务器,而 Web 服务器遵循 Servlet 规范。
2025-02-27 11:55:42
1253
原创 lombok 的注解说明
情况下使用的是 info 日志级别将日志输出到控制台的,我们可以通过 lombok 提供的 @Slf4j 注解和 log 对。日志是程序中的重要组成部分,使用日志可以快速的发现和定位问题,Spring Boot 内容了日志框架,默认。日志级别依次提升,而日志界别越高,收到的日志信息也就越少,我们可以通过配置日志的保存名称或保存。warn:警告,不影响使用,但需要注意的问题;error:错误信息,级别较高的错误日志信息;trace:微量,少许的意思,级别最低;debug:需要调试时候的关键信息打印;
2025-02-26 18:55:39
148
原创 SpringBoot 日志文件
日志是程序的重要组成部分,其中最重要的用途是排除和定位问题记录用户登录日志,方便分析用户是正常登录还是恶意破解用户。记录系统的操作日志,方便数据恢复和定位操作人。记录程序的执行时间,方便为以后优化程序提供数据支持。在程序中得到日志对象需要使用日志工厂 LoggerFactory。由于Spring Boot内置了日志框架 slf4j,因此可以直接在程序中调用 slf4j。
2025-02-26 17:14:01
860
原创 SpringBoot 配置文件
Spring Boot 配置文件主要分为两种格式:.properties、.yml。理论上讲 properties 可以和 yml 一起存在于一个项目当中,当 properties 和 yml 一起存在一个项目中时,如果配置文件中出现了同样的配置,那么这个时候会以 properties 中的配置为主,也就是 .properties 配置文件的优先级最高,但加载完.properties 文件之后,也会加载 .yml 文件的配置信息。
2025-02-26 13:15:53
421
原创 Bean 的作用域和生命周期
实例化和属性设置是 Java 级别的系统“事件”,其操作过程不可人工干预和修改;而初始化是给开发者提供的,可以在实例化之后,类加载完成之前进行自定义“事件”处理。Spring 容器在初始化一个 Bean 的实例时,同时会指定该实例的作用域。所谓的生命周期指的是一个对象从诞生到销毁的整个生命过程,我们把这个过程就叫做一个对象的生命周期。
2025-02-26 11:06:53
1009
原创 Spring 容器
我们使用Java作为开发语言时,几乎都需要使用ee框架(ssm),其中的 ssm 指的是 spring(boot):基本的脚手架,springmvc:专门做web开发,mybatis:数据库框架。使用框架可以提高开发效率,让我们能更好的管理项目。总结:在代码使用上带来了改变,以前是一片代码写完,现在是看起来代码没关系,但是spring已经内部建立了对象和对象间的关系(依赖关系:X x = new X();m.x = x,此时 x 和 m 存在一定的依赖关系,即 m 依赖 x ),更多的是注解的使用。
2025-02-23 15:58:33
608
原创 解决fatal: unable to access ‘https://gitee.com/.../XXX.git/‘: Failed to connect to 127.0.0.1 port 7890
这个问题通常是由网络连接问题或代理设置不正确导致的。
2025-02-23 14:04:18
315
原创 报错:ValueError: Unknown CUDA arch (8.6) or GPU not supported
运行代码时报错:ValueError: Unknown CUDA arch (8.6) or GPU not supported。
2024-12-13 10:55:02
584
2
原创 轮转数组
如果我们在原数组上通过覆盖元素会导致部分元素的丢失,因此这里使用额外的数组用来保存轮转后的数组。由题意可得,长度为m的数组,轮转 k 后,数组元素下标 index 和之前的下标 i 关系是 index = (i+k) % m。得到上述关系即可解答问题。根据题意可得到结论:将长度为n的数组向右轮转k个位置时,首先反转整个数组,然后反转前k的元素,最后反转n-k个元素,得到的结果即为最终结果,如下图所示。给定一个整数数组 nums,将数组中的元素向右轮转 k 个位置,其中 k 是非负数。
2024-12-11 15:42:17
828
原创 合并区间
本题需要求解合并区间,虽然题目中给的示例是按照第一个元素排序的,但是题目中并没有说明这个条件,因此我们首先需要对数组按照第一个元素进行排序,之后的工作就简单很多了。利用[min, max]代表合并后的数组,数组不能重叠的条件只有一个:左边界 > max,之后分情况讨论可以重叠和不能重叠即可。以数组 intervals 表示若干个区间的集合,其中单个区间为 intervals[i] = [starti, endi]。请你合并所有重叠的区间,并返回 一个不重叠的区间数组,该数组需恰好覆盖输入中的所有区间。
2024-12-10 11:09:35
492
原创 最大子数组和
设 sum 为 i 之前的子数组和,那么 f(i) 有两种情况,要不加上前面的连续子数组,要不就自身元素,即 f(i) = max(sum+i, i),每次对 i 遍历时都要更新 max 的大小。本题在使用动态规划算法时很容易出现的误区是 f(i) = max(sum+i, sum),需要注意题意要求的是连续子数组的最大和,所以 f(i) 必须包含元素 i,即是以 i 为结尾的子数组,因此考虑是否加上 i 之前的元素,即 f(i) = max(sum+i, i),求解完之后要更新 max 的值。
2024-12-09 11:16:51
778
原创 最小覆盖子串
那么如何判断 less 的增减呢,这里使用 int cnt[]数组,以字母的ascii码为索引,首先存储字符串 t 的各个字母个数,右指针 right 往后遍历字符串 s 的时候 cnt[ch]的数量减一,如果 cnt[ch]==0,那么说明当前窗口中的 ch 数量等于字符串 t 中 ch 数量,种类数 less 减一;在左指针往右遍历的时候,如果 cnt[ch]==0,说明往右遍历之后窗口中 cnt[ch] 出现的次数会小于 t 中 cnt[ch] 出现的次数,那么less++。
2024-12-05 11:15:00
848
原创 解决git did not exit cleanly (exit code 128)问题
使用TortoiseGit进行操作时,总是提示下述错误。
2024-12-04 13:52:12
3104
原创 滑动窗口最大值
本题需要遍历每个滑动窗口,然后求出滑动窗口的最大值,重点在于如何将求出滑动窗口最大值的时间复杂度降到O(1)。因此可以使用单调的双端队列。假设循环遍历将nums[i]添加到队列中,每次将i++,那么滑动窗口往后移一位。给你一个整数数组 nums,有一个大小为 k 的滑动窗口从数组的最左侧移动到数组的最右侧。你只可以看到在滑动窗口内的 k 个数字。滑动窗口每次只向右移动一位。返回滑动窗口中的最大值。
2024-11-29 11:18:47
335
原创 和为K的子数组
使用前缀和解决该问题,由题意可知,需要找到和为k的连续子数组的个数,因此可以转换为寻找两个前缀和之差为k的个数。设前缀和数组为prefixSum[],若prefixSum[i]-prefixSum[j]=k,则说明[j+1, i]的子数组的和为k。因此题目转换为求解哈希表中键为prefixSum[i]-k的值。给你一个整数数组 nums 和一个整数 k ,请你统计并返回该数组中和为 k 的子数组的个数。设置左右指针,循环遍历来判断以left为首,right为尾的子数组的元素和是否为k。
2024-11-28 11:22:45
374
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人