- 博客(40)
- 收藏
- 关注
原创 Java 中 NIO与传统IO的关系 (附Java IO 流核心类对比表)
Java NIO与传统IO核心对比 NIO与传统IO的主要区别在于:NIO采用通道(Channel)和缓冲区(Buffer)模型,支持非阻塞IO和随机访问;而传统IO基于流(Stream)模型,只能顺序读写。NIO.2新增的Files、Paths等类比传统File类更高效,提供StandardCharsets统一管理字符集。NIO核心优势包括选择器(Selector)、内存映射文件和管道(Pipe)等特性,但并非完全取代传统IO,两者在特定场景下各有优势。
2025-09-25 15:30:19
919
原创 Java中的TCP与UDP
本文通过Java代码实例对比了TCP和UDP网络通信的实现方式。TCP通信需要建立连接(三次握手),基于IO流传输数据,可靠性高,关键类为ServerSocket和Socket;UDP则无需连接,直接通过DatagramPacket发送数据包,传输不可靠但效率高。文章分别展示了TCP客户端/服务器和UDP发送端/接收端的完整实现代码,并总结了两种协议在连接建立、数据传输、核心类和可靠性等方面的本质区别。所有代码示例均包含详细注释,清晰呈现了两种网络协议的核心实现逻辑。
2025-09-24 15:30:00
463
原创 JAVA中hashset 在插入时,在列表增长、列表转邻接链表、链表转红黑树的策略
Java中HashSet的底层实现依赖于HashMap,其元素作为HashMap的键存储,值使用固定空对象。HashSet的扩容、哈希冲突处理等策略完全继承自HashMap的机制:扩容机制:当元素数量达到阈值(容量×负载因子0.75)时,数组容量翻倍并重哈希迁移元素,以减少冲突。哈希冲突处理:冲突元素形成链表(Java8+采用尾插法),当链表长度≥8且数组容量≥64时转换为红黑树(查询效率O(log n)),反之优先扩容。树退化:当红黑树节点≤6时转回链表。
2025-08-25 17:18:09
985
原创 JAVA 中Arrays ArrayList LinkedList Vector的区别
摘要:Java中数组(Array)、Arrays工具类、ArrayList、LinkedList和Vector在功能与适用场景上差异显著。数组长度固定,适合高效随机访问;Arrays提供数组辅助方法;ArrayList基于动态数组,支持自动扩容;LinkedList适合频繁增删;Vector是线程安全但低效的ArrayList。选择依据:长度固定用数组+Arrays,动态访问用ArrayList,频繁增删用LinkedList,线程安全用CopyOnWriteArrayList替代Vector。
2025-08-20 16:00:00
727
原创 堆、方法区、虚拟机栈、本地方法栈、程序计数器
堆:相当于“主仓库”,存储所有“成品对象”(包括普通对象和字符串常量池这个“字符串子仓库”)。虚拟机栈:相当于“工人的工作台”,每个工人(线程)有一个,台上的“工具”(局部变量)指向主仓库的成品,方便随时取用。元空间:相当于“设计图纸库”,存储“类的设计图纸”(类元数据),这些图纸不在主仓库(堆)里,而在工厂的“独立档案室”(本地内存)中。字符串常量池:是“主仓库(堆)里的一个货架”,专门存放常用的“字符串零件”,避免重复生产。
2025-08-19 16:00:00
994
原创 字符串常量池就已从传统的“方法区(永久代)”迁移到了堆中
摘要:JDK 7将字符串常量池从永久代迁移至堆中,JDK 8及后续版本虽改用元空间替代永久代,但字符串常量池仍保留在堆中。这一设计使字符串常量池能利用堆的高效内存管理机制(如动态内存调整和垃圾回收),避免了永久代的内存限制问题。JDK 23等后续版本延续此优化,实现了更灵活的内存处理。
2025-08-19 07:00:00
314
原创 JDK8元空间理解
元空间是 JDK 8 及之后存储“类元数据”的内存区域,本质是使用本地内存的类信息仓库,它替代永久代的核心目的是让类元数据的内存管理更灵活、更不易溢出。元空间存“类的描述信息”,不存字符串常量;元空间用本地内存,默认无上限(可手动限制);元空间会回收无用类的元数据,避免内存浪费。这样理解后,就能清晰区分元空间与永久代、字符串常量池的差异了。
2025-08-19 07:00:00
615
原创 JAV 中JVM对于字符串常量池膨胀的解决办法
摘要: 现代JVM通过多重机制优化字符串常量池内存管理,避免其无限制膨胀。关键优化包括:将常量池从永久代迁移至堆内存以纳入GC管理;引入字符串自动去重技术减少冗余;编译期和运行期自动去重;元空间替代永久代提升灵活性;以及GC对无引用常量的主动回收。这些机制有效防止常量池内存占用过高问题,仅在程序频繁创建大量唯一且长期引用的字符串时可能出现内存压力。开发者可通过JVM参数进一步优化常量池性能。
2025-08-18 13:36:11
988
原创 【JAVA 字符串常量池、new String的存储机制、==与equals的区别,以及字符串重新赋值时的指向变化】
本文通过Java代码示例分析了字符串在JVM中的存储机制,重点解释了字符串常量池和堆内存的差异。当直接赋值字符串时,会在常量池中创建或复用字符串对象;使用new操作符则会在堆中新建对象。文章还澄清了常见误解:常量池中的字符串不会被主动回收,其生命周期与类加载相关。通过比较操作符"=="和"equals()"的结果,验证了字符串对象在内存中的存储位置和不可变性特征。
2025-08-18 13:30:17
749
原创 Java 代码块与静态代码块
在Java中,子类实例化时的初始化顺序遵循两条核心规则:静态优先于非静态,父类优先于子类。具体流程为:1)父类静态代码块(类加载阶段);2)子类静态代码块;3)父类普通代码块和构造方法(对象创建阶段);4)子类普通代码块和构造方法。这种顺序由JVM的类加载机制决定,确保父类资源先于子类准备就绪。通过代码示例验证,执行结果为:父类静态→子类静态→父类普通→父类构造→子类普通→子类构造。理解这一顺序对掌握Java继承机制至关重要。
2025-08-12 13:43:00
472
原创 【Java 的规则本质上是 “约定大于配置” 的设计理念】
Java类文件设计遵循模块化和高效编译原则:1)一个.java文件只能有一个public类(文件名必须匹配类名),避免.class文件冲突;2)每个类可定义main方法,便于独立测试;3)类文件拆分遵循单一职责原则,提升代码可维护性和团队协作效率。这些规则通过"约定大于配置"的设计理念,优化了大型项目的开发流程。
2025-08-08 14:05:31
714
原创 【Java 中多态和类型转换规则】
Java 中多态和类型转换规则的核心原因在于:子类是父类的 “一种”(is-a 关系),但父类不是子类的 “一种”。
2025-08-08 13:48:58
422
原创 Java 中也存在类似的“直接引用”“浅拷贝”和“深拷贝”
Java中的对象拷贝分为直接引用、浅拷贝和深拷贝三种方式。直接引用(b = a)共享同一对象,修改会相互影响;浅拷贝(实现Cloneable接口并重写clone()方法)复制基本类型成员,但引用类型成员仍共享;深拷贝则需手动拷贝所有引用类型成员,使对象完全独立。与Python不同,Java没有内置的深拷贝模块,需自行实现嵌套结构的拷贝逻辑。
2025-08-03 18:52:00
220
原创 a=b、深拷贝和浅拷贝
本文比较了三种Python对象复制方式的差异:(1)直接赋值b=a会创建指向同一内存的别名,任何修改都会同步;(2)浅拷贝b=a[:]或b=a.copy()会创建新对象,但嵌套内容仍共享,修改嵌套结构会影响原对象;(3)深拷贝b=copy.deepcopy(a)会递归复制所有层级,创建完全独立的新对象。通过二维列表的示例验证了三种方式的特性差异,揭示了内存共享程度是核心区别:从完全共享到部分共享再到完全不共享。
2025-08-01 17:25:52
317
原创 层次聚类算法 AGNES算法 BIRCH 算法 CURE算法 CHAMELEON算法
层次聚类算法 AGNES算法 BIRCH 算法 CURE算法 CHAMELEON算法
2024-02-22 17:50:20
1534
原创 Leetcode日记 290. 单词规律 给定一种规律 pattern 和一个字符串 s ,判断 s 是否遵循相同的规律。 这里的 遵循 指完全匹配
Leetcode日记 290. 单词规律 python 字典 给定一种规律 pattern 和一个字符串 s ,判断 s 是否遵循相同的规律。 这里的 遵循 指完全匹配
2024-02-20 19:14:22
824
原创 DBSCAN密度聚类介绍 样本点 样本集合 半径 邻域 核心对象 边界点 密度直达 密度可达 密度相连
DBSCAN密度聚类介绍 样本点 样本集合 半径 邻域 核心对象 边界点 密度直达 密度可达 密度相连
2024-02-20 17:31:54
1254
原创 Leetcode日记 226. 翻转二叉树 给你一棵二叉树的根节点 root ,翻转这棵二叉树,并返回其根节点。
Leetcode日记 226. 翻转二叉树 给你一棵二叉树的根节点 root ,翻转这棵二叉树,并返回其根节点。二叉树分类,二叉树简介,二叉树分类,二叉树遍历
2024-02-19 19:44:36
566
原创 python常见的数据类型与数据结构(二) 链表 单向链表 循环链表 双向循环链表 二叉树 二叉树的定义、层次遍历、先序、中序、后序遍历 N叉树 N叉树的定义和遍历
python常见的数据类型与数据结构(二) 链表 单向链表 循环链表 双向循环链表 二叉树 二叉树的定义、层次遍历、先序、中序、后序遍历 N叉树 N叉树的定义和遍历
2024-02-19 18:20:22
1349
1
原创 python常见的数据类型与数据结构(一)数字类型 字符串类型 布尔类型 列表 集合 字典 的定义与常规操作方法
python常见的数据类型与数据结构(一)数字类型 字符串类型 布尔类型 列表 集合 字典 的定义与常规操作方法
2024-02-18 16:21:51
877
1
原创 深度学习——概念引入
深度学习(Deep Learning,DL)是机器学习领域中的一个新的研究方向,主要是通过学习样本数据的内在规律和表示层次,让机器能够具有类似于人类的分析学习能力。深度学习的最终目标是让机器能够识别和解释各种数据,如文字、图像和声音等,从而实现人工智能的目标。深度学习的最具革命性的一点是,它利用神经网络技术自动提取数据的特征,而不需要人为进行特征工程。通过多层的神经元网络对数据进行阶段性的学习,深度学习可以对图像、声音等无法形成符号的数据进行模式识别,并取得了在语音和图像识别等方面超越其他技术的效果。
2024-02-17 18:37:05
1684
1
原创 Leetcode日记 125. 验证回文串 如果在将所有大写字符转换为小写字符、并移除所有非字母数字字符之后,短语正着读和反着读都一样。则可以认为该短语是一个 回文串 。
Leetcode日记 125. 验证回文串 如果在将所有大写字符转换为小写字符、并移除所有非字母数字字符之后,短语正着读和反着读输入: s = “A man, a plan, a canal: Panama”解释:“amanaplanacanalpanama” 是回文串。解释:在移除非字母数字字符之后,s 是一个空字符串 “”。由于空字符串正着反着读都一样,所以是回文串。解释:“raceacar” 不是回文串。输入:s = “race a car”s 仅由可打印的 ASCII 字符组成。输入:s = " "
2024-02-17 00:00:00
492
1
原创 TypeError: slice indices must be integers or None or have an __index__ method python 力扣中round函数失效
TypeError: slice indices must be integers or None or have an __index_在 Python 中,round() 和 ceil() 函数的返回值通常是整数,而不是浮点数。round() 函数用于将浮点数四舍五入到最接近的整数,而 ceil() 函数则返回大于或等于给定数字的最小整数。如果在使用 round() 或 ceil() 函数时发现它们返回了浮点数,这可能是因为输入本身就是一个浮点数,而 Python 在某些情况下会将整数和浮点数区分对待。
2024-02-16 23:56:49
319
1
原创 Leetcode日记 20. 有效的括号 给定一个只包括 ‘(‘,‘)‘,‘{‘,‘}‘,‘[‘,‘]‘ 的字符串 s ,判断字符串是否有效。
Leetcode日记 20. 有效的括号 给定一个只包括 '(',')','{','}','[',']' 的字符串 s ,判断字符串是否有效。 有效字符串需满足:左括号必须用相同类型的右括号闭合。左括号必须以正确的顺序闭合。每个右括号都有一个对应的相同类型的左括号。输入:s = “()”输出:true输入:s = “()[]{}”输出:true输入:s = “(]”输出:falses 仅由括号 ‘()[]{}’ 组成。
2024-02-15 15:10:03
438
1
原创 Leetcode日记102. 二叉树的层序遍历给你二叉树的根节点 root ,返回其节点值的层序遍历
Leetcode日记 102. 二叉树的层序遍历 给你二叉树的根节点 root ,返回其节点值的 层序遍历。(即逐层地,从左到右访问所有节点)。输入:root = [3,9,20,null,null,15,7]输出:[[3],[9,20],[15,7]]输入:root = [1]输出:[[1]]输入:root = []输出:[]树中节点数目在范围 [0, 2000] 内。
2024-02-15 15:00:00
610
1
原创 Leetcode日记 14. 最长公共前缀 编写一个函数来查找字符串数组中的最长公共前缀。
Leetcode日记 14. 最长公共前缀 编写一个函数来查找字符串数组中的最长公共前缀。如果不存在公共前缀,返回空字符串 “”。输入:strs = [“flower”,“flow”,“flight”]输出:“fl”输入:strs = [“dog”,“racecar”,“car”]输出:“”解释:输入不存在公共前缀。
2024-02-15 14:00:00
310
1
原创 Leetcode日记 107. 二叉树的层序遍历 II 给你二叉树的根节点 root ,返回其节点值 自底向上的层序遍历 。 (即按从叶子节点所在层到根节点所在的层,逐层从左向右遍历
Leetcode日记 107. 二叉树的层序遍历 II 给你二叉树的根节点 root ,返回其节点值 自底向上的层序遍历 。 (即按从叶子节点所在层到根节点所在的层,逐层从左向右遍历输入:root = [3,9,20,null,null,15,7]输出:[[15,7],[9,20],[3]]输入:root = [1]输出:[[1]]输入:root = []输出:[]树中节点数目在范围 [0, 2000] 内。
2024-02-15 13:38:58
482
2
原创 大年夜,电脑仍在释放着自己的光芒,这究竟是人性的泯灭,还是道德的沦丧
你是否注意到,程序员们似乎从不关电脑?别以为他们是电脑上瘾,实则是有他们自己的原因!让我们一起揭秘背后的原因,看看程序员们真正的“英雄”本色!作为工作了一段时间的码农,我相信我对此有一定的发言权。
2024-02-14 23:39:56
184
1
原创 Leetcode日记 13. 罗马数字转整数 罗马数字包含以下七种字符: I, V, X, L,C,D 和 M。
Leetcode日记 罗马数字包含以下七种字符: I, V, X, L,C,D 和 M。, 罗马数字 2 写做 II ,即为两个并列的 1。12 写做 XII ,即为 X + II。27 写做 XXVII, 即为 XX + V + II。通常情况下,罗马数字中小的数字在大的数字的右边。但也存在特例,例如 4 不写做 IIII,而是 IV。数字 1 在数字 5 的左边,所表示的数等于大数 5 减小数 1 得到的数值 4。同样地,数字 9 表示为 IX。给定一个罗马数字,将其转换成整数。
2024-02-14 22:51:07
1011
1
原创 Leetcode日记 9. 回文数 给你一个整数 x ,如果 x 是一个回文整数,返回 true ;否则,返回 false 。
给你一个整数 x ,如果 x 是一个回文整数,返回 true;否则,返回 false。回文数是指正序(从左向右)和倒序(从右向左)读都是一样的整数。例如,121 是回文,而 123 不是。输入:x = 121输出:true输入:x = -121输出:false解释:从左向右读, 为 -121。从右向左读, 为 121-。因此它不是一个回文数。输入:x = 10输出:false解释:从右向左读, 为 01。因此它不是一个回文数。
2024-02-14 19:09:32
642
2
原创 Leetcode日记1. 两数之和给定一个整数数组 nums 和一个整数目标值 target,请你在该数组中找出 和为目标值 target 的那 两个 整数,并返回它们的数组下标。python
给定一个整数数组 nums 和一个整数目标值 target,请你在该数组中找出 和为目标值 target 的那 两个 整数,并返回它们的数组下标。解释:因为 nums[0] + nums[1] == 9 ,返回 [0, 1]。你可以假设每种输入只会对应一个答案。但是,数组中同一个元素在答案里不能重复出现。输入:nums = [2,7,11,15], target = 9。输入:nums = [3,2,4], target = 6。输入:nums = [3,3], target = 6。
2024-02-14 18:45:28
417
1
原创 微信小程序view设置margin-top和margin-button无效的解决方案
微信小程序view设置margin-top和margin-button无效的解决方案。
2024-02-13 18:02:53
2559
1
原创 EasySass: could not generate CSS file. See Output panel for details.微信小程序报错及解决
EasySass: could not generate CSS file. See Output panel for details.微信小程序报错及解决。在vscode中导入easysass包之后,又在微信小程序中添加vscode扩展后发生报错。
2024-02-13 00:37:07
1268
1
原创 机器学习分类与举例
接触机器学习也有一段时间了,也做了不少项目,可仔细回想发现自己对这些概念了解的并不够深刻。相信大家也会有这样的烦恼,现在我来阐述一下我对机器学习的理解。
2024-02-11 20:35:37
842
1
原创 python中在一个文件中调用另一个文件的函数
现有有一个文件夹top,文件夹top下面有两个文件夹mid1和mid2,文件夹mid1下面有一个python文件button1.py,在button.py中有一个函数print_mid1(),文件夹mid2下有一个python文件button2.py,该如何在button2.py中调用文件夹mid1下的print_mid()函数。编辑器:vscode + python。
2024-02-10 20:37:38
1244
1
原创 RuntimeError: Set changed size during iteration Python不能在迭代时删除元素
Python不能在迭代时删除元素
2023-06-07 15:51:30
2174
1
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅