
Java
文章平均质量分 63
致力于分享学习中遇到的问题
无问287
这个作者很懒,什么都没留下…
展开
-
Java中的String不可变性
Java中String类的不可变性是通过在底层实现中使用final关键字来实现的。这种设计带来了诸多优点,如线程安全性、安全性和缓存利用等。合理利用String不可变性可以提高程序的性能和安全性,是Java编程中的重要技术之一。通过本文的介绍,读者可以更加深入地了解Java中String不可变性的底层实现原理,并在实际开发中充分利用这一特性来编写高效、安全的Java程序。原创 2024-03-07 16:11:35 · 3217 阅读 · 0 评论 -
final,static,this,super 关键字
说明:使用final方法的原因有两个。静态内部类与非静态内部类之间存在一个最大的区别: 非静态内部类在编译完成之后会隐含地保存着一个引用,该引用是指向创建它的外围类,但是静态内部类却没有。被 static 修饰的成员属于类,不属于单个这个类的某个对象,被类中所有对象共享,可以并且建议通过类名调用。被 static 修饰的成员属于类,不属于单个这个类的某个对象,被类中所有对象共享。这两个关键字连用可以指定导入某个类中的指定静态资源,并且不需要使用类名调用类中静态成员,可以直接使用类中静态成员变量和成员方法。原创 2024-02-05 11:35:26 · 4006 阅读 · 1 评论 -
Apache POl Excel
Apache POl是一个处理Miscrosoft Office各种文件格式的开源项目。简单来说就是,我们可以使用POI在Java程序中对Miscrosoft Office各种文件进行读写操作。一般情况下,POI都是用于操作Excel文件。原创 2024-02-03 19:45:08 · 3964 阅读 · 0 评论 -
SpringTask
当要创建一个定时任务时,@Scheduled可以直接注解在无返回值无参数方法上,表示该方法根据注解的规则定时执行。为了描述这些信息,提供一些特殊的字符。这些具体的细节,我们就不用自己去手写,可以使用在线cron表达式生成器。原创 2024-02-02 16:47:32 · 3916 阅读 · 0 评论 -
synchronized的锁升级
以后该线程在进入和退出 同步块时不需要进行CAS操作来加锁和解锁,。。;。偏向锁的撤销,需要等待全局安全点(在这个时间点上没有正 在执行的字节码)。它会;原创 2024-01-24 00:15:00 · 3751 阅读 · 0 评论 -
JVM中的垃圾收集算法
首先标记出所有需要回收的对象,在标记完成后,统一回收掉所有被标记的对象,也可以反过来,标记存活的对象,统一回收所有未被标记的对象。当这一块的内存用完了,就将还存活着 的对象复制到另外一块上面,然后再把已使用过的内存空间一次清理掉。其中的标记过程仍然与“标记-清除”算法一样,但后续步骤不是直接对可 回收对象进行清理,而是让所有存活的对象都向内存空间一端移动,然后直接清理掉边界以外的内存。可能会导致性能问题:由于需要遍历整个内存空间,标记整理算法在处理大量内存和大量对象时,可能会导致性能问题。原创 2024-01-21 17:56:13 · 4295 阅读 · 0 评论 -
可达性分析
这个算法的基本思路就是通过 一系列称为“GC Roots”的根对象作为起始节点集,从这些节点开始,根据引用关系向下搜索,搜索过 程所走过的路径称为“引用链”(Reference Chain),如果某个对象到GC Roots间没有任何引用链相连, 或者用图论的话来说就是从GC Roots到这个对象不可达时,则证明此对象是不可能再被使用的。原创 2024-01-18 19:13:02 · 5386 阅读 · 0 评论 -
在java中为什么重写equals要重写hashcode
equals() 方法用于比较两个对象是否相等,而 hashCode() 方法用于获取对象的哈希码在 Java 中,如果两个对象通过 equals() 方法判断为相等,则它们的 hashCode() 方法必须返回相同的值。这是因为在使用哈希表(如 HashMap、HashSet)等数据结构时,会先根据对象的哈希码确定存储位置,然后再使用 equals() 方法进行比较来确保唯一性。原创 2024-01-16 09:08:07 · 4633 阅读 · 0 评论 -
基于AOP实现权限管理系统demo
通过AOP来拦截和处理权限相关的操作。主要实现拦截操作。内有完成的仓库地址原创 2024-01-05 00:15:00 · 4673 阅读 · 0 评论 -
MyBatis中的#{}和${}的区别
当我们在Java代码中使用Map或者注解的方式来传递参数时,MyBatis会将参数值替换到#{}的位置上。从上面的示例可以看出,当我们需要插入不可信的参数值时,使用${}可能会导致SQL注入的风险。因此,为了确保程序的安全性,推荐在MyBatis中使用#{}进行参数绑定和预编译。在MyBatis框架中,我们在编写SQL语句时,经常会遇到参数绑定的问题。为此,MyBatis提供了两种参数占位符符号#{}和${},来帮助我们方便地插入参数值。在这个例子中,${username}是一个字符串替换的占位符。原创 2024-01-04 00:15:00 · 4138 阅读 · 0 评论 -
SpringBoot整合mybatis多数据源
mapper文件(主要不同的数据库,mapper也要由区分,例如上文配置 数据库连接类中俩个包名并不相同)首先导入所需的mybatis、mysql和lombok依赖。配置文件 (两个数据库不一样)对应的mapper.xml文件。实体类(这里写的非常简单)ServiceImpl类。最后测试是否连接成功。原创 2024-01-03 00:15:00 · 4347 阅读 · 0 评论 -
Comparator与Comparable
Comparator与Comparable。原创 2023-12-31 01:00:00 · 4203 阅读 · 0 评论 -
接口和抽象类
总结起来,抽象类和接口在Java中都扮演着重要的角色,它们提供了一种方式来组织和管理代码,使得代码更加灵活、可扩展和可维护。通过理解它们的相同点和不同点,我们可以更好地选择适合自己需求的方式来定义和使用抽象类型。而接口是行为的抽象,是一种行为规范。这种实现方式的差异使得接口更适合用于定义多重行为规范,而抽象类更适合用于定义一种通用的模板设计。都是不断抽取出来的抽象概念:抽象类和接口都是为了提高代码的可重用性和模块化而设计的。它们都是从具体的类或方法中提取出共同的特征和行为,形成一种更高层次的抽象。原创 2023-12-30 01:00:00 · 4111 阅读 · 0 评论 -
ArrayList和LinkedList的区别
综上所述,如果需要频繁进行随机访问操作或在尾部进行插入和删除操作,可以选择ArrayList。如果需要频繁进行中间位置的插入和删除操作,或者对内存占用有一定限制,可以选择LinkedList。原创 2023-12-27 00:15:00 · 3796 阅读 · 0 评论 -
Java中的基本数据类型
Java中的基本数据类型原创 2023-12-22 17:54:40 · 3881 阅读 · 0 评论 -
Java的HashMap源码解析和实现原理如下:(具体解释了put方法)
它首先检查是否需要调整哈希表的大小,然后根据键的哈希值在哈希表中查找或创建节点。如果找到了现有的节点,并且onlyIfAbsent参数为false,或者现有节点的值与要插入的值不同,则更新节点的值。它首先计算新的容量和新阈值,然后创建一个新的哈希表,并将旧哈希表中的元素复制到新哈希表中。最后,返回新的哈希表。如果该位置为空,则创建一个新的节点并将其添加到哈希表中。如果该位置已经有其他节点,则遍历链表,直到找到合适的位置插入新节点。它首先检查是否需要调整哈希表的大小,然后根据给定的哈希值在哈希表中查找节点。原创 2023-12-19 17:30:11 · 3892 阅读 · 0 评论 -
int和Integer的区别
使用 Integer类型。int通过强制类型转。原创 2023-12-18 16:17:56 · 3885 阅读 · 0 评论 -
final,finally,finalize的区别
final是修饰符,用于限定类、方法和变量的性质。finally是一个关键字,用于定义一个代码块,在异常处理中用于确保特定代码无论如何都会被执行。finalize是一个Object类中的方法,用于对象的垃圾回收前的清理操作。请注意,finalize方法已被废弃,不推荐使用。在现代Java中,可以使用try-with-resources语句或手动释放资源的方式来替代finalize方法的功能。原创 2023-12-12 18:21:34 · 3983 阅读 · 0 评论 -
进程和线程区别
进程是并发执行的程序在执行过程中分配和管理资源的基本单位。原创 2023-12-11 11:21:56 · 3984 阅读 · 0 评论 -
“==”和“equals”的区别
在比较对象时,"=="比较的是对象的引用,而不是它们的值。例如,如果我们有两个字符串对象,它们的值相等但是它们在内存中的位置不同,那么它们的引用不相等,"=="比较的结果为false。比较的是对象的引用,而不是它们的值。这意味着,如果两个对象的值相等,但它们在内存中的位置不同,那么它们的引用不相等,也就是"=="比较的结果为false。在默认情况下,equals的作用和"=="是一样的,它比较的是对象的引用是否相等。"=="比较的是对象的引用是否相等,而equals比较的是对象的值是否相等。原创 2023-12-10 16:14:25 · 4217 阅读 · 1 评论 -
HashMap和Hashtable区别
迭代器不同:HashMap的迭代器(Iterator)是fail-fast迭代器,而Hashtable的enumerator迭代器不是fail-fast的。提供了常用操作方法:HashMap和Hashtable都提供了一些常用的操作方法,如size()方法用于获取键值对的数量,isEmpty()方法用于判断是否为空等。而如果没有正确的同步的话,多个线程是不能共享HashMap的。初始化容量不同:HashMap 的初始容量为:16,Hashtable 初始容量为:11,两者的负载因子默认都是:0.75。原创 2023-12-09 16:24:38 · 4430 阅读 · 0 评论 -
强引用、软引用、弱引用和虚引用
强引用是最常见的引用类型。原创 2023-12-06 11:33:25 · 4423 阅读 · 0 评论 -
Java类的初始化顺序
类初始化顺序遵循以下三个原则(优先级依次递减)1、静态对象(变量)优先于非静态对象(变量)初始化,其中静态对象(变量)只初始化一次,而非静态对象(变量)可能会初始化多次;2、父类优先于子类初始化;3、成员变量按照定义先后顺序进行初始化;例如:静态变量、非静态变量、静态代码块、非静态代码块、构造函数、父类、子类等。原创 2023-12-03 09:24:55 · 4735 阅读 · 0 评论 -
Java中的深拷贝和浅拷贝
浅拷贝:创建一个新对象,然后将原对象的属性值复制到新对象中。如果属性是引用类型,那么复制的是引用地址,而不是引用的对象。因此,对浅拷贝后的对象进行修改,会影响到原对象。深拷贝:创建一个新对象,然后递归地将原对象的属性值复制到新对象中。对于引用类型的属性,会创建一个新的引用对象,并将原对象的引用地址复制到新对象中。这样,对深拷贝后的对象进行修改,不会影响到原对象。因此,当我们修改这个列表时,所有浅拷贝的对象都会受到影响。而当我们进行深拷贝时,每个对象都有自己的爱好列表,互不影响。的基本信息都是一样的。原创 2023-12-02 10:42:38 · 4418 阅读 · 0 评论 -
Java类加载机制
当一个符合Java虚拟机规范的字节流文件,经历加载、验证、准备、解析、初始化这些阶段相互协作执行完成之后,加载阶段读取到的Class字节流信息,会按虚拟机规定的格式,在方法区保存一份,然后Java 堆中,会创建一个 java.lang.Class 类的对象,这个对象描述了这个类所有信息,也提供了这个类在方法区的访问入口。方法区中,使用同一加载器的情况下,每个类只会有一份Class字节流信息Java堆中,使用同一加载器的情况下,每个类只会有一份 java.lang.Class 类的对象。原创 2023-12-01 11:12:11 · 4300 阅读 · 0 评论 -
SpringBoot可视化监控平台使用
SpringBoot可视化监控平台是一个基于SpringBoot的Actuator模块和Prometheus监控系统的开源项目。它可以帮助开发者实时监控SpringBoot应用的运行状态,包括CPU、内存、磁盘、网络等资源使用情况,以及服务的响应时间、错误率等关键指标。通过这些信息,开发者可以快速定位和解决性能问题,提高应用的稳定性和可用性。原创 2023-11-23 08:55:24 · 4187 阅读 · 0 评论 -
Java反射的实际应用案例
Java反射是Java语言的一种强大功能,它允许程序在运行时访问、检查和修改类、接口、字段和方法的信息。我们希望在运行时根据用户输入的字符串来创建相应的服务实例。为了实现这个功能,我们可以使用Java反射来动态地加载和实例化服务类。运行这个程序,用户可以输入服务名称(A/B/C),程序会根据输入创建相应的服务实例并执行其。应用场景:假设我们有一个应用程序,其中包含多个不同的服务类,这些服务类都有一个共同的接口。这就是Java反射在实际开发中的一个简单的应用案例。方法创建一个新的服务实例。原创 2023-11-18 17:34:57 · 4257 阅读 · 1 评论 -
Java中Integer128陷阱解决方法
128陷阱的解决方法原创 2023-11-18 22:15:00 · 4412 阅读 · 1 评论 -
128陷阱的揭示
在这个例子中,我们创建了两个Integer对象a和b,它们都引用了相同的整数值100。然后,我们将a赋值给了一个int类型的变量e,将b的intValue()方法返回的值赋值给了另一个int类型的变量f。,这是因为在Java中,对象的比较是基于它们的引用,而不是它们的值。所以,尽管a和b的值相同,但它们是不同的对象,因此它们是不相等的。,这是因为在Java中,对象的比较是基于它们的值,而不是它们的引用。所以,尽管c和d的值相同,但它们是不同的对象,因此它们是不相等的。是一个数组,用于存储缓存的整数值。原创 2023-11-16 15:32:56 · 4304 阅读 · 0 评论 -
深入理解StringBuffer和StringBuilder
StringBuffer和StringBuilder都是用于处理和操作字符串的类,它们都提供了一系列的方法和功能原创 2023-11-19 19:39:07 · 4388 阅读 · 0 评论 -
Java反射机制
举个例子,假设我们有一个叫做“Person”的类,它有名字(name)和年龄(age)两个属性,以及获取名字(getName())和设置名字(setName())的方法。但是有了反射机制,我们可以直接在运行时获取Person类的元信息(比如类名、属性和方法等),然后根据这些信息来动态地创建对象、调用方法和访问属性。Java反射机制是Java语言的一个重要特性,它允许我们在运行时获取类的信息、创建对象、调用方法和访问属性等。它可以让我们在运行时动态地获取和修改类的信息,实现更加灵活和通用的功能。原创 2023-11-17 20:23:43 · 4277 阅读 · 0 评论