- 博客(78)
- 收藏
- 关注
原创 【字符串】第一篇 String、StringBuilder 与 StringBuffer详解
本文深入解析JDK 1.8中字符串处理类String、StringBuilder和StringBuffer的核心特性与使用场景。String类采用final char[]数组实现不可变性,适合作为常量使用,但频繁拼接会产生性能问题;StringBuilder基于可变char[]数组设计,支持高效字符串操作,单线程性能优越但不安全;StringBuffer通过同步方法保证线程安全。测试显示,StringBuilder在万次循环拼接中耗时仅3ms,远快于String的543ms。多线程场景下建议使用String
2025-08-14 11:24:54
604
原创 【基础】第八篇 Java 面向对象三大特性详解:封装、继承与多态
本文深入解析Java面向对象编程的三大特性:封装、继承与多态。封装通过访问控制保护数据安全,提供getter/setter方法实现安全访问;继承使用extends关键字实现代码复用和功能扩展,遵循单继承规则;多态通过方法重写和向上转型实现同一接口的不同行为表现。三者协同工作:封装是基础,继承形成层次结构,多态提升灵活性。文章通过代码示例和对比表格,清晰展示了三大特性的实现方式、核心作用及相互关系,为理解Java面向对象编程提供了系统性的指导。
2025-08-13 14:43:17
1271
原创 【2025最新版】Java基础知识学习路线图:从入门到精通的系统化指南
Java基础学习路线指南 本文系统梳理了Java学习的完整路径,从零基础到进阶实战共分为四个阶段: 筑基阶段(1-2周):环境搭建(JDK17+、IDEA)、基础语法(数据类型/运算符/流程控制)、实战练习(计算器/九九乘法表) 进阶阶段(3-4周):重点掌握面向对象三大特性(封装/继承/多态)、核心类库(字符串/集合/异常处理),通过代码示例理解抽象类与接口区别 深入阶段(4-5周):攻克多线程(创建/同步/线程池)、JVM(内存结构/GC算法)、高级特性(泛型/反射/Java8新特性) 实战阶段(2-3
2025-08-12 16:26:35
1556
原创 【基础】第五篇 Java 运算符、条件语句与循环语句详解
本文摘要: Java运算符、条件语句和循环是程序控制的核心。运算符包括算术运算符(+、-、*、/等)、关系运算符(==、>等)、逻辑运算符(&&、||等)和赋值运算符(=、+=等),用于数据运算和比较。条件语句(if-else、switch)实现分支逻辑,循环语句(for、while、do-while)用于重复执行代码块。文章通过实例演示了各类运算符的使用方法,并强调了注意事项,如整数除法截断、自增自减仅适用于变量、字符串比较需用equals()等。这些基础语法是Java编程的重要基石
2025-08-06 00:36:49
969
原创 【基础】第六篇 Java 位运算符详解:从基础到实战应用
本文全面解析Java位运算符的用法、特性及应用场景。位运算符直接对整数二进制位操作,效率极高,可分为按位逻辑运算符(&、|、^、~)和移位运算符(<<、>>、>>>)。按位与用于保留指定位/判断奇偶;按位或用于设置状态位;按位异或可实现交换变量/简单加密;按位非则是取反操作。移位运算符中,左移等价乘以2的幂,右移等价除以2的幂。这些运算符在底层编程、性能优化和特定业务场景中具有重要作用,是Java开发者需要掌握的高效工具。
2025-08-05 23:42:54
667
原创 【基础】第七篇 Java 类的定义、构造器、成员变量与方法详解
本文介绍了Java面向对象编程中类的核心概念,包括类的定义、成员变量、构造器和成员方法。类作为对象的模板,通过定义属性和行为来描述对象特征。成员变量分为实例变量和类变量,构造器用于初始化对象,成员方法则实现对象的行为逻辑。文章详细讲解了类的基本语法结构、访问修饰符的使用、构造器重载以及方法分类等内容,并提供了代码示例说明。这些知识点是掌握Java面向对象编程的基础,理解类与对象的关系对后续学习封装、继承和多态至关重要。
2025-08-05 11:42:29
584
原创 【基础】第一篇 Java 环境搭建超详细保姆教程(附常见问题解决)
本文详细介绍了Java开发环境的搭建步骤,包括JDK安装、环境变量配置和IDE选择。主要内容包括:1)JDK与JRE的区别,推荐下载LTS版本;2)Windows系统下JDK的安装流程;3)关键的环境变量配置方法(JAVA_HOME和Path);4)推荐使用IntelliJ IDEA或Eclipse作为开发工具;5)通过Hello World程序验证环境配置是否成功。文章还提供了常见问题解决方案,帮助初学者顺利完成Java开发环境的搭建。按照步骤操作即可解决90%的环境配置问题,为后续Java学习奠定基础。
2025-08-05 10:36:28
1432
原创 【五大联赛】 2025-2026赛季基本信息
2025-2026赛季欧洲五大联赛赛程公布:英超8月16日揭幕战利物浦vs伯恩茅斯,取消冬歇期但延长夏季休整;西甲8月16日开赛,国家德比首回合10月26日上演;意甲8月24日启程,米兰德比11月22日打响;德甲8月23日揭幕战拜仁vs莱比锡;法甲8月17日开赛。各联赛均优化赛程安排,英超调整比赛时间适应亚洲市场,西甲、德甲保留冬歇期。新赛季将呈现姆巴佩vs亚马尔等焦点对决,多支豪门进行阵容年轻化改革。
2025-08-04 15:33:09
6554
原创 【基础】第四篇 类型溢出原理详解
本文深入分析了Java基本数据类型的溢出机制。整数类型(byte、short、int、long)采用补码表示,溢出时会循环绕回取值范围另一端,如int最大值2147483647溢出后变为-2147483648。浮点类型遵循IEEE 754标准,溢出时产生特殊值(正/负无穷大)。字符类型char为无符号16位整数,溢出表现为数值循环。布尔类型boolean理论上不会溢出。文章通过二进制编码原理解释了不同类型溢出的本质差异,并提供了实际代码示例进行验证。理解这些溢出机制对编写健壮的Java程序至关重要。
2025-08-01 17:42:16
1218
原创 【德乙】 2025-2026赛季 球队实力分析
2025-2026赛季德乙联赛前瞻:柏林赫塔领跑争冠集团,沙尔克04深陷保级危机 新赛季德乙呈现三足鼎立格局:柏林赫塔凭借科纳茨基等强援加盟成为升级头号热门;波鸿虽主力流失但保留核心框架;汉诺威96豪掷1200万欧引援成最大变数。中游集团中荷尔斯泰因、杜塞尔多夫等队具备冲击附加赛实力,而传统劲旅沙尔克04受财政危机影响仅引进3人,保级形势最为严峻。降级区方面,升班马比勒菲尔德和德累斯顿迪纳摩面临严峻考验,布伦瑞克同样不容乐观。各队战术革新明显,柏林赫塔的3-4-1-2与凯泽斯劳滕的5-4-1形成鲜明对比,新
2025-08-01 10:24:15
3990
原创 【基础】第九篇 ==与equals 比较详解
Java中==与equals的区别 ==运算符用于基本数据类型时比较值是否相等,用于引用类型时比较内存地址是否相同。equals方法默认与==相同,但被重写后可用于比较对象内容是否相等。 关键区别: ==用于基本类型比较值,引用类型比较地址 equals默认比较地址,但可被重写为比较内容 字符串常量池机制会导致某些字符串比较的特殊情况 使用建议: 比较基本类型用== 比较对象内容用重写后的equals 字符串比较推荐使用equals 理解这些区别有助于避免Java开发中常见的比较错误。
2025-07-31 16:59:25
860
原创 【基础】第三篇 Java 包装类详解
Java封装类通过包装基本类型使其具备对象特性,实现了自动装箱/拆箱、空值处理、泛型支持等功能。8种基本类型对应不同封装类,其中数值类继承自Number,Character和Boolean继承自Object。自动转换机制本质是调用valueOf()和xxValue()方法,但需注意null值风险。封装类提供丰富的工具方法如字符串转换、字符判断等,并采用缓存机制优化常用值性能。与基本类型相比,封装类内存占用大且性能较低(测试显示20倍差距),但支持null值和泛型。最佳实践建议在性能敏感场景优先使用基本类型,
2025-07-24 17:38:57
840
原创 【基础】第二篇 Java 基本数据类型详解
Java基本数据类型是编程的基础,包括8种类型:整数类型(byte、short、int、long)、浮点类型(float、double)、字符类型(char)和布尔类型(boolean)。它们具有固定内存大小和取值范围,保证了跨平台一致性。整数类型适用于不同范围的整数值存储,其中int最常用;浮点类型处理小数;char表示单个字符;boolean存储逻辑值。理解这些类型的特点能提升代码效率并避免类型错误。
2025-07-24 11:40:41
890
原创 【并发】第九篇 Atomic原子操作类 - 字段更新器类详解
Atomic的字段更新器类是Java中一种用于实现线程安全的字段更新操作的类。它提供了一组原子操作,可以对字段进行原子性的更新。在并发环境中,多个线程同时更新一个字段可能会出现竞态条件(Race Condition)导致数据不一致的问题。Atomic的字段更新器类基于CAS(Compare And Swap)操作机制来保证对字段的原子操作,避免了竞态条件的发生。Atomic的字段更新器类的常用实现包括(原子更新整型的字段的更新器)、(原子更新长整型字段的更新器)、(原子更新引用类型里的字段)等。
2024-04-17 18:03:06
794
原创 【并发】第八篇 Atomic原子操作类 - 引用类型类详解
Atomic原子操作类是Java中提供的一组线程安全的基本数据类型操作类,可用于实现线程安全的并发编程。它们可以确保在并发环境下对变量进行原子操作,即不会被其他线程中断或同时修改。原子更新基本类型的 AtomicInteger,只能更新一个变量, 如果要原子更新多个变量,就需要使用这个原子更新引用类型提供的类,包括。注: 源码版本是基于JDK1.8 版本。
2024-04-17 16:33:43
1248
原创 【并发】第七篇 Atomic原子操作类 - 数组类型类详解
Atomic原子操作类是Java中提供的一组线程安全的基本数据类型操作类,可用于实现线程安全的并发编程。它们可以确保在并发环境下对变量进行原子操作,即不会被其他线程中断或同时修改。
2024-04-16 14:55:11
867
原创 【并发】第六篇 Atomic原子操作类 - 基本类型类详解
Atomic原子操作类是Java中提供的一组线程安全的基本数据类型操作类,可用于实现线程安全的并发编程。它们可以确保在并发环境下对变量进行原子操作,即不会被其他线程中断或同时修改。常用的基本类型类有AtomicLong和。
2024-04-15 16:39:03
1081
原创 【并发】 第五篇 原子操作(二) - CAS 详解
CAS是"比较并交换"(Compare and Swap)的缩写。是一种并发控制机制,用于实现多个线程同时对同一数据进行原子操作(读取、写入、更新),并且能够保证操作的一致性。# 1.比较:通过比较当前值和期望值是否一致来判断是否修改成功# 2.交换:如果一致则修改,否则重新尝试。CAS的一种常见应用是实现乐观锁。在乐观锁机制中,线程在更新共享变量之前先检查该变量是否被其他线程修改过,如果没有修改则更新,否则重新尝试。CAS操作正是基于这个原理来实现的。
2024-04-12 14:49:49
1143
原创 【并发】 第四篇 原子操作
此时,如果有其他线程也执行对该共享变量的值进行修改操作, 那么上述的三个步骤,就会受到其他线程的干扰,最终内存中的共享变量值可能就不是期望的结果。这是因为每个线程最开始从内存中获取的值, 有可能被其他线程修改了, 线程之间的数据是不同步的, 导致线程最后写入的值会被其他线程覆盖。上述的例子中,线程的操作会受到其他线程的干扰, 并非原子操作, 而使用原子操作即可解决上述现象。原子操作是指不能被中断的一组操作,要么全部执行成功,要么全部不执行,不会出现部分执行的情况。将上面的例子代码优化下,
2024-04-12 10:48:38
516
原创 【算法】第二篇 大衍数列
大衍数列,来源于《乾坤谱》中对易传“大衍之数五十”的推论。主要用于解释中国传统文化中的太极衍生原理。数列中的每一项,都代表太极衍生过程中,曾经经历过的两仪数量总和。是中华传统文化中隐藏着的世界数学史上第一道数列题。前10项为: 0、2、4、8、12、18、24、32、40、50……
2024-04-08 15:43:38
697
原创 【并发】第三篇 Hash冲突的解决方法
哈希(hash)是将任意长度的输入数据转化为固定长度的输出数据的算法。哈希函数会将输入数据压缩并映射为一个固定长度的哈希值,通常用一个字符串或数字来表示。哈希冲突是指两个不同的输入值在经过哈希函数计算后得到了相同的哈希值。由于哈希函数的输出长度是固定的,而输入的数据可能有无限多的可能性,所以哈希冲突是不可避免的。哈希冲突会引起一些问题,例如当使用哈希表进行数据存储时,如果有两个不同的键经过哈希函数计算得到了相同的哈希值,就会导致数据冲突,可能会导致数据丢失或覆盖。
2024-03-27 17:47:53
999
原创 【并发】第二篇 ThreadLocal详解
ThreadLocal 是 Java 中的一个类,它提供了线程局部变量的机制。线程局部变量是指每个线程都有自己独立的变量副本,线程之间互不影响。通常情况下,如果多个线程同时访问一个共享变量,需要进行同步来保证线程安全,如Synchronized。而使用 ThreadLocal 也可以避免线程安全问题,因为每个线程都拥有自己的变量副本,且可以独立地操作自己的变量副本,而不会影响其他线程的副本。线程之间的变量副本互不干扰,保证了线程安全。
2024-03-27 11:05:09
1106
原创 【并发】第一篇 引用类型详细介绍
Java中有四种引用类型,它们分别是强引用(Strong Reference),软引用(Soft Reference),弱引用(Weak Reference)和虚引用(Phantom Reference)。每种引用类型在Java垃圾回收过程中的行为和使用场景略有不同。
2024-03-21 00:03:23
1033
原创 【Spring Boot】第二篇 自动装配原来就这么简单
基于注解的Spring Boot的自动装配是Spring Boot框架中的一种特性,它允许开发者使用注解来简化和自动化应用程序的配置和装配过程。通过使用特定的注解,Spring Boot可以根据应用程序的依赖关系和配置来自动装配和配置一系列的Bean对象和组件。开发者只需要在相应的类或方法上添加特定的注解,Spring Boot就会根据这些注解的配置信息自动完成相应的初始化和装配工作。简单来说,就是解放开发者的双手, 一切的脏活累活直接交给Spring Boot来完成。
2024-02-08 11:41:27
1113
原创 【Spring Boot】第一篇 创建简单的Spring Boot项目
Spring Boot是一个用于构建独立的、生产级别的Spring应用程序的框架。它简化了Spring应用程序的创建和配置过程,同时提供了很多开箱即用的功能,包括自动配置、内嵌服务器等。通过Spring Boot,开发人员可以更快速地开发出高质量的Spring应用程序。
2024-02-06 15:57:07
1867
3
原创 【JVM】第五篇 垃圾收集器G1和ZGC详解
ZGC收集器能仅从引用上就明确得知一个对象是否处于重分配集之中,如果用户线程此时并发访问了位于重分配集中的对象,这次访问将会被预置的内存屏障(读屏障)所截获,然后立即根据Region上的转发表记录将访问转发到新复制的对象上,并同时修正更新该引用的值,使其直接指向新对象,ZGC将这种行为称为指针的“自愈”Self-Healing)能力。统一存储器存储结构,表示内存只有一块,所有的CPU都去访问这一块内存,会存在内存竞争,有竞争就会有锁的问题,有锁就会影响执行的效率,并且CPU核心数越多,竞争就会越激烈。
2023-09-27 17:19:46
1206
原创 【JVM】第四篇 垃圾收集器ParNew&CMS底层三色标记算法详解
当这一块的内存使用完后,就将还存活的对象复制到另一块去,然后再把使用的空间一次清理掉。的特点特出的一种标记算法,标记过程仍然与“标记-清除”算法一样,但后续步骤不是直接对可回收对象回收,而是让所有存活的对象向一端移动,然后直接清理掉端边界以外的内存。优缺点: 效率高,但是只能使用在年轻代,不能使用在老年代中,老年代中大多数的对象都是存活的,没有多余的担保空间来将内存一分为二。如老年代中对象的存活几率是非常高的,而且没有额外的空间进行分配担保,所以选择“标记-清除”或“标记-整理”算法进行垃圾收集。
2023-09-27 14:29:06
1031
原创 【JVM】第三篇 JVM对象创建与内存分配机制深度剖析
大量的对象被分配在Eden区,Eden区满了后会触发Minor GC,可能会有99%以上的对象成为垃圾被回收掉,剩余存活的对象会被挪到S0区,下一次Eden区满了后又会触发Minor GC,把Eden区和survivor区垃圾对象回收,把剩余存活的对象一次性挪动到S1区,因为新生代的对象都是朝生夕死的,存活时间很短,所以JVM默认的8:1:1的比例是很合适的,让Eden区尽量的大,Survivor区够用即可。JVM内存布局规定了Java在运行过程中的内存申请、分配、管理的策略,保证了JVM高效的运行。
2023-09-26 01:39:03
1131
原创 【JVM】第二篇 JVM内存模型深度剖析与优化
按照线程是否共享来划分TLAB线程本地分配缓存区,这是一个线程专用的内存分配区域由于对象一般会分配在堆上,而堆是全局共享的。因此在同一时间,可能会有多个线程在堆上申请空间。因此,每次对象分配都必须要进行同步,在竞争激烈的场合分配的效率又会进一步下降, JVM使用TLAB来避免多线程冲突,在给对象分配内存时,每个线程使用自己的TLAB,这样可以避免线程同步,提高了对象分配的效率JVM内存模型清晰版(结合代码分步解析)int a = 1;int b = 2;return c;
2023-09-24 23:03:32
763
原创 【面试篇】集合相关高频面试题
从上面的例子发现, 虽然HashCode的倒数第二第三位从0变成了1,但是运算的结果都是1001。因为HashMap的设计者认为后插入的元素, 被访问到的概率最大, 所以HashMap在使用链表解决hash冲突的元素时,采用了头插法, 这样每次访问链表时, 先判断头节点是否等于目标节点, 如果是,直接返回目标节点, 不需要再去遍历整个链表了, 提升了查询效率。来计算hash值, 将初始容量设置为16,能最大程度的将元素散列的分布在数组上, 且最大程度的减少hash冲突的产生, 符合Hash算法。
2023-09-20 01:31:13
362
原创 【Map篇】HashTable详解
快速查找:Hashtable中的键值对是通过哈希函数计算索引值得到的,因此可以快速地查找元素,时间复杂度为 O(1)。高效插入和删除:由于哈希表的键值对是通过哈希函数计算索引值得到的,所以在插入或删除元素时,只需要计算一次哈希值即可定位元素,因此插入和删除操作都非常快速,时间复杂度为 O(1)。空间利用率高:哈希表只需要存储键和值,不需要额外的空间来存储指向下一个元素的指针,因此空间利用率比较高。可扩展性。
2023-09-20 01:07:13
278
原创 【Map篇】HashMap详解
在 Java 中的 HashMap 是基于哈希表实现的,哈希表的核心是数组,而数组的大小是固定的。当我们往 HashMap 中添加元素时,如果当前位置已经有元素了,则会发生碰撞,这个时候 HashMap 会依据一定的规则将元素添加到数组的其他位置。如果想要提高 HashMap 的性能,就需要尽可能减少碰撞。一种有效的方式就是通过调整数组的大小,增加数组的容量,从而使得元素分布更加均匀,减少碰撞的发生。而为了在扩容后保持哈希表中原有元素的位置不变,HashMap 采用了重新哈希的方法来处理。
2023-09-19 18:10:38
459
原创 【List集合】第四篇 LinkedList 详解
本文介绍了Java中的LinkedList数据结构,重点分析了其实现原理、核心成员变量、构造方法以及增删操作。LinkedList基于双向链表实现,每个节点包含前驱、后继指针和数据项,支持高效的插入和删除操作(O(1)时间复杂度),但随机访问较慢(O(n))。文章详细解析了add()和remove()方法的内部实现,包括末尾添加、指定位置添加、节点删除等操作,并配以图示说明链表节点的连接关系变化。通过源码分析(JDK1.8),揭示了LinkedList如何通过修改指针实现元素的增删,同时维护链表长度和结构变
2023-09-17 23:56:18
576
原创 【List】第三篇 ArrayList 详解:从使用到源码深度剖析
ArrayList是Java集合框架中最常用的动态数组实现,基于数组结构支持随机访问,具有自动扩容特性。其核心特点包括动态扩展容量(默认初始容量10)、允许null值、非线程安全以及有序存储。源码分析显示,ArrayList通过elementData数组存储元素,size记录实际元素数量。构造方法支持无参初始化(首次扩容至10)、指定容量和基于集合创建。添加元素时,尾部插入直接赋值,时间复杂度O(1);指定位置插入需要移动元素,时间复杂度O(n)。扩容机制在空间不足时自动触发,通常扩容为原容量的1.5倍。A
2023-09-08 02:46:07
588
原创 【List】第二篇 使用Arrays.asList生成的List集合,操作add方法报错
摘要:开发人员遇到一个UnsupportedOperationException异常,原因是使用Arrays.asList()生成的List集合调用了add方法。经源码分析发现,Arrays.asList()返回的是其静态内部类ArrayList实例,该内部类未重写add方法且底层数组被final修饰,导致不可修改数据。解决方案是将Arrays.asList()结果作为参数传入new ArrayList<>()构造器,创建一个可修改的List。本文通过对比两种ArrayList实现差异,解释了异
2023-09-01 17:00:41
3361
原创 《MySQL》第十四篇 COUNT(*)和 COUNT(1)的区别
本文旨在介绍COUNT(*),COUNT(1),COUNT(col)三者之间区别和使用索引的情况,count() 函数是用来统计行数用的,以下内容均是个人实践模拟结果,仅供参考;
2023-08-03 11:17:35
265
原创 《MySQL》第十三篇 SELECT * 和 SELECT 字段名的区别
不同的写法,可以满足不同的场景。在实际应用中,需要根据具体情况选择合适的写法。如果需要查询所有字段,可以使用 SELECT *。如果需要精确控制查询的字段,可以使用 SELECT 字段。
2023-07-31 15:01:15
1658
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅