自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(34)
  • 收藏
  • 关注

原创 【多线程】并发安全

本文探讨了Java多线程编程中的线程安全问题及其解决方案。首先通过示例展示了多线程环境下共享变量修改结果不符合预期的情况,引出线程安全概念。分析了线程安全问题的三大原因:原子性、可见性和有序性,并重点解释了count++操作因非原子性导致的问题。针对原子性问题,介绍了synchronized关键字的加锁机制及其可重入特性;针对可见性问题,讲解了volatile关键字的作用与限制。最后详细讨论了死锁的形成条件及两种避免方法:打破持有并等待条件(改为串行加锁)和循环等待条件(统一加锁顺序)。

2025-12-13 16:00:44 1631 122

原创 【多线程】Thread 类中线程的状态

如果线程的状态是 TIMED_WAITING 或者 WAITING,就得考虑一下是不是代码中某个方法产生了线程等待且没有及时将线程显式唤醒;Java 为了能够调度操作系统的线程重新封装了一个专门用于管理线程调度的 Thread 类,同时也给线程的状态重新封装。如果线程的状态是 RUNNABLE,那说明线程本身没有问题,就得考虑一下是不是代码中的某些逻辑条件没有按预期触发。小编认为,理解线程状态 并 懂得查看和分析线程状态 是调试多线程程序的重要技能之一。3. 再看看线程的调用栈,找到出现问题的具体代码行。

2025-12-09 15:33:01 600 45

原创 【多线程】Thread类及常用方法

Thread 类对象是用来描述一个线程执行流的,每一个线程都有唯一的 Thread 类对象与之对应,而 JVM 会将这些 Thread 类对象组织起来用于线程调度和线程管理。在上面的代码中,我们通过创建继承Thread类的子类MyThread来创建一个线程并运行,与此同时,main方法中的主线程也在运行,这就形成了一个“并发”执行的多线程程序。非后台线程其实就是我们所创建的线程(包括主线程),而后台线程则是 JVM 在执行进程时的一些自带线程,当进程结束(非后台线程全部结束),后台进程也就结束了。

2025-12-08 17:32:33 1006 30

原创 【多线程】进程和线程的区别与联系

进程是操作系统对正在运行的程序的一种抽象,也可以说进程就是程序的一次运行过程。进程是操作系统资源分配的基本单位。

2025-11-25 15:48:22 1116 63

原创 【优选算法】双指针算法

常见的双指针有两种形式:对撞指针和快慢指针。这道题目的特点是数组分块,因此以后我们刷题时遇到类似题目时,可以采用此题的算法思路结合题目具体细节来解决问题。这道题目需要转变一下思路,既然从前往后行不通,那就从后往前。其原因就是按原来的方法会有数据被覆盖,因此当以后遇到类似的题目,我们可以采用这道题目的思路。本题的特点是出现循环、重复某个操作,因此采用快慢指针的方法来解决,以后遇到此类相似问题,我们也可以采用这种算法思路来解决。这道题目使用对撞指针。

2025-11-24 11:43:27 1399 48

原创 【MySQL数据库】数据库基础

数据库技术主要是用来解决数据处理的非数值计算问题。数据处理的主要内容是数据的存储、查询、修改、排序和统计等。关系型数据库是指采用了关系模型来组织数据的数据库,以行和列的形式存储数据。关系模型可以简单理解为二维表格模型,而⼀个关系型数据库就是由二维表及其之间的关系组成的一个数据组织。每个表中的每一条记录称为一行数据,每⼀个数据行由一个或多个列组成SQL(Structured Query Language)是结构化查询语言。

2025-11-24 10:52:13 1071 48

原创 [Java数据结构和算法] HashMap 和 HashSet

该构造方法将指定的原来默认的载荷因子改成传入的指定载荷因子,然后将传入的指定数组长度改成2的幂次(比如传入的指定长度为10,返回的值是16,因为16是2的4次方)由于哈希表的 插入/查找/删除 操作的时间复杂度均为 O(1),因此 HashMap 和 HashSet 相关操作的时间复杂度也是O(1)。可见该方法内部调用的是带有两个参数的构造方法(一个是传入的指定长度值,一个是默认的载荷因子)所创建的HashMap中将包含所传入的Map中的所有元素。它的四个构造方法都是通过 HashMap 来实现的。

2025-10-23 22:03:37 724 24

原创 [Java数据结构与算法] 哈希表(Hash Table)

首先对关键码集合用散列函数计算散列地址,具有相同地址的关键码归于同一子集合,每一个子集合称为一个桶,各个桶中的元素通过一个单链表链接起来,各链表的头结点存储在哈希表中。使用哈希桶能够有效解决数据存放的冲突问题,但是如果冲突严重,估计小集合的效率也会不尽人意,此时可以对小集合进行转化,如每一个桶的底层是一个哈希表 / 搜索树。虽然哈希表一直在和冲突做斗争,但在实际使用过程中,我们认为哈希表的冲突率是不高的,冲突个数是可控的。由于哈希表底层的空间大小往往是小于所要存储的数据的容量大小的,因此,

2025-10-23 19:41:15 1001 27

原创 [Java数据结构和算法] 详解 TreeMap 和 TreeSet

TreeMap 和 TreeSet 是Java 中利用红黑树实现的 Map 和 Set。其实质是一棵近似平衡的二叉搜索树,即在二叉搜索树的基础之上加了颜色以及一些性质。TreeMap 是以红黑树为底层结构、基于比较的 Map。若调用构造方法时不指定比较器,系统默认以Key来进行比较;若传入比较器则会根据传入的比较器来进行比较。需要注意的是,TreeMap 的排序,无论是否提供了自定义比较器,都必须与 equals 方法保持一致。

2025-10-22 16:46:25 541 6

原创 [Java数据结构与算法] 二叉搜索树(BinarySearchTree)

从 cur 的左树找最右边的结点 / 右树找最左边的结点 (我们称之为 target,其上一个节点为 targetPrev)来替换 cur.val。若 cur 是 prev 的右树,就把 cur.right 给 prev.right;若 cur 是 prev 的左树,就把 cur.right 给 prev.left;若 cur 是 prev 的右树,就把 cur.left 给 prev.right;若 cur 是 prev 的左树,就把 cur.left 给 prev.left;

2025-10-22 13:31:47 1020 8

原创 [Java数据结构与算法] 详解Map和Set接口

Map 和 Set 是一种的容器或数据结构,其搜索的效率与其具体的实例化子类有关。Map 和 Set 通常用在动态查找的情况(在查找的同时进行插入或删除操作)。

2025-10-21 16:06:16 1176 12

原创 [Java数据结构与算法]详解排序算法

排序是将一串记录按照某个或某些关键字的大小,递增或递减排列起来的操作。简单来说,就是将一组无序的数据变成有序的过程。

2025-10-20 15:15:07 1259 17

原创 [Java数据结构与算法]深入理解优先级队列与堆

优先级队列是一种抽象数据类型,它支持以下两个基本操作:插入(Insert):添加一个带有优先级的元素提取最高优先级(Extract-Max/Min):移除并返回优先级最高或最低的元素与普通队列相比,优先级队列的出队顺序不是由元素的入队时间决定,而是由元素的优先级决定。堆是一种特殊的完全二叉树,它满足以下性质:对于大根堆:每个节点的值都大于或等于其子节点的值对于小根堆:每个节点的值都小于或等于其子节点的值比如一组数据:27,15,19,18,28,34,65,49,25,37。

2025-10-05 10:41:04 1139 25

原创 [Java数据结构与算法]深入理解二叉树

树是一种非线性的数据结构,由 n(n>=0)个有限节点组成的一个具有层次关系的集合。它看起来像一个倒挂的树,根在上叶子朝下。树具有以下特点:树是递归定义的,子树之间不能有交集除了根节点外,每个节点有且仅有一个父节点一棵 N 个结点的树共有 N-1 条边二叉树是结点的一个有限集合,该集合要么为空要么由一个根节点加上两棵别称为左子树和右子树的二叉树组成。特点是:二叉树中不存在度大于2的结点,即每一个节点都有两棵子树二叉树的子树有左右之分,次序不能颠倒,因此二叉树是有序树。

2025-09-26 20:29:06 1191 18

原创 [Java数据结构与算法]深入理解栈与队列

栈遵循FILO原则,适合用于需要"回溯"的场景,如函数调用、括号匹配、深度优先搜索等队列遵循FIFO原则,适合用于需要"排队"的场景,如广度优先搜索、消息队列、任务调度等双端队列结合了栈和队列的特性,提供了更灵活的操作方式在实际开发中,应根据具体需求选择合适的数据结构,或者组合使用多种数据结构解决问题掌握这些基础数据结构不仅有助于解决算法问题,也能为理解更复杂的系统设计打下坚实基础。相信读者朋友看到这里已经能够掌握栈和队列的基本操作了 ~完。

2025-09-15 20:37:04 974 25

原创 [Java数据结构与算法]经典链表面试题详解

【代码】经典链表面试题详解——从原理到实战。

2025-09-11 16:20:20 1251 11

原创 [Java数据结构与算法]模拟实现链表

在实现双向链表的方法前,我们先定义一个 MyLinkedList类,然后将结点类 ListNode作为内部类;链表是一种物理存储结构上非连续的存储结构,数据元素的逻辑顺序是通过链表中的引用链接次序实现的。与顺序表不同的是,链表在内存中的存储不是连续的,因此十分依赖next域找到下一个节点。因此,在插入/删除元素频繁的情况下,ArrayList并不适合,这就需要链表。display方法的实现十分简单,我们只需要遍历链表就可以做到。至此,链表的模拟实现已经完成啦 ~ 恭喜你!

2025-09-10 16:34:01 1247 9

原创 [Java数据结构与算法]ArrayList详解与实际应用

目录一、ArrayList 简介二、ArrayList的基本使用2.1 构造方法2.2 常用方法2.3 遍历方式三、ArrayList的扩容机制3.1 扩容流程源码分析3.2 扩容性能分析四、ArrayList的实践应用4.1 杨辉三角4.2 扑克洗牌ArrayList是Java集合框架中的一个重要类,位于java.util包中。它实现了List接口,底层基于数组实现,可以根据需要动态扩容。ArrayList的特点:2.2 常用方法ArrayList提供了丰富的方法来操作元素:使用示例:2.

2025-09-09 20:20:52 987 5

原创 [Java数据结构与算法]顺序表详解—模拟实现顺序表

顺序表是用一段物理地址连续的存储单元依次存储数据元素的线性结构,一般情况下采用数组存储。顺序表在内存中占用连续的空间,这使得它能够通过下标直接访问元素,时间复杂度为O(1)。默认在末尾增加元素在下标为pos的元素前增加判断是否含有某个元素查找某个元素的对应下标获取下标为pos的值将下标为pos的元素设置为data删除第一次出现的data获取顺序表的长度清除顺序表打印顺序表。

2025-09-09 11:50:52 1099 8

原创 [Java数据结构与算法]时间和空间复杂度详解

客观评价算法效率,不受具体硬件环境影响预测算法在不同规模输入下的性能表现在算法设计中做出合理的权衡决策为算法优化提供方向和目标掌握复杂度分析不仅有助于编写高效代码,也是技术面试中必备的技能。通过理解各种常见算法的复杂度特征,我们能够更好地选择和应用合适的算法解决实际问题。完。

2025-09-08 19:14:18 893 7

原创 JavaSE——String类

String怎么进行比较呢?由于String类属于引用类型的数据,相当于C语言的指针,它存放的是地址,所以需要用其他方式来进行比较。假如要比较str1和str2,调用形式是:str1.compareTo(str2),返回值则是 str1 - str2 的结果。注意,字符串类型是不可变类型,因此所有的替换操作均是在新建的对象上进行修改的,而非在原字符串上进行替换。字符串的查找方法有两种:indexOf 和 lastIndexOf。由于String类数据是引用类型,存放是地址,所以。

2025-09-03 14:45:34 365 2

原创 JavaSE——抽象类

普通的子类实例化的时候调用的成员方法或变量可能是父类的,但是编译器不会告诉你,自己也很难发现。因此,为了预防错误把父类改成抽象类,这样误调父类的成员时编译器就会报错了。我们通常用抽象类来表示难以被具体描述的事物,比如图形、天气等等抽象的事物。我们知道,在Java中,一切物质均由类来描绘。使用abstract修饰一个类,这个类就是抽象类。

2025-09-02 19:44:04 214 1

原创 JavaSE——多态

前文中我们讲到子父类的继承,今天我们讲讲继承中的一个应用——多态。

2025-09-02 15:23:44 201 1

原创 JavaSE——继承

继承机制是面向对象程序设计中使代码能够重复使用的重要手段,它允许程序员在保持原有类特性的基础上,进行扩展、增加新功能,由此产生的类,称为派生类。继承呈现了面向对象程序设计的层次结构,体现了由简单到复杂的认知过程。

2025-09-02 14:16:58 404 3

原创 JavaSE——方法

方法在Java中的存在相当于C语言中的函数。用于实现特定的功能。定义格式:修饰符 返回值 方法名 (参数类型 形参){方法体......返回值//修饰符含有static时,表示该方法是类方法,不需要对象可以直接调用该方法。调用方法 swap 可以发现,两次打印 a 和 b 的值都是一样的,说明 swap 方法没有成功将两数的值进行交换,从而证明了改变形式参数并不能够影响实际参数的值。解决方法:只需要将形参和实参的类型换成即可,如数组。

2025-08-28 12:43:05 235 2

原创 JavaSE——数据类型及运算符

四则运算符(+ - * / %),增量运算符(+= -= *= /= %=),自增/自减运算符(++ --)。两个运算符是二元运算符,必须有两个表达式;是一元运算符,只需要一个操作数即可。当表达式1的值为true时,整个表达式的值是表达式2,否则是表达式3。,它们的运算结果均是布尔值true或false。在这里我们只需要掌握字符串和基本数据类型的相互转换就可以了。,且全部都是二元运算符,都是按照二进制位运算的。在Java中,字符串是一种。是一元运算符,其余都是二元运算符。

2025-08-21 15:32:20 636 3

原创 JavaSE——类与对象(2)

在文件的最上方加上一个package语句指定该代码在哪个包中包名需要尽量指定成唯一的名字,通常会用公司的域名的颠倒形式包名要和代码路径相匹配例如创建的包那么会存在一个对应的路径来存储代码如果一个类没有package语句则该类被放到一个默认包中。

2025-08-09 09:16:25 1036 4

原创 JavaSE——类与对象(1)

Java是一门纯面向对象的语言。在面向对象的世界里,一切皆为对象。面向对象是解决问题的一种思想,主要依靠对象之间的交互完成一件事情。类是用来对一个对象(实体)进行描述的,主要描述该对象所具有的属性。在java中,定义类时要用到关键字class//字段(属性)或成员变量//行为或成员方法class是定义类的关键字,Dog是类的名字,{ } 中是类的主体。属性是用来描述类的,称之为类的成员属性或类成员变量。方法主要说明类具有哪些功能,称为类的方法。类名采用大驼峰定义成员前写法统一为。

2025-08-02 10:04:44 550 9

原创 C语言循环语句

C语言提供了三个循环语句供程序员们使用,它们分别是:while语句,for语句和do...while语句。

2025-06-08 20:39:26 1632 1

原创 C语言一些基础概念(2)

在C语言中,字符由单引号括起,如 'a' ,'@','~' 等等都是字符。在计算机中,数据是以二进制形式存储的,同样道理,字符也是以二进制的形式存储的。美国国家标准学会(ANSI)出台了⼀个,C 语言中的字符就遵循了 ASCII 编码的方式,共有128个字符。不需要将整张表格倒背如流,只需记住以下的常用字符就行:字符 A~Z 的ASCII码值是 65~90字符 a~z 的ASCII码值是 97~122。

2025-05-09 20:03:29 820 16

原创 C语言一些基础概念(1)

上面例子我们打印的是一个常量字符串,也就是不会改变的字符串,printf 函数还可以打印变量并且C语言中还有其他数据类型也可以被打印出来,如:整型变量、浮点型变量、字符变量...C语言执行开始后,第一个执行的就是main函数,也可以说,main函数是整个程序的入口,并且每一个程序都只有一个main函数。这是C语言最基本的程序框架,如果以上描述你看得云里雾里,不要紧,只需要把图片中的内容当成模板来记忆就行了。以上代码中,printf 后面的括号中代表该函数的参数,是一个字符串(用双引号括起来的一串字符)。

2025-05-08 21:51:02 690

原创 C语言分支语句(3)

switch语句会根据 表达式 的不同值执行相应的case分支;switch语句是一种特殊形式的 if...else... 语句,用于判断条件有多种结果的情况。它把多重的 else...if... 改成更易用、可读性更好的形式。7除以3本来余数是1,但是多了 “余数是2” 的打印。练习:输入任意⼀个整数值,计算除3之后的余数。输入⼀个1~7的数字,打印对应的星期。输入1~5,输出的是“工作日”;输入:1 输出:星期⼀。输入:2 输出:星期⼆。输入:3 输出:星期三。输入:5 输出:星期五。

2025-04-19 21:41:18 360 1

原创 C语言分支语句(2)

这个代码中 if 语句的表达式本意是 ‘x == 3’ ,即想要判断变量x的值是否为3,但是误写成了赋值操作 ‘x = 3’。我们知道,(双目)逻辑运算符的运算顺序都是自左向右的,那么当左边的表达式的值已经可以确定整个表达式的值,那么就不会再对右边的表达式求值,即把右边的表达式短路,这种情况就是短路现象。我们所想要表达的,是变量 j 的值在变量 i 和 k 的值之间,但是C语言不会认为是这样。上面的示例中,多个关系表达式的连用是符合语法的,但是执行后得到的结果不一定是我们所期望的。

2025-04-19 20:57:17 1660 3

原创 C语言分支语句(1)

顺序结构分支结构和循环结构,本节就来讲讲分支和循环结构。

2025-04-12 20:59:14 1825 2

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除