- 博客(33)
- 收藏
- 关注
原创 深拷贝和浅拷贝
浅拷贝只复制对象本身,而不复制对象内部的引用类型字段。也就是说,浅拷贝后,原对象和新对象。深拷贝不仅复制对象本身,还递归地复制对象内部的所有引用类型字段。也就是说,深拷贝后,是两种常见的对象复制方式。它们的主要区别在于是否复制对象的引用类型字段。通过序列化和反序列化实现深拷贝,适用于复杂对象结构。
2025-03-20 15:14:58
621
原创 HashMap源码解读
/ 默认初始容量,必须是 2 的幂// 16// 最大容量// 默认负载因子// 当链表长度达到 8 时,将链表转换为红黑树// 当红黑树节点数小于 6 时,将红黑树转换为链表// 当桶数组长度达到 64 时,才允许链表转换为红黑树// 存储数据的数组// 键值对的数量// 修改次数// 扩容阈值,当 size 达到该值时,进行扩容// 负载因子:默认初始容量为 16,必须是 2 的幂,这样可以通过位运算来提高哈希计算的效率。
2025-03-16 19:08:52
1085
原创 Java位运算
因为它们直接操作的是整数的,而不是整个数值。例如,5的二进制是0101,位运算就是对这些0和1进行操作。位运算在底层编程、优化性能和处理数据时非常有用。
2025-03-16 15:21:37
986
原创 ThreadLocal(线程本地存储)
是 Java 中用于实现的一个类。它的主要作用是为每个线程提供,从而避免多线程环境下的数据共享和竞争问题。get()由于线程池中的线程会被复用,使用时需要,否则可能导致内存泄漏。
2025-03-15 20:04:57
846
原创 线程、多线程以及线程池的关系与用法
在没有线程池的情况下,创建线程主要有以下几种方式:这种方式直接继承 类并重写 方法。缺点:Java 不支持多继承,如果类已经继承了其他类,则无法再继承 。(2) 实现 接口这种方式更灵活,因为一个类可以同时实现多个接口。需要手动创建 对象并将 实例传递给它。(3) 实现 接口 接口允许任务返回结果,并可以抛出异常。需要与 配合使用。多线程定义:通过多个线程并发或并行执行任务,实现高效处理。实现方式:直接创建多个线程:手动创建和启动多个线程对象。
2025-03-15 19:15:54
1004
原创 Try-With-Resources
是 Java 7 引入的一种语法糖,用于简化资源管理。它的核心目标是Closeable,从而避免手动调用close()方法导致的资源泄漏问题。
2025-03-14 19:48:16
836
原创 CAS(Compare-And-Swap)
CAS是一种乐观锁机制,用于实现多线程环境下的原子操作。它通过比较共享变量的当前值与期望值是否相等,如果相等则将共享变量的值更新为新值。CAS是一种非阻塞算法,可以避免传统锁机制带来的性能开销和线程阻塞。它指的是在CAS操作期间,共享变量的值由A变为B,然后再从B变回A。这可能导致CAS操作错误地认为没有其他线程修改过值。为了避免ABA问题,可以使用版本号或标记(一般加时间戳比较保险)来跟踪共享变量的变化,确保CAS操作同时检查值和版本号。
2025-03-14 14:44:26
1573
原创 volatile、synchronized和Lock
是解决并发问题的三种重要工具。它们有不同的使用场景和特点,下面分别介绍它们的用途、常用方法以及适用场景。通过合理选择工具,可以在保证线程安全的同时,提升程序的性能和可维护性。的前提下,对代码的执行顺序进行重新排列的操作。→ 同步代码块保证原子性和可见性,隐含禁止重排序。→ 其他线程可能在对象未初始化完成时,拿到非空的。是计算机为了优化执行效率,在。→ 解决上述DCL单例问题。
2025-03-13 21:37:17
979
原创 Java自定义注解
它本身不执行任何操作,但可以为代码提供额外的信息(元数据),告诉编译器、运行时环境或第三方工具如何处理这段代码。通过反射,我们可以读取注解的内容,并根据注解信息执行相应的操作。定义好注解后,可以在代码中使用它。定义一个自定义注解就像定义一个特殊的“模板”,告诉Java这个注解可以包含哪些信息。假设我们要定义一个注解,用于标记某个方法的重要性,并记录开发者的姓名。我们可以通过反射读取上面定义的注解,并输出相关信息。元注解是用来修饰注解的注解,用于配置注解的行为。指定注解的生命周期,即注解在什么时候可用。
2025-03-12 21:19:40
1102
原创 设计模式-Java
定义了一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都会收到通知并自动更新。将一个类的接口转换成客户希望的另一个接口,使原本不兼容的类可以一起工作。将复杂对象的构建与其表示分离,使得同样的构建过程可以创建不同的表示。定义了一系列算法,并将每个算法封装起来,使它们可以互换。定义一个操作中的算法骨架,而将一些步骤延迟到子类中。确保一个类只有一个实例,并提供一个全局访问点。为某个对象提供一个代理,以控制对该对象的访问。提供一个创建一系列相关或依赖对象的接口。将对象的创建集中在一个工厂类中。
2025-02-19 16:32:46
983
原创 关于树的易混淆概念
我们需要遍历每一层,统计每层的节点数,并取其中的最大值作为树的最大宽度。换句话说,树的宽度并不关心某一层理论上最多可以放多少节点,而是关注当前层实际有多少节点。树的层数、高度、深度等概念是数据结构中非常重要的基础知识,但它们有时会让人感到混淆。因此,这棵树的最大宽度为。因此,这棵树的高度为。
2025-02-13 10:07:00
682
原创 面试准备——Java理论高级【笔试,面试的核心重点】
Java集合框架是面试中的重中之重,尤其是对ListSetMap的实现类及其底层原理的考察。HashMapequalsTreeMapnullnullFile API用于操作文件和目录,常见操作包括创建、删除、重命名、遍历等。
2025-02-09 20:37:20
1025
原创 面试准备——Java理论基础
抽象是指隐藏复杂的实现细节,只向外界暴露简单的接口。抽象类和接口是实现抽象的主要手段。抽象类不能被实例化,只能被继承;而接口则定义了一组方法,但不提供具体实现,由实现类提供具体的实现。好处简化复杂性:用户只需知道如何使用接口,无需了解内部实现。强制规范:确保所有实现类都遵循相同的接口标准。案例@Override@Override此外,Java还支持使用interface关键字定义接口,接口中的所有方法默认都是抽象的。接口示例@Override检查性异常。
2025-02-05 15:59:55
844
原创 面试准备——数据库(至少掌握Mysql,建议多刷一些查询数据的题)
用于向数据库表中插入新记录。案例:向employees表插入一名员工信息。:用于更新已存在的记录。案例:将名为’张三’的员工职位更新为’高级工程师’。:用于删除表中的记录。案例:删除名为’李四’的员工记录。:用于从数据库中选取数据。案例:查找所有工程师的姓名。
2025-02-05 14:35:56
658
原创 面试准备—— Linux [必备,主要掌握常用命令]
常用命令:查看 的组信息:2. 权限管理常用命令::修改文件权限(如 或 )。:修改文件所有者(如 )。:修改文件所属组。面试重点:案例:设置脚本为可执行、可读权限:这将为脚本文件添加可执行 () 和可读 () 权限。设置脚本为可执行、可写权限:这将为脚本文件添加可执行 () 和可写 () 权限。设置脚本为可执行、可读、可写权限:这将为脚本文件添加可执行 ()、可读 () 和可写 () 权限。使用数字模式设置权限:也可以使用数字模式来设置权限。每个权限对应一个数字:读 () =
2025-02-05 14:17:59
993
原创 SQL进阶——ON DUPLICATE KEY UPDATE
对应的数据如下所示:根据station_id和statistics_date的组合值判断是新增还是修改需要建立一个组合索引,且保证是唯一的!ON DUPLICATE KEY UPDATE的用法:(on duplicate key update)一般用来实现list的更新和新增。,一般唯一索引或者组合索引是不需要更新的,如上所示,station_id和statistics_date就不更新了。ON DUPLICATE KEY UPDATE后面跟。如果有一个集合/数组需要根据。
2025-01-29 13:39:01
452
原创 SQL进阶——with
WITH关键字用于定义 CTE,简化复杂查询。CTE 可以是普通的(非递归)或递归的。CTE 可以用于SELECTUPDATEDELETE等操作。递归 CTE 适合处理层次结构数据(如树形结构)。
2025-01-29 12:14:18
476
原创 SQL进阶——优化思路
表新增数据时,需要同时为它创建索引,而索引是需要额外的存储空间的,而且还会有一定的性能消耗。MySQL使用的B+树的结构来保存索引的,在insert、update和delete操作时,需要更新B+树索引。如果索引过多,会消耗很多额外的性能。但缺点是MySQL执行子查询时,需要创建临时表,查询完毕后,需要再删除这些临时表,有一些额外的性能消耗。并且如果没有命中索引,如果实现业务场景中需要查询出另外几张表中的数据,可以在a、b、c表中冗余专门的字段,比如:在表a中冗余d_name字段,保存需要查询出的数据。
2025-01-24 16:53:46
1011
原创 二叉树的前中后遍历--遍历逻辑
遍历方式查找规则访问顺序适用场景前序遍历根 -> 左 -> 右根节点 -> 左子树 -> 右子树复制树、序列化树中序遍历左 -> 根 -> 右左子树 -> 根节点 -> 右子树二叉搜索树的升序输出后序遍历左 -> 右 -> 根左子树 -> 右子树 -> 根节点删除树、计算表达式树前序遍历:先访问根节点,再访问左子树和右子树。中序遍历:先访问左子树,再访问根节点,最后访问右子树。后序遍历:先访问左子树和右子树,最后访问根节点。
2025-01-24 10:17:34
730
原创 IDEA插件分享--GenerateAllSetter
写CRUD经常会遇到大批字段的对象需要设置值或者获取值,手动写的效率有点低推荐安装GenerateAllSetter插件。
2025-01-17 11:57:55
291
原创 linux无网络安装telnet
注意:如果你的版本和我的不一样,需要改成你自己的包名称!这两个包,上传到需要安装的linux服务器上。输入telnet命令就可以了看装没装好了。去telnet官网下载。在安装包所在目录下执行。首先找台有外网的电脑。
2025-01-02 16:02:31
251
原创 Spring中有关于RocketMQ常用的操作类
用于发送普通消息。: 用于发送事务消息。: 用于发送顺序消息。: 用于接收推送的消息。: 用于主动拉取消息。: 用于顺序消费消息。: 用于简化消息的发送操作。: 用于简化 RocketMQ 消费者的配置。其中@RocketMQMessageListener和是需要同步使用的,它们通常一起配合使用来实现消息的消费。是一个注解,用于标记一个类为 RocketMQ 的消费者,而是一个接口,需要被消费者类实现,用于定义消息处理逻辑。
2024-12-22 11:27:23
940
原创 RocketMQ的安装运行(windows)
输入:start mqbroker.cmd -n 127.0.0.1:9876 autoCreateTopicEnable=true。进入bin目录,打开cmd命令窗口(文件夹路径中输入cmd,不然会报错)修改配置文件,配置mq地址(端口地址可根据需要修改)运行Application。
2024-12-22 10:52:41
2273
1
原创 关于RocketMQ的通俗理解
RocketMQ 是一个高性能、高可靠、高实时的消息中间件,主要用于在分布式系统中实现消息的异步传递。它的核心组件包括 NameServer、Broker、Producer 和 Consumer。NameServer(信息咨询台)作用:负责管理和调度消息的路由信息,提供服务注册与发现。类比:商场的信息咨询台,提供店铺位置和商品信息。Broker(店铺)作用:负责接收和存储消息,以及将消息分发给消费者。类比:商场内的店铺,接收和存储商品,供顾客购买。Producer(供货商)作用。
2024-12-20 16:02:32
615
1
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人