- 博客(46)
- 收藏
- 关注
原创 JavaEE初阶——《多线程--. 多线程带来的的⻛险-线程安全 (重点)》
摘要:本文通过Java代码示例演示了多线程环境下的线程不安全问题。当两个线程同时对静态变量count进行自增操作时,由于线程调度随机性和非原子性操作,最终结果往往小于预期值10万。文章分析了线程不安全的三大原因:1)线程随机调度;2)非原子性操作(如count++包含三个步骤);3)内存可见性问题(工作内存与主内存同步延迟)。最后通过synchronized同步锁机制解决了该问题,确保count++操作的原子性,使多线程执行结果符合预期。文章还简要提及了指令重排序对多线程的影响。
2026-03-27 21:30:00
387
原创 JavaEE初阶——《多线程--线程的状态》
本文介绍了Java线程的六种状态及其转换关系。线程状态包括NEW(新建)、RUNNABLE(可运行)、BLOCKED(阻塞)、WAITING(等待)、TIMED_WAITING(限时等待)和TERMINATED(终止)。通过代码示例展示了状态转换过程:NEW状态通过start()转为RUNNABLE,RUNNABLE在完成任务后转为TERMINATED;使用synchronized和wait()方法演示了BLOCKED和WAITING状态的转换,而sleep()方法则产生TIMED_WAITING状态。BL
2026-03-27 15:24:00
212
原创 JavaEE初阶——《多线程--Thread 类及常⻅⽅法》
本文介绍了Java中Thread类的核心概念和常用方法。Thread类是JVM管理线程的基础,每个线程对应唯一的Thread对象。文章详细讲解了Thread的构造方法、常见属性(如ID、名称、状态等)以及关键操作:1) start()启动线程;2) 两种中断线程的方式(共享标记和interrupt()方法);3) join()等待线程结束;4) currentThread()获取当前线程;5) sleep()休眠线程。通过代码示例演示了线程创建、中断处理及线程同步等典型用法,帮助理解多线程编程的基本原理和实
2026-03-26 17:18:16
636
3
原创 JavaEE初阶——《多线程--认识线程(Thread)》
摘要:本文介绍了线程的基本概念及其在Java中的应用。线程是独立的执行流,能够实现并发编程,提高CPU资源利用率。相比进程,线程更轻量且共享内存空间。Java提供了Thread类和Runnable接口两种创建线程的方式,以及匿名内部类、lambda表达式等变形写法。通过代码示例展示了多线程相比串行执行在速度上的优势,说明合理使用多线程能有效提升程序运行效率。文章还解释了进程与线程的区别,以及Java线程与操作系统线程的关系。
2026-03-25 22:42:32
311
原创 JavaEE初阶——《计算机是如何工作的》
一、计算机发展史一、计算机发展史计算的需求在⼈类的历史中是⼴泛存在的,发展⼤体经历了从⼀般计算⼯具到机械计算机到⽬前的电⼦计算机的发展历程。⼈类对计算的需求,驱动我们不断的发明、改善计算机。⽬前这个时代是“电⼦计算机”的时代,发展的潮流是:更快速、更稳定、更微型。计算机的以后将如何发展,期待⼤家的努⼒。1.冯诺依曼体系(Von Neumann Architecture)现代的计算机, ⼤多遵守 冯诺依曼体系结构: 进⾏算术运算和逻辑判断.: 分为外存和内存, ⽤于存储数据(使⽤⼆进制⽅式存储)
2026-03-24 18:35:04
550
原创 MySQL数据库《基础篇--数据库JDBC编程》
摘要:JDBC是Java连接数据库的标准API,提供了执行SQL语句的接口。主要功能包括建立数据库连接、发送SQL和处理结果。JDBC适用于各种Java应用场景,从桌面程序到Web项目,是ORM框架的底层实现。使用流程包含6个步骤:加载驱动、建立连接、创建执行对象、执行SQL、处理结果和关闭资源。推荐使用PreparedStatement防止SQL注入,并采用DataSource获取连接。JDBC核心接口包括DriverManager、Connection、Statement/PreparedStateme
2026-03-24 17:41:31
367
原创 MySQL数据库《基础篇--数据库事务》
事务是数据库中将一组SQL语句打包执行的机制,确保要么全部成功要么全部失败。文章以银行转账为例,详细介绍了事务的ACID特性:原子性(Atomicity)、一致性(Consistency)、隔离性(Isolation)和持久性(Durability)。同时说明了MySQL中事务的使用方法,包括开始、提交、回滚等操作,以及如何设置保存点和调整自动提交模式。此外,文章还探讨了四种事务隔离级别(读未提交、读已提交、可重复读和串行化)及其可能引发的并发问题,如脏读等。最后指出不同隔离级别在性能与安全性之间的权衡,I
2026-03-14 21:15:00
723
原创 MySQL数据库《基础篇--数据库索引(2)》
MySQL索引优化与使用指南 摘要: 本文系统介绍了MySQL中B+树索引的工作原理及应用。三层B+树可支持约2200万条记录的高效查询(仅需3次IO)。详细解析了主键索引(聚簇索引)、普通索引、唯一索引、全文索引等类型的特点与创建方法,特别说明了聚集索引与非聚集索引的区别。文章还提供了索引的创建、查看和删除操作指南,并强调了索引覆盖的优势。最后指出索引使用注意事项:应针对高频查询列创建,但需权衡存储开销和DML操作性能影响,避免过度索引导致性能下降。
2026-03-14 15:20:57
358
原创 MySQL数据库《基础篇--数据库索引(1)》
MySQL索引是提高数据查询效率的关键数据结构,类似于书籍目录。MySQL采用B+树作为索引结构,因其支持范围查找、性能均衡且能有效减少磁盘IO。索引存储在16KB的页中,页是磁盘与内存交互的最小单元,通过页目录实现二分查找提升查询效率。页内数据行组成单向链表,页间通过双向链表连接,结合局部性原理优化性能。B+树的非叶子节点仅作索引,所有数据存储在叶子节点并形成有序链表,便于区间查找。这种设计显著提升了数据库查询速度,尤其适合高频率查询场景。
2026-03-11 18:13:04
319
原创 MySQL数据库《基础篇--数据库的联合查询》
本文介绍了数据库联合查询的原理与应用。联合查询用于从多个表中获取完整数据,MySQL执行过程包括:选择驱动表、遍历匹配、合并结果等步骤。文章详细讲解了内连接和外连接的语法与实例,包括查询学生成绩、班级信息等场景。通过创建班级、学生、课程、成绩四个示例表,演示了具体查询方法,如查询特定学生信息、计算总成绩等。同时指出外连接分为左连接和右连接,并给出查询未考试学生和空班级的实例。最后强调多表查询需注意临时表大小问题。
2026-03-01 18:38:35
546
原创 MySQL数据库《基础篇--数据库设计》
数据库范式是关系型数据库设计的规范要求,主要包括1NF至5NF六个等级。1NF要求列不可再分,2NF消除部分函数依赖,3NF消除传递依赖。高范式虽减少冗余,但可能影响性能,通常满足3NF即可。E-R图用于描述实体间关系,包含实体、属性和联系三要素,联系类型包括1:1、1:N和M:N。多对多关系需通过中间表实现。数据库设计过程包括抽象概念类、确定实体关系、绘制E-R图和创建数据库。合理应用范式能避免数据冗余和操作异常,确保数据一致性。
2026-03-01 10:44:09
608
原创 MySQL数据库《基础篇--数据库约束(2)》
本文介绍了MySQL中的两种重要约束机制:外键约束和CHECK约束。外键约束用于维护主表和从表之间的数据完整性,确保从表的外键值必须存在于主表的主键或唯一列中。文章通过学生表和班级表示例,演示了外键约束的创建、数据插入限制以及表删除顺序要求。CHECK约束用于限制列值的范围,文章展示了如何设置年龄、性别等字段的检查条件,以及如何在列间进行比较约束。这两种约束机制都能有效保证数据库数据的准确性和一致性。
2026-02-27 23:45:00
57
原创 MySQL数据库《基础篇--数据库约束(1)》
数据库约束是用于确保数据准确性和可靠性的规则,主要包括六种类型:非空约束(NOT NULL)要求列值不能为空;默认约束(DEFAULT)为未赋值的列提供默认值;唯一约束(UNIQUE)保证列值不重复;主键约束(PRIMARY KEY)结合非空和唯一性,通常设为自增;外键约束(FOREIGN KEY)维护表间关系;检查约束(CHECK)限制数据范围。通过示例展示了如何为学号设置唯一约束、为ID设置自增主键等实际应用,这些约束能有效防止数据错误,保证数据库完整性。
2026-02-27 18:27:26
522
原创 MySQL数据库《基础篇--表的增删改查操作CRUD(3)》
本文介绍了MySQL中GROUPBY分组查询、HAVING子句和常用内置函数的使用方法。主要内容包括: GROUPBY分组查询语法及示例,用于按指定列分组并计算聚合值; HAVING子句与WHERE的区别,HAVING用于过滤分组结果; 常用内置函数分类及用法: 日期函数:NOW()、DATE_FORMAT()、DATEDIFF()等 字符串函数:CONCAT()、SUBSTRING()、REPLACE()等 数学函数:ROUND()、RAND()、ABS()等 其他函数:IFNULL()、IF()、CAS
2026-02-25 15:21:11
333
原创 MySQL数据库《基础篇--表的增删改查操作CRUD(2)》
本文介绍了SQL中的分页查询、数据更新、删除操作、截断表、插入查询结果和聚合函数等核心功能。分页查询可通过LIMIT实现不同页码的数据筛选;UPDATE支持条件性修改数据,DELETE可删除指定记录;TRUNCATE能快速清空表并重置自增列。文章还演示了如何将查询结果插入新表,以及常用聚合函数(COUNT/SUM/AVG/MAX/MIN)的使用方法,包括与GROUP BY和HAVING的配合使用。特别强调了这些操作中的注意事项,如不加WHERE条件的UPDATE/DELETE会全表操作、TRUNCATE不可
2026-02-25 13:42:18
1064
原创 MySQL数据库《基础篇--表的增删改查操作CRUD(1)》
本文介绍了MySQL数据库操作中的创建(Create)和查询(Retrieve)操作。创建部分详细讲解了INSERT语句的语法和使用方法,包括全列插入、指定列插入和多行插入。查询部分重点介绍了SELECT语句的各种用法,包括全列查询、指定列查询、表达式查询、别名设置和结果去重。此外还详细讲解了WHERE条件查询中的比较运算符和逻辑运算符使用,以及ORDER BY排序功能,包括升序降序排列和多列排序规则。文章通过学生考试成绩表的实际案例,演示了各种查询条件组合和排序方式的应用。
2026-02-25 10:36:49
541
原创 MySQL数据库《基础篇--表的操作》
本文介绍了MySQL数据库表的基本操作,包括查看所有表、创建表、查看表结构、修改表和删除表。创建表时需指定字段名、数据类型、约束条件等,并可选存储引擎和字符集;查看表结构使用DESC命令;修改表可通过ALTER TABLE实现添加、修改、删除列或重命名表;删除表使用DROP TABLE语句,需谨慎操作以防数据丢失。文章通过具体SQL示例展示了各项操作的实际应用,为数据库管理提供了实用指南。
2026-02-15 17:00:59
277
原创 MySQL数据库《基础篇--库的操作和数据类型》
本文摘要: MySQL数据库基础操作与数据类型详解 一、数据库操作 查看数据库:SHOW DATABASES; 创建数据库:CREATE DATABASE语法详解,包含字符集、校验规则等选项 修改数据库:ALTER DATABASE语法及示例 删除数据库:DROP DATABASE及注意事项 二、数据类型 主要分类:数值、字符串、二进制、日期、JSON等 关键特性对比: CHAR与VARCHAR的区别 TIMESTAMP的时区特性 DECIMAL的高精度优势 使用建议:根据实际场景选择合适类型,如状态值用T
2026-02-15 15:43:47
707
1
原创 MySQL数据库《基础篇--了解数据库》
数据库是用于结构化存储和管理数据的技术,具有持久化、完整性、并发控制等优势。主流数据库分为关系型(如MySQL、Oracle)和非关系型(如Redis、MongoDB)。关系型数据库采用二维表结构组织数据。MySQL是最常用的关系型数据库之一,采用C/S架构通信。SQL是操作数据库的标准语言,分为DDL、DML和DCL三类。存储引擎是MySQL底层组件,InnoDB是默认引擎,支持事务和行级锁,适用于大多数场景;MyISAM和MEMORY则适用于特定需求。
2026-02-13 14:57:13
607
原创 java数据结构当中的《Lambda表达式》
摘要 Lambda表达式是Java 8引入的语法糖,用于简化函数式接口的实现。其核心语法为(参数)->表达式或(参数)->{代码块},由参数列表、箭头符号和方法体三部分组成。Lambda必须配合函数式接口(仅含一个抽象方法的接口)使用,常见于集合操作和线程创建场景。与传统匿名内部类相比,Lambda能显著减少冗余代码,例如用()->System.out.println()替代多行的Runnable实现。在集合操作中,Lambda常与Stream API结合,实现过滤、映射、遍历等操作。开发
2026-02-12 16:30:00
723
原创 java数据结构当中的《枚举》
Java枚举是一种特殊数据类型,用于定义一组固定命名的常量集合,比普通常量更安全清晰。基础枚举定义简单常量(如四季),本质是Enum的子类,提供values()、ordinal()等方法。进阶枚举可添加属性、构造方法和自定义方法(如订单状态带描述和状态码),通过私有构造确保不可变性。相比int常量,枚举具有类型安全、语义明确、内置方法和可扩展等优势,是替代魔法值和常量类的首选方案,能有效提升代码可读性和安全性。
2026-02-12 09:56:02
388
原创 java数据结构当中的《反射》
Java反射机制是在运行时动态获取类信息和操作对象的能力,主要包括获取类结构、创建对象、访问属性和调用方法等功能。反射通过Class类作为入口,提供了三种获取Class对象的方式,并能突破private限制访问私有成员。其核心应用在框架开发(如Spring、MyBatis)、动态代理和工具类实现中。虽然反射具有强大的灵活性,但也存在性能开销和安全隐患等缺点。作为Java高级特性,反射是实现动态编程的基础,但在日常开发中应谨慎使用。理解反射机制有助于掌握主流框架的底层原理。
2026-02-10 20:57:21
720
原创 java数据结构当中的《Map和Set》(二)
哈希表是一种通过哈希函数将键映射到数组索引的高效数据结构,其核心挑战是哈希冲突。冲突无法完全避免,但可通过优化哈希函数(如扰动函数)和调节负载因子(默认0.75)来降低概率。主流解决冲突的方法是开散列(链地址法),即数组每个索引对应链表或红黑树,Java HashMap即采用此方式,并在链表过长时转为红黑树提升性能。其他优化手段包括扩容、数组长度取质数或2的幂等。哈希表性能取决于哈希函数均匀性、负载因子和冲突解决方式。Java中自定义类作为键需重写hashCode和equals方法。
2026-02-10 20:04:05
604
原创 java数据结构当中的《Map和Set》(一)
二叉搜索树是一种高效的数据结构,具有左小右大的特性,支持查找、插入和删除操作。查找时间复杂度与树深度相关,最优为O(logN),最差为O(N)。Java中的TreeMap和TreeSet基于红黑树实现。Map存储键值对,Set只存储键,适用于动态查找场景。Map接口中的Map.Entry表示键值对关系,是Map的基本存储单元。
2026-02-07 19:56:37
412
原创 java数据结构当中的《排序》(二 )
本文介绍了两种常见的排序算法:交换排序和归并排序。交换排序包括冒泡排序和快速排序,其中冒泡排序通过相邻元素比较交换实现排序,优化版可提前终止;快速排序采用分治思想,通过基准值分区实现高效排序,提供了Hoare版、挖坑法和前后指针三种分区方法。归并排序则采用分治策略,先递归拆分数组,再合并有序子数组,具有稳定性优势。两种算法均适用于不同场景,快速排序效率较高,而归并排序稳定且适合大数据量处理。
2026-02-06 21:15:00
638
原创 java数据结构当中的《排序》(一 )
文章摘要:本文介绍了排序的基本概念和常见算法实现。排序是将记录按关键字大小进行有序排列的操作,分为稳定/不稳定、内部/外部排序。重点讲解了插入排序算法,包括直接插入排序(逐步构建有序序列)和希尔排序(缩小增量优化版)。直接插入排序时间复杂度O(N²),空间复杂度O(1),是稳定排序;希尔排序通过分组插入排序逐步缩小增量gap,提高了效率。文中提供了Java代码实现和测试案例,并配有示意图辅助理解排序过程。
2026-02-06 15:54:10
786
原创 java对象的比较
本文探讨了Java中对象比较的三种主要方法。首先介绍了基本类型可以直接比较,但自定义对象无法直接使用>或<比较,只能使用==比较引用地址。然后详细说明了三种对象比较方式:1)覆写Object类的equals方法实现内容比较;2)实现Comparable接口并重写compareTo方法定义自然排序;3)使用Comparator比较器接口实现灵活的外部比较规则。三种方式各有特点:equals简单但只能比较相等性;Comparable定义内部自然顺序;Comparator提供更灵活的外部比较逻辑。通过
2026-02-03 18:15:00
751
原创 java数据结构当中的《优先级队列(堆)》(二 )
1. 优先级队列的构造此处只是列出了PriorityQueue中常见的几种构造方式。构造器功能介绍创建一个空的优先级队列,默认容量是11创建一个初始容量为initialCapacity的优先级队列,注意:initialCapacity不能小于1,否则会抛IllegalArgumentException异常用一个集合来创建优先级队列// 创建一个空的优先级队列,底层默认容量是11();// 创建一个空的优先级队列,底层的容量为initialCapacity(100);();
2026-02-03 11:45:42
721
原创 java数据结构当中的《优先级队列(堆)》(一)
摘要: 优先级队列是一种特殊的数据结构,支持高效获取和添加优先级最高的元素。其底层通常采用堆实现,堆是一种完全二叉树,分为大根堆和小根堆。堆通过顺序存储方式实现高效访问,利用父子节点下标关系快速定位。堆的创建采用向下调整算法,时间复杂度为O(N)。插入元素时采用向上调整,删除堆顶元素时交换末位并向下调整。基于堆的特性,优先级队列实现了offer(插入)、poll(删除)和peek(查看)操作,确保每次操作都能高效处理优先级最高的元素。
2026-02-02 23:08:01
642
原创 java数据结构当中的《二叉树(三)》
本文总结了二叉树相关的常见算法题解,包括:1)判断两树是否相同;2)判断子树关系;3)翻转二叉树;4)判断平衡二叉树;5)验证对称二叉树;6)二叉树构建与遍历。每道题都采用递归解法,详细说明了递归终止条件和处理逻辑,并给出了Java实现代码。这些题目涵盖了二叉树的基本操作和性质判断,通过递归思想可以高效解决。代码简洁明了,注释清晰,适合作为二叉树算法学习的参考范例。
2026-01-30 23:38:07
306
原创 java数据结构当中的《二叉树(二)》
在学习二叉树的基本操作前,需先要创建一棵二叉树,然后才能学习其相关的基本操作。由于现在大家对二叉树结构掌握还不够深入,为了降低大家学习成本,此处手动快速创建一棵简单的二叉树,快速进入二叉树操作学习,等二叉树结构了解的差不多时,我们反过头再来研究二叉树真正的创建方式。注意:上述代码并不是创建二叉树的方式,真正创建二叉树方式后序详解重点讲解。再看二叉树基本操作前,再回顾下二叉树的概念,
2026-01-29 22:50:43
617
原创 java数据结构当中的《二叉树(一)》
本文介绍了树和二叉树的基本概念及特性。树是一种非线性数据结构,具有层次关系和递归定义特点,包含根节点、子树等基本要素,并详细阐述了度、层次、高度等术语。二叉树的定义更为严格,每个节点最多有两个子节点,分为满二叉树和完全二叉树两种特殊类型。文章还讲解了二叉树的五大性质,包括节点数量与层次的关系、叶节点与度2节点的关系等。最后介绍了树的四种表示方法(双亲、孩子、双亲孩子、孩子兄弟表示法)和二叉树的两种存储方式(顺序存储和链式存储),其中链式存储又分为孩子表示法和孩子双亲表示法。这些基础概念为后续深入学习树形结构
2026-01-28 18:44:53
1012
原创 java数据结构当中的《队列(Queue)》
本文介绍了队列的基本概念、实现方式及循环队列的设计。队列是一种先进先出(FIFO)的线性表,Java中Queue接口通过链表实现。文章详细讲解了队列的基本操作(入队、出队、获取队头元素等)及其模拟实现方法,包括双向链表实现和数组实现。重点阐述了循环队列的设计原理,通过数组下标循环技巧和保留空位法区分队列空/满状态,并提供了力扣循环队列题解代码,展示了如何用数组实现循环队列及处理边界条件的方法。循环队列的关键在于利用取模运算实现指针循环移动,有效利用数组空间。
2026-01-26 22:15:49
663
原创 java数据结构当中的《栈(Stack)》
本文介绍了栈的基本概念、使用方法、模拟实现及其应用场景。栈是一种遵循后进先出原则的线性表,支持压栈和出栈操作。文章详细展示了Java中Stack类的使用方法,包括push、pop、peek等操作,并提供了栈的数组模拟实现代码。在应用场景部分,探讨了栈在改变元素序列、递归转循环、括号匹配和逆波兰表达式求值中的实际应用,并附有相关力扣题目的解法代码。其中括号匹配问题提供了两种解决方案,包括使用栈直接匹配和借助哈希表优化匹配过程。
2026-01-25 14:14:28
731
原创 LinkedList与链表(下)
LinkedList 的官方文档LinkedList的底层是双向链表结构(链表后面介绍),由于链表没有将元素存储在连续的空间中,元素存储在单独的节点中,然后通过引用将节点连接起来了,因此在在任意位置插入或者删除元素时,不需要搬移元素,效率比较高。LinkedList实现了List接口LinkedList的底层使用了双向链表LinkedList没有实现RandomAccess接口,因此LinkedList不支持随机访问。
2026-01-24 13:00:48
665
原创 LinkedList与链表(上)
本文介绍了链表的基本概念、结构特点及其实现方式。首先对比了ArrayList与LinkedList的底层实现差异,指出链表在频繁插入删除时的优势。详细讲解了链表的8种结构类型,重点分析了无头单向非循环链表和无头双向链表两种常用结构。通过Java代码展示了单链表的基本操作实现,并提供了5道经典链表面试题的解法,包括删除指定节点、反转链表、查找中间节点、合并有序链表和链表分割等算法问题。这些题目涵盖了链表操作的核心技巧,如递归处理、快慢指针和哑节点应用等,帮助读者深入理解链表数据结构及其常见算法实现。
2026-01-23 22:07:51
626
原创 ArrayList与顺序表
本文介绍了Java中的List接口及其实现类ArrayList。List是继承自Collection的接口,提供了添加、删除、查找等操作方法。ArrayList是基于数组实现的动态顺序表,支持随机访问、克隆和序列化。文章详细讲解了ArrayList的构造方法、常用操作(增删改查)、三种遍历方式(for循环、foreach、迭代器),以及线性表和顺序表的基本概念。通过代码示例展示了ArrayList的具体使用方法,包括元素操作、容量设置和子列表获取等核心功能。
2026-01-21 11:29:22
597
原创 包装类&简单认识泛型
本文介绍了Java中的包装类和泛型机制。包装类为基本类型提供了对应的类类型,支持自动装箱和拆箱操作。泛型通过类型参数化实现了代码复用,包括泛型类定义、类型推导、擦除机制等核心概念。文章详细讲解了泛型上界、泛型方法的语法和使用场景,并强调了泛型在编译时进行类型检查的特性。这些机制共同增强了Java的类型安全性和代码灵活性,是Java编程中的重要基础概念。
2026-01-20 12:01:53
964
原创 时间和空间复杂度
时间复杂度主要衡量的是一个,而空间复杂度主要衡量一个算法所需要的额外空间,在计算机发展的早期,计算机的存储容量很小。所以对空间复杂度很是在乎。但是经过计算机行业的迅速发展,计算机的存储容量已经达到了很高的程度。所以我们如今已经不需要再特别关注一个算法的空间复杂度。
2026-01-20 10:27:38
841
原创 异常(全)
Java 中虽然已经内置了丰富的异常类, 但是并不能完全表⽰实际开发中所遇到的⼀些异常,此时就需要维护符合我们实际情况的异常结构.例如, 我们实现⼀个⽤⼾登陆功能.if (!System.out.println("⽤⼾名错误!");return;if (!System.out.println("密码错误!");return;System.out.println("登陆成功");
2026-01-17 15:22:34
618
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅