- 博客(92)
- 收藏
- 关注
原创 Java语法day1
2、给定两个整数 n 和 k,返回范围 [1, n] 中所有可能的 k 个数的组合。1、给你一个整数数组 nums ,数组中的元素 互不相同。返回该数组所有可能的子集(幂集)。4、将下列(A、B、C、D)哪个代码替换下列程序中的【代码】不会导致编译错误(A )你可以按 任意顺序 返回解集。1、派生类调用基类的构造器必须用到的关键字(C)【LeetCode题号:78.子集】【中等】【LeetCode题号:77. 组合】【中等】2、以下哪个接口的定义是正确的( D)3、关键字super的作用是(D )
2024-05-01 00:00:31
430
1
原创 Centos7 安装Git、使用
不能管理这个文件:因为还没有添加到暂存区,暂存区没有提交到本地仓库。手动解决冲突,删除冲突代码,然后重新add 和commit。目录里面的叫(仓库)版本库。是其余分支的冲突代码。所在的目录叫工作区,, 因为我们还没有进行。是当前分支的冲突代码,
2024-04-30 18:19:22
3710
2
原创 Centos 7 安装 Redis
但是如果是Centos 7,redis 默认的是。如果是Centos 8 直接。② 针对配置文件创建符号链接。进程 id 可以通过上面的。
2024-04-30 15:40:35
689
原创 我的博客系统自动化测试设计
4、查看详情:在我的博客列表页,点击第一条最新添加的博客,进入博客详情页面,展示当前博客的标题、内容、发布时间以及阅读量等信息。5、修改博客:在我的博客博客列表页面点击修改博客按钮,那么会进入博客编辑页,此时编辑页的标题以及正文的内容就是我所点击的博客的标题和正文。3、写博客:在我的博客列表页面,点击写博客按钮,进入添加博客页面,输入博客标题以及博客内容,点击发布文章,这个时候会弹窗“6、删除博客:在我的博客列表页面,点击每个博客对应的删除按钮,则会删除该博客,并且文章数量-1;1、注册:在登陆页面点击“
2024-04-28 18:46:39
583
原创 接口、抽象类、普通类
不可以的。final的类不能被重写和继承,而abstract的类是抽象类,本身没有实现,只能通过子类来实现,也就是说必须被继承。抽象类中不能有static,final,private修饰的方法被static修饰的方法属于类,是类自己的东西,不是给子类来继承的private的访问权限是本类中,子类继承父类后,是无法重写private修饰的方法的抽象类不能被实例化(初学者很容易犯的错),如果被实例化,就会报错,编译无法通过。只有抽象类的非抽象子类可以创建对象。
2024-04-27 13:41:07
948
原创 spring的跨域问题
跨域问题本质是浏览器的一种保护机制,它的初衷是为了保证用户的安全防止恶意网站窃取数据。1、协议不同,如 http 和 https;2、域名不同;3、端口不同。
2024-04-23 18:04:06
474
原创 实现自定义注解、实现自定义幂等性注解
添加 Spring AOP 依赖。创建自定义注解。创建一个新的 Java 注解类,通过@interface关键字来定义,并可以添加元注解以及属性。@Target(ElementType.METHOD) //表示作用于方法上@Retention(RetentionPolicy.RUNTIME) // 表示这个注解在运行时是可见的,这样 AOP 代理才能在运行时读取到这个注解编写 AOP 拦截(自定义注解)的逻辑代码。@Aspect@Component// 方法执行前的处理。
2024-04-23 16:58:51
1167
1
原创 SpringBoot 如何获取HttpServletRequest 简称 Request对象
如果还需要注入response,代码就更繁琐了。而对于方法2,不仅可以在Controller中注入,还可以在任何Bean中注入,包括Service、Repository及普通的Bean。注入的对象不限于request:除了注入request对象,该方法还可以注入其他scope为request或session的对象,如response对象、session对象等;减少代码冗余:只需要在需要request对象的Bean中注入request对象,便可以在该Bean的各个方法中使用,与方法1相比大大减少了代码冗余。
2024-04-22 18:27:40
949
原创 Spring Boot 如何实现缓存预热
监听 ContextRefreshedEvent 或 ApplicationReadyEvent 等应用上下文初始化完成事件。
2024-04-22 18:10:44
1242
原创 Springboot 常见注解
是 Spring Boot 中一个关键的注解,它的主要作用是利用 Spring Boot 的自动配置机制来简化应用配置。这个注解背后的工作原理涉及几个重要的组件和概念,这些帮助 Spring Boot 在不需要过多配置的情况下,智能地配置 Spring 应用程序。告诉 Spring Boot “查看你的类路径,基于你找到的类(比如有无某些特定的库),智能地默认配置你的 Spring 应用”。是 Spring Boot 的一个核心注解,主要用于开启自动配置和组件扫描,是一个便捷的注解,汇集了。
2024-04-21 20:43:09
1015
原创 测试JAVA 测开
依据需求将输入(特殊情况下会考虑输出)划分为若干个等价类,从等价类中选出一个测试用例,如果这个测试用例测试通过,则认为所代表的等价类测试通过,这样就可以用较少的测试用例达到尽量多的功能覆盖,解决了不能穷举测试的问题。:如果原因为真,那么结果必定为真, 例如:动物园运来大熊猫,动物园一定有大熊猫。无效等价类:不满足用户需求的输入集合,无效等价类。有效等价类:满足用户需求输入集合有效等价类。:2个原因中有一个为真时,结果就为真。:只有2个原因都为真,那么结果为真。:只有原因为假,结果才为真。
2024-04-18 17:35:30
399
原创 虚拟线程和普通线程
Java 中的虚拟线程,也叫做协程或“轻量级线程”,它诞生于 JDK 19(预览 API),正式发布于 JDK 21,它是一种在 Java 虚拟机(JVM)层面实现的逻辑线程,不直接和操作系统的物理线程一一对应,因此它可以减少上下文切换所带来的性能开销。
2024-04-12 21:33:17
392
原创 JUC下面常见的锁
当调用 await() 方法的时候,如果 state 不为 0,那就证明任务还没有执行完毕,await() 方法就会一直阻塞,也就是说 await() 方法之后的语句不会被执行。直到count 个线程调用了countDown()使 state 值被减为 0,或者调用await()的线程被中断,该线程才会从阻塞中被唤醒,await() 方法之后的语句得到执行。让一组线程到达一个屏障(也可以叫同步点)时被阻塞,直到最后一个线程到达屏障时,屏障才会开门,所有被屏障拦截的线程才会继续干活。
2024-04-12 20:59:52
307
原创 JAVA 并发编程JUC 锁策略
具体来说,每次进行 CAS 操作时,不仅需要比较要修改的内存地址的值与期望的值是否相等,还需要比较这个内存地址的版本号是否与期望的版本号相等。悲观锁总是假设最坏的情况,认为共享资源每次被访问的时候就会出现问题,例如共享数据被修改等,所以每次在获取资源操作的时候都会上锁,这样其他线程想拿到这个资源就会阻塞直到锁被上一个持有者释放。乐观锁总是假设最好的情况,认为共享资源每次被访问的时候不会出现问题,线程可以不停地执行,无需加锁也无需等待,只是在提交修改的时候去验证对应的资源数据是否被其它线程修改了(
2024-04-12 19:49:24
360
原创 并发编程-线程安全:volatile、Lock、synchronized、CAS、ABA、AQS
AQS(AbstractQueuedSynchronizer)是一个用于实现各种同步器的抽象类,是 JUC(java.util.concurrent)并发包中的核心类之一,JUC 中的许多并发工具类和接口都是基于 AQS 实现的。它提供了一种基于队列的、高效的、可扩展的同步机制,是实现锁、信号量、倒计时器等同步器的基础。同步器:同步器指的是用于控制多线程访问共享资源的机制。同步器可以保证在同一时间只有一个线程可以访问共享资源,从而避免了多线程访问共享资源时可能出现的数据竞争和不一致性问题。
2024-04-12 16:53:00
1099
原创 线程池的执行流程
先判断当前线程数是否大于核心线程数?如果结果为 false,则新建线程并执行任务;如果结果为 false,则把任务添加到任务队列中等待线程执行,否则则判断当前线程数量是否超过最大线程数?如果结果为 false,则新建线程执行此任务,否则将执行线程池的拒绝策略。DiscardOldestPolicy:忽略最早的任务,最先加入队列的任务。CallerRunsPolicy:把任务交给添加此任务的(main)线程来执行(使用当前调用的线程来执行此任务);DiscardPolicy:忽略此任务,忽略最新的一个任务;
2024-04-12 12:47:12
342
原创 常见线程池的创建方式
类创建线程池提供了几个不同参数的构造方法,这 7 个参数分别是:corePoolSize:核心线程数。是指线程池中长期存活的线程数。maximumPoolSize:最大线程数。线程池允许创建的最大线程数量,当线程池的任务队列满了之后,可以创建的最大线程数。最大线程数不能小于核心线程数,否则会报错keepAliveTime:空闲线程存活时间。当线程池中没有任务时,会销毁一些线程,销毁的线程数=maximumPoolSize(最大线程数)-corePoolSize(核心线程数)。
2024-04-12 12:29:36
855
原创 重写 equals 时为什么一定要重写 hashCode
hashCode 和 equals 两个方法是用来协同判断两个对象是否相等的,采用这种方式的原因是可以提高程序插入和查询的速度,如果在重写 equals 时,不重写 hashCode,就会导致在某些场景下,例如将两个相等的自定义对象存储在 Set 集合时,就会出现程序执行的异常,为了保证程序的正常执行,所以我们就需要在重写 equals 时,也一并重写 hashCode 方法才行。
2024-04-12 10:27:19
726
原创 进程和线程的区别
线程可以看作是轻量级的进程,一个进程中包含了多个线程,因此多个线程间可以共享进程资源。如上图所示,堆和方法区是可以共享的区域,而程序计数器和栈是每个线程私有的。
2024-04-12 00:32:23
163
原创 双亲委派模型
双亲委派模型是 Java 类加载器的一种工作机制。类加载器有很多种,当我们想要加载一个类的时候,具体是哪个类加载器加载呢?这就需要提到双亲委派模型。类使用委托模型来搜索类和资源。每个实例都有一个相关的父类加载器。需要查找类或资源时,实例会在试图亲自查找类或资源之前,将搜索类或资源的任务委托给其父类加载器。虚拟机中被称为 ""的内置类加载器本身没有父类加载器,但是可以作为实例的父类加载器。ClassLoader 类使用委托模型来搜索类和资源。
2024-04-12 00:23:53
857
原创 Java 类加载过程
加载(Loading)阶段是整个“类加载”(Class Loading)过程中的一个阶段,它和类加载 Class Loading 是不同的,一个是加载 Loading 另一个是类加载 Class Loading,所以不要把二者搞混了。验证是连接阶段的第一步,这一阶段的目的是确保 Class 文件的字节流中包含的信息符合《Java虚拟机规范》的全部约束要求,保证这些信息被当作代码运行后不会危害虚拟机自身的安全。是类加载的最后一步,这一步 JVM 才开始真正执行类中定义的 Java 程序代码(字节码)。
2024-04-11 20:43:10
400
原创 JVM 垃圾收集器
Parallel Scavenge/Parallel Old:吞吐量优先的垃圾回收器【JDK8 默认的垃圾回收器】;ZGC:停顿时间超短(不超过 10ms)的情况下尽量提高垃圾回收吞吐量的垃圾收集器【JDK 15 之后默认的垃圾回收器】(从 JDK9 开始,CMS 收集器已被弃用),ParNew:多线程的垃圾回收器(Serial 的多线程版本);G1:可控垃圾回收时间的垃圾收集器【JDK 9 之后默认的垃圾回收器】;Serial Old:Serial 收集器的老年代版本,采用。
2024-04-11 19:37:36
495
原创 JVM 垃圾回收算法
因为对象分为两种:绝大多数对象都是朝生夕灭的,也就是用完一次之后就不用了,而剩下一小部分对象是要重复使用多次的,将不同的对象划分到不同的区域,不同的区域使用不同的算法进行垃圾回收,这样可以大大提高 Java 虚拟机的工作效率。不同区域不同算法在分代算法中对于不同区域采用的具体算法也是不同的,新生代存放的大部分数据是朝生夕灭的,所以新生代使用的是。,如果标记-清除可以满足需要那么就使用效率更好的标记-清除算法,如果标记-清除算法不能满足需要就使用标记-整理算法。:标记清除后会产生大量不连续的内存碎片。
2024-04-11 18:43:08
600
原创 Java常见的设计模式
模板方法模式是最常用的设计模式之一,它是指定义一个操作算法的骨架,而将一些步骤的实现延迟到子类中去实现,使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤。适配器模式是一种结构型设计模式,它允许开发人员将一个类的接口转换成另一个类的接口,以满足客户端的需求。比如在 Spring 中,FactoryBean 就是一个工厂模式的实现,使用它的工厂模式就可以创建出来其他的 Bean 对象。定义了一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都会得到通知并自动更新。
2024-04-11 16:26:55
497
原创 Redis 主从复制实现
接着,主服务器将 replication buffer 缓冲区里所记录的写操作命令发送给从服务器,从服务器执行来自主服务器 replication buffer 缓冲区里发来的命令,这时主从服务器的数据就一致了。这里有一点要注意,主服务器生成 RDB 这个过程是不会阻塞主线程的,因为 bgsave 命令是产生了一个子进程来做生成 RDB文件的工作,是异步工作的,这样 Redis 依然可以正常处理命令。响应命令的意图是采用全量复制的方式,也就是主服务器会把所有的数据都同步给从服务器。基于长连接的命令传播。
2024-04-11 11:00:50
792
原创 Redis数据持久化 AOF RDB
如果频率太低,两次快照间一旦服务器发生宕机,就可能会比较多的数据丢失;如果频率太高,频繁写入磁盘和创建子进程会带来额外的性能开销。
2024-04-08 22:26:39
916
原创 MQ死信队列&&延迟队列
消息的存活时间到了队列满了(是哪一个消息会成为死信?等待最久的消息会成为死信消息消费被拒绝了,或者给rabbitmq返回ack,并且requeue设置为false默认情况下,rabbitmq 对死信的处理就是直接丢弃如果在创建某个队列的时候,给队列设置了死信队列,那么此时如果一个消息成为了死信,那么对rabbitmq就会吧这个死信存储在死信队列中。import org/**/*** 死信交换机} /*** 正常的交换机。
2024-04-08 15:26:41
397
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人