- 博客(100)
- 收藏
- 关注
原创 Java集合(七)- TreeSet & TreeMap
之所以把TreeSet和TreeMap放在一起讲解,是因为二者在Java里有着相同的实现,前者仅仅是对后者做了一层包装,也就是说TreeSet里面有一个TreeMap(适配器模式)**。因此本文将重点分析TreeMap。JavaTreeMap实现了SortedMap接口,也就是说会按照key的大小顺序对Map中的元素进行排序,key大小的评判可以通过其本身的自然顺序(natural ordering),也可以通过构造时传入的比较器(Comparator)。TreeMap。
2024-12-11 23:42:59
685
原创 Java集合(六)- LinkedHashSet&Map
如果你已看过前面关于HashSet和HashMap,以及TreeSet和TreeMap的讲解,一定能够想到本文将要讲解的和其实也是一回事。和在Java里也有着相同的实现,前者仅仅是对后者做了一层包装,也就是说LinkedHashSet里面有一个LinkedHashMap(适配器模式)。因此本文将重点分析。实现了Map接口,即允许放入key为null的元素,也允许插入value为null的元素。从名字上可以看出该容器是和HashMap的混合体,也就是说它同时满足。
2024-12-10 23:00:57
952
原创 Java集合(五)- HashSet & HashMap
之所以把HashSet和HashMap放在一起讲解,是因为二者在Java里有着相同的实现,前者仅仅是对后者做了一层包装,也就是说HashSet里面有一个HashMap(适配器模式)。因此本文将重点分析HashMap。HashMap实现了Map接口,即允许放入key为null的元素,也允许插入value为null的元素;除该类未实现同步外,其余跟Hashtable大致相同;跟TreeMap。
2024-12-10 22:56:43
649
原创 Java集合(四)- PriorityQueue
前面以JavaArrayDeque为例讲解了Stack和Queue,其实还有一种特殊的队列叫做,即优先队列。优先队列的作用是能保证每次取出的元素都是队列中权值最小的(Java的优先队列每次取最小元素,C++的优先队列每次取最大元素)。这里牵涉到了大小关系,元素大小的评判可以通过元素本身的自然顺序(),也可以通过构造时传入的比较器Comparator,类似于C++的仿函数)。Java中实现了Queue接口,不允许放入null元素;其通过堆实现,具体说是通过完全二叉树()实现的小顶堆。
2024-12-08 15:49:35
662
原创 Java集合(三)- Stack & Queue
Java里有一个叫做Stack的类,却没有叫做Queue的类(它是个接口名字)。当需要使用栈时,Java已不推荐使用Stack,而是推荐使用更高效的ArrayDeque;既然Queue只是一个接口,当需要使用队列时也就首选ArrayDeque了(次选是LinkedList。
2024-12-08 15:40:06
675
原创 Java集合(二)- LinkedList
LinkedList同时实现了List接口和Deque接口,也就是说它既可以看作一个顺序容器,又可以看作一个队列(Queue),同时又可以看作一个栈(Stack这样看来,LinkedList简直就是个全能冠军。当你需要使用栈或者队列时,可以考虑使用LinkedList,一方面是因为Java官方已经声明不建议使用Stack类,更遗憾的是,Java里根本没有一个叫做Queue的类(它是个接口名字)。关于栈或队列,现在的首选是ArrayDeque,它有着比。
2024-12-05 22:53:27
873
原创 Java集合(一)- ArrayList
数组进行扩容时,会将老数组中的元素重新拷贝一份到新的数组中,每次数组容量的增长大约是其原容量的1.5倍。这种操作的代价是很高的,因此在实际使用时,我们应该尽量避免数组容量的扩张。当我们可预知要保存的元素的多少时,要在构造ArrayList实例时,就指定其容量,以避免数组扩容的发生。每当向数组中添加元素时,都要去检查添加后元素的个数是否会超出当前数组的长度,如果超出,数组将会进行扩容,以满足添加数据的需求。如果从指定位置插入,也会存在移动元素的情况。的时间复杂度不仅跟插入元素的多少有关,也跟插入的位置相关。
2024-12-05 22:49:28
736
原创 JVM(五)- 垃圾回收基础知识
通过记录每个 Region 垃圾回收时间以及回收所获得的空间(这两个值是通过过去回收的经验获得),并维护一个优先列表,每次根据允许的收集时间,优先回收价值最大的 Region。虚拟机并不是永远地要求对象的年龄必须达到 MaxTenuringThreshold 才能晋升老年代,如果在 Survivor 中相同年龄所有对象大小的总和大于 Survivor 空间的一半,则年龄大于或等于该年龄的对象可以直接进入老年代,无需等到 MaxTenuringThreshold 中要求的年龄。
2024-12-04 23:31:56
851
原创 JVM(四) - JVM 内存结构
通过下面两个问题,理解下PC计数器使用PC寄存器存储字节码指令地址有什么用呢?为什么使用PC寄存器记录当前线程的执行地址呢?因为CPU需要不停的切换各个线程,这时候切换回来以后,就得知道接着从哪开始继续执行。JVM的字节码解释器就需要通过改变PC寄存器的值来明确下一条应该执行什么样的字节码指令。PC寄存器为什么会被设定为线程私有的?多线程在一个特定的时间段内只会执行其中某一个线程方法,CPU会不停的做任务切换,这样必然会导致经常中断或恢复。
2024-12-03 22:08:45
846
原创 JVM (三) - 类加载机制
通常情况下,我们都是直接使用系统类加载器。但是,有的时候,我们也需要自定义类加载器。比如应用是通过网络来传输 Java 类的字节码,为保证安全性,这些字节码经过了加密处理,这时系统类加载器就无法对其进行加载,这样则需要自定义类加载器来实现。自定义类加载器一般都是继承自 ClassLoader 类,从上面对 loadClass 方法来分析来看,我们只需要重写 findClass 方法即可。try {
2024-12-03 21:56:07
651
原创 JVM(二) 字节码的增强技术
字节码增强技术相当于是一把打开运行时JVM的钥匙,利用它可以动态地对运行中的程序做修改,也可以跟踪JVM运行中程序的状态。此外,我们平时使用的动态代理、AOP也与字节码增强密切相关,它们实质上还是利用各种手段生成符合规范的字节码文件。综上所述,掌握字节码增强后可以高效地定位并快速修复一些棘手的问题(如线上性能问题、方法出现不可控的出入参需要紧急加日志等问题),也可以在开发中减少冗余代码,大大提高开发效率。参考文章。
2024-11-28 22:17:47
1175
原创 Java异常
super(msg);// ...try、catch和finally都不能单独使用,只能是try-catch、try-finally或者try-catch-finally。try语句块监控代码,出现异常就停止执行下面的代码,然后将异常移交给catch语句块来处理。finally语句块中的代码一定会被执行,常用于回收资源。throws:声明一个异常,告知方法调用者。throw :抛出一个异常,至于该异常被捕获还是继续抛出都与它无关。Java编程思想一书中,对异常的总结。
2024-11-27 21:52:59
1115
原创 Java注解
当我们理解了内置注解, 元注解和获取注解的反射接口后,我们便可以开始自定义注解了。定义自己的注解使用注解@Override用反射接口获取注解信息try {// 获取所有methods// 遍历// 方法上是否有MyMethodAnnotation注解try {// 获取并遍历方法上的所有注解// 获取MyMethodAnnotation对象信息测试的输出最为常见的就是使用Spring AOP切面实现统一的操作日志管理。
2024-11-23 23:57:11
753
原创 Java反射
在反射包中,我们常用的类主要有Constructor类表示的是Class 对象所表示的类的构造方法,利用它可以在运行时动态创建对象、Field表示Class对象所表示的类的成员变量,通过它可以在运行时动态修改成员变量的属性值(包含private)、Method表示Class对象所表示的类的成员方法,通过它可以动态调用对象的方法(包含private),下面将对这几个重要类进行分别说明。也是同样的道理,都是获取Method对象所表示的方法的参数类型,其他方法与前面的Field和Constructor是类似的。
2024-11-21 23:08:39
952
原创 Java泛型
是同时存在的,可是如果是常规的两个方法,他们的方法签名是一样的,也就是说虚拟机根本不能分别这两个方法。如果是我们自己编写Java代码,这样的代码是无法通过编译器的检查的,但是虚拟机却是允许这样做的,因为虚拟机通过参数类型和返回类型来确定一个方法,所以编译器为了实现泛型的多态允许自己做这个看起来“不合法”的事情,然后交给虚拟器去区别。如果是重载,那么子类中两个setValue方法,一个是参数Object类型,一个是Date类型,可是我们发现,根本就没有这样的一个子类继承自父类的Object类型参数的方法。
2024-11-20 22:08:20
946
原创 @Transactional的实现原理
Spring将带有@Transactional注解的类生成动态代理类,本质就是将带有@Transactional 注解的方法内对数据库的操作放在try catch中,如果报错则回滚,如果不报错则成功提交。a服务的a方法上面加了@Transactional注解,然后a方法在表中插入一条数据,然后调用b服务,b服务的b方法再调用a服务中的c方法查询刚刚插入的数据发现查不到。
2024-09-30 12:59:33
227
原创 Systemctl
守护进程是运行在后台的一种特殊进程,它独立于控制终端并且周期性地执行某种任务或循环等待处理某些事件的发生;它不需要用户输入就能运行而且提供某种服务,不是对整个系统就是对某个用户程序提供服务。Linux系统的大多数服务器就是通过守护进程实现的。使用systemctl restart mysql 重启mysql之后发现mysql修改的配置文件的内容没有应用上,故而研究原因。Systemctl是一个systemd工具,主要负责控制systemd系统和服务管理器。补充:守护进程是什么?
2024-09-29 13:03:13
434
原创 MySQL 连接数过多的处理方法 Too many connections
有关 MySQL 连接数过多的错误,我们要在平时的工作中多实践,这里的很多关键参数都需要我们对手中的工作有更宏观的认识,才能更好的设定这些参数。
2024-09-27 10:09:07
2831
原创 配置使用ssh连接服务器
在~目录下创建.ssh/authorized_keys文件,将公钥放进来,然后重启ssh服务:sudo systemctl restart sshd。
2024-08-21 16:03:44
156
原创 git如何撤销已经push到远程仓库的代码提交
比如需要撤销 “modified for env boot_name” 这次提交,所以需要回退至的版本是 “add support yt8521s phy”,即需要回退至的版本号是:a1ad5a6f317ceadb087dbb0138a3bd0f683c2040。参数soft指的是:保留当前工作区,以便重新提交,比如我们这次是修改后重新提交 还可以选择参数hard,会撤销相应工作区的修改,一定要谨慎使用,以免出错。matser是你的分支名,必须添加参数force进行强制提交,否则会提交失败。
2024-07-26 14:27:35
535
原创 设计模式(四)责任链模式
(Chain of Responsibility): 使多个对象都有机会处理同一请求,从而避免请求的发送者和接受者之间的耦合关系,每个对象都是一个处理节点,将这些对象连成一条链,并沿着这条链传递该请求。1、在企业级应用中,从前台发过来的请求在后台抛出异常,异常处理的设计一般会用到责任链模式,比如sql异常并不会直接抛出给前台,而是经过一系列的处理和再封装,抛给前台一个用户可识别的异常信息。
2024-07-02 16:04:02
385
原创 Pinia刷新会丢失数据 应该怎么解决
使用 pinia-plugin-persistedstate插件,官网:Home | pinia-plugin-persistedstate
2024-07-02 13:34:37
539
原创 Vue父子组件以及兄弟组件事件通信
Vue 3 提供了多种组件间通信的方式,这些方式满足了从简单父子通信到复杂全局状态管理的各种需求。props 和自定义事件依旧是父子组件通信的首选方式,provide 和 inject 提供了一种新的兄弟组件通信方法,而 Vuex 依旧是管理大型应用状态的强大工具。理解这些通信机制的适用场景和限制,将帮助你构建更加可维护和高效的 Vue 应用。前端|Vue Vue3 超详细 实现组件通信: 父子、子父及兄弟组件间的数据流转_vue3 父子传值之后数据变成proxy(array)-优快云博客。
2024-06-25 10:31:59
1255
1
原创 Java8 新特性 记录【持续更新】
Optional.empty()该方法用来构造一个空的 Optional,即该 Optional 中不包含值 —— 其实底层实现还是 如果 Optional 中的 value 为 null 则该 Optional 为不包含值的状态,然后在 API 层面将 Optional 表现的不能包含 null 值,使得 Optional 只存在 包含值 和 不包含值 两种状态。JDK 1.8加入了 Optional 类。如果值存在则 isPresent()方法会返回 true,调用 get() 方法会返回该对象。
2024-06-18 14:01:32
628
原创 设计模式(三)代理模式
静态代理是定义父类或者接口,然后被代理对象(即目标对象)与代理对象一起实现相同的接口或者是继承相同父类。代理对象与目标对象实现相同的接口,然后通过调用相同的方法来调用目标对象的方法。优点:可不修改目标对象的功能,通过代理对象对目标功能扩展。缺点:因为代理对象需要与目标对象实现一样的接口,所以会有很多代理类,一旦接口增加方法,目标对象与代理对象都要维护ITeacherDao:接口TeacherDao:目标对象,实现接口ITeacherDao。
2024-06-17 15:33:14
890
原创 Slf4j+logback的使用与配置以及详情介绍
Slf4j其实是接口并非实现类,logback才是它们的实现,如果只导入Slf4j-api依赖的话,并没有实现方法,所以打印不出日志。
2024-06-17 11:12:14
973
原创 观察者模式
观察者模式(Observer Design Pattern):在对象之间定义一个一对多的依赖,当一个对象状态改变的时候,所有依赖的对象都会得到通知并自动更新。说人话:也叫发布订阅模式,能够很好的解耦一个对象改变,自动改变另一个对象这种情况。观察者模式的类图如下:①、Subject 被观察者定义被观察者必须实现的职责, 它必须能够动态地增加、 取消观察者。它一般是抽象类或者是实现类, 仅仅完成作为被观察者必须实现的职责: 管理观察者并通知观察者。②、Observer观察者。
2024-06-14 10:29:15
756
原创 windows10系统下替换、修改jar中的文件并重新打包成jar文件然后运行
maven打包部署之后发现页面上内容显示不正确,究其原因发现是打包之后activiti内某些文件内容错误所致,故想到临时解决方案:先打包完,再修改jar中的activiti文件,再重新打包。替换BOOT-INF\classes\static下的activiti文件夹。
2024-06-07 15:04:56
567
原创 服务启动命令记录
java -XX:MetaspaceSize=1024m -XX:MaxMetaspaceSize=1024m -Xms1024m -Xmx1024m -jar /home/java/路径.jar --spring.profiles.active=dev。重新加载 Nginx 的配置文件:sudo nginx -s reload。
2024-06-07 12:52:54
135
原创 ES启动失败原因记录
压缩包中包含有自带的jdk,但是当我们的Linux中已经安装了jdk之后,就会发现启动es的时候优先去找的是Linux中已经装好的jdk,此时如果jdk的版本不一致,就会造成jdk不能正常运行,报错如下。默认最大映射数为65530,无法满足ES系统要求,需要调整为262144以上。服务本来没有配置jdk,则会直接使用es目录下默认的jdk,反而不会报错。进入bin目录,修改elasticsearch-env配置。es和jdk是一个强依赖的关系,所以当我们在新版本的。二、系统虚拟内容不足。
2024-06-07 12:46:49
792
原创 解决springboot配置jackson.date-format不生效的问题
添加拦截器并继承 WebMvcConfigurationSupport 后会覆盖@EnableAutoConfiguration关于WebMvcAutoConfiguration的配置!从而导致所有的Date返回都变成时间戳。springboot项目中出参为json时,日期格式化配置一般为。但是不生效,返回的是依旧是时间戳格式;
2024-06-03 18:06:50
1313
原创 Git基本使用
之前都是通过Idea图形化操作git分支,最近在用VsCode写前端代码,提交以及分支合并时候发现不习惯VsCode里面的图形化操作,但是发现对git原生指令并不熟悉,由此,重新学习一次git并记录。git add .表示将当前目录下的所有文件都加入暂存区,如果想加入单个文件,则git add 需要加入的文件名就可。2、使用git branch查看所有的分支(分支绿色代表当前是zzh_1分支)3、使用git commit 命令提交暂存区文件到版本库中。4、使用git merge命令将分支合并到当前分支。
2024-05-30 15:26:16
474
原创 Openfeign ErrorDecoder导致java.io.IOException:流已关闭
当我尝试实现来解码假异常时,我发现中的流是关闭的,所以当我尝试读取流并转换为字符串时,它抛出。这真的很困惑,因为在解码器之前,我没有做任何事情来提前关闭流。
2024-05-24 16:07:16
309
原创 Dialog弹框组件遇到问题
如果第一次打开弹框时候将dialog的可见性设置为true,但是在关闭弹框时候没有将dialog的可见性设置为false,则第二次点击弹框按钮会出现不弹框的情况。
2024-05-16 17:27:32
465
原创 前端创建对象加不加ref的区别
只是创建了一个普通的 JavaScript 对象,它不具有 Vue 的响应式特性。属性,该属性包含着被包装的值。这个包装器允许 Vue 跟踪变量的变化并在视图中更新。所以,当你想要在 Vue 中实现数据的响应式更新时,应该使用。创建了一个响应式的对象。要访问它的属性,你需要通过。中的属性,Vue 将无法检测到这个变化并更新视图。函数创建变量,而不是简单地声明一个普通的对象。函数用于创建一个响应式的引用包装器。创建的变量是一个对象,它具有一个。在 Vue 3 中,
2024-05-16 17:19:02
238
原创 【SpringCloud】Feign解决Get请求自动转化成POST的问题
它在服务器和三方之间,检测到请求里面有body,所以它就 默默的、偷偷的、悄悄的、无感的他把换成了POST请求!你没看错,所以就报错了!Feign默认使用的连接工具实现类,所以里面发现只要你有body体对象,就会强制的把GET请求转换成POST请求。郁闷的一个问题:他就这么一改?三方get方式就相当于忽略了?追查原因很简单,就是。
2024-05-11 15:59:45
838
原创 使用npm安装依赖时遇到速度慢的问题,通常有几种解决方法?
这些方法中的一种或多种可能会改善你在 macOS 上使用 npm 安装依赖包的速度和成功率。如果问题仍然存在,可能是由于网络或其他因素造成的,你可以尝试更换网络环境或联系网络管理员寻求进一步的帮助。yarn 是另一款常用的包管理工具,它可以替代 npm,并且通常具有更快的下载速度。淘宝镜像是一个 npm 镜像,可以提供快速的下载速度。如果可能的话,连接到一个更稳定和快速的网络环境,有时候网络问题也会导致npm安装依赖缓慢或失败。确保你正在使用最新版本的npm,因为新版本通常会修复旧版本中的一些性能问题。
2024-04-23 21:14:14
642
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人