- 博客(52)
- 收藏
- 关注
原创 JAVA基础-就近原则和this关键字
当你在代码中使用一个变量名时,Java 编译器需要确定你到底指的是哪一个变量。它的查找规则非常简单粗暴:谁离我近,我就用谁。具体的查找顺序是:先找局部范围:看看当前方法(或代码块)里有没有定义这个变量?如果有,就直接用。再找成员范围:如果局部没找到,再去类的成员变量(属性)里找。在实际开发中,为了让代码可读性更高,我们通常把方法的参数名起得和成员变量名一模一样。比如:成员变量叫 , 方法的参数也叫 。Java 结果:输出 “你好,我是 贾宝玉”。尴尬的情况:如果你想在方法里打印出成员变量 “林黛
2026-01-02 23:27:17
103
原创 写给初次用IDEA的新人
用于组织文件的文件夹,比如 src(源代码目录)、lib(依赖库目录)等,目录可嵌套,还能被标记为特殊用途(如 Sources Root、Resources Root)。它的本质就是目录下的嵌套目录结构。最基础的单位,包含源代码文件(如 .java、.cpp)、配置文件(如 pom.xml、application.yml)、资源文件等。项目的子单元,用于拆分大型项目的功能模块,每个模块下会包含Directory(目录)和各类文件,模块有自己的 .iml 配置文件。3. Directory(目录)
2026-01-02 22:00:14
166
原创 【Java进阶】面向对象编程第一站:深入理解类、对象与封装前言
本文介绍了Java面向对象编程的核心概念"类"与"对象"以及封装特性。文章通过饼干模具的比喻形象说明了类(抽象模板)和对象(具体实例)的关系,强调"先有类后有对象"的设计逻辑。详细讲解了类的定义规范、类之间的继承/实现/关联/依赖关系,重点阐述了封装的基本原则和四大优势(安全性、解耦合、复用性、易用性),并通过标准JavaBean示例展示了如何通过访问修饰符和Getter/Setter方法实现数据隐藏和控制。全文旨在帮助读者掌握面向对象编程的基础概
2026-01-02 21:52:40
504
原创 JAVA基础:基本数据类型和引用数据类型
理解它们的区别,是掌握 Java 内存管理、避免 NullPointerException 以及正确比较对象(== vs .equals)的前提。* 想存数字、字符、布尔值 -> 用 基本数据类型 (int, double, boolean...),效率高,存在栈里。* 存储内容:栈里的变量存的是堆内存的地址(类似于门牌号 0x1122),而不是数据本身。* 想存对象、字符串、数组 -> 用 引用数据类型,变量是遥控器,对象在堆里。* 比喻:引用变量就像一个遥控器,它指向堆里的电视机(对象)。
2025-12-31 19:25:20
531
原创 JAVA方法进阶-方法调用的内存原理
方法弹栈后,main 方法通过同样的地址去看,发现堆里的数据确实变了。理解方法调用的内存原理,是掌握 Java 程序运行机制的关键,也是理解“值传递”本质的基础。Java 的方法执行主要依赖于 JVM 内存模型 中的 栈,具体来说是 Java 虚拟机栈(Java Virtual Machine Stack)。* 角色:方法的“道具仓库”。* 栈是私有的,堆是共享的:基本类型数据在栈里“私有”,引用类型数据在堆里“共享”。每当一个方法被调用时,JVM 会在栈中为该方法创建一个单独的内存块,称为 “栈帧”。
2025-12-31 18:58:56
238
原创 学好方法,一篇文章足矣
在 Java 语言中,方法(Method) 是一段封装了特定业务逻辑的代码块,它是类(Class)或对象(Object)行为的具体体现。* 形式参数 (Parameter):定义方法时声明的变量,用于接收传入的数据(例如上文的 a 和 b)。逻辑清晰 :一个命名规范的方法(如 getUserInfo)本身就是最好的文档,能直观传达代码意图。在同一个类中,允许存在一个以上的同名方法,只要它们的参数列表不同即可。本篇文章,我将会以较为严谨的语言来拆解方法这一JAVA的基石,保证你对方法有更深入的了解。
2025-12-31 18:48:05
389
原创 数组动态初始化和静态初始化
在Java中,数组的初始化可以分为静态初始化和动态初始化。它们的主要区别在于:静态初始化在声明数组的同时直接指定数组元素的值,而动态初始化则只指定数组的长度,由系统为数组元素分配初始值。
2025-12-30 20:39:23
331
原创 新人必看:for和while的核心区别
想让循环变量 “用完就扔”→ 用for(更简洁、变量作用域更紧凑)。想在循环结束后继续用循环变量→ 用while。
2025-12-29 22:49:13
263
原创 一个题目 带你了解快慢指针
核心实现逻辑:该函数采用快慢指针法(一次遍历最优解),慢指针每次走 1 步、快指针每次走 2 步,利用快指针先到达链表末尾的特性,让慢指针停在中间位置,时间复杂度 O (n)、空间复杂度 O (1)。初始位置关键作用:慢指针初始指向第一个有效节点,快指针初始指向第二个有效节点,这种初始位置差 1 步的设计,决定了偶数个节点时返回中间靠左的值(如 1,2,3,4 返回 2)、奇数个节点时返回正中间值(如 1,2,3,4,5 返回 3)。循环条件的意义fast!=null。
2025-12-28 23:09:19
364
原创 Java基础-类型转换以及易错点
不需要手动写代码,Java 自动将取值范围小的类型转换为取值范围大的类型,避免数据丢失。目标类型 变量名 = (目标类型) 原变量;),将取值范围大的类型转换为取值范围小的类型,可能导致数据丢失 / 溢出。
2025-12-28 20:28:36
241
1
原创 从0开始学JAVA-2 String和char的区别
特性char(字符)String(字符串)数据类型分类基本数据类型(8 种之一,是关键字)引用数据类型(String 类,不是关键字)表示内容单个 Unicode 字符(仅 1 个字符)一串字符的序列(0 个或多个字符)底层存储占用 2 个字节(存储字符的 Unicode 编码)底层是char[]数组(JDK9 后改为byte[]),是对象写法 / 字面量单引号包裹,如'a''1''中'双引号包裹,如"a""123""中国"""(空字符串)char是基本数据类型。
2025-12-27 23:43:29
249
原创 [从零开始学JAVA|第一篇 ] 分清关键字 方法名 字面量 标识符
编程语言预定义、具有特殊含义的单词,不能被用作变量名、方法名等(是 “被语言占用的名字”)。用来标识方法(函数)的名字,是 “调用一段代码逻辑的入口”。直接表示具体值的符号,是 “值的直接写法”。程序员自定义的名字,用来标识变量、方法、类、模块等。plaintext编程语言的名字体系├─ 关键字:预定义、有特殊含义(不能当标识符)└─ 标识符:程序员自定义的名字├─ 类名├─ 方法名(你问的“方法名”属于标识符)├─ 变量名└─ 常量名字面量:不是名字,是“具体值的写法”比如代码public。
2025-12-27 23:39:00
294
原创 计算机为什么使用二进制存储数据
计算机采用二进制存储数据主要基于硬件适配性和运算效率:1)半导体元件(晶体管、电容等)天然具备两种稳定状态,二进制能直接对应;2)二进制运算规则简单,便于电路实现;3)抗干扰能力强,仅需区分高低电平;4)便于存储传输,可高效处理并纠错。这些特性使二进制成为硬件实现最简单可靠的数据表示方式。
2025-12-27 12:49:43
247
原创 如何理解编译?
本质是把高级语言代码转换成电脑能执行的机器码;核心步骤:预处理→编译→汇编→链接(新手重点记 “语法检查 + 生成可执行文件”);编译型语言(C/C++)因提前翻译,运行速度远快于解释型语言;编译报错 = 代码有语法错误,必须修复后才能生成可执行文件。简单说:编译就是给电脑 “翻译” 程序的过程,翻译对了(无语法错)就生成能运行的文件,翻译错了(语法错)就提示你改,这是编程中最基础也最核心的环节。
2025-12-26 22:00:22
489
原创 为什么要配置环境变量?
就能在任意 CMD 目录下直接执行。环境变量(以 Windows 的。(运行)命令,无需每次切换到。比如安装 Java 后,将。
2025-12-26 20:11:42
205
原创 CMD是什么
CMD是Windows系统内置的命令行工具,通过文本命令代替图形界面操作。它基于DOS内核演化而来,支持文件管理(dir、cd)、系统维护(ipconfig、ping)和程序调试等操作。新手需掌握基础命令如切换目录(cd)、查看文件(dir)、网络诊断(ping)等,注意区分CMD与PowerShell的区别,谨慎使用管理员权限和危险命令(如del、format)。CMD是系统管理和开发调试的重要工具,适合Windows进阶操作学习。
2025-12-26 19:04:49
678
原创 谈谈AI对新人的影响和对行业的作用
然后我们讲一讲程序员的成长的本质,从初级到高级真正的差距,他不是说你写代码有多快或者语言有多多,用的框架有多新,而是说你看到业务需求里,越业务需求的时候脑子里的实现思路就初级到中级到高级,是初级这个需求怎么写,中级是这个需求应该是这样的,高级是这个需求的背后是什么。现在就是非常残酷的真相,如果在被用AI的时候AI也在用你,以为在学习编程,实际上在学习如何描述需求,以为写出了代码,实际上只是复制了代码,以为解决了问题,但是实际上是逃避了这个问题,以为提高了效率,但实际上是失去了成长的机会。
2025-12-24 17:37:27
443
原创 拒绝毒鸡汤,回归现实
一提到大厂,大家可能觉得年薪30万、50万甚至百万,但实际上大厂的普通岗位,双非能进的岗位一般集中在15 - 20万左右,且双非在大厂没有晋升空间,因为存在潜在的学历歧视,那些大厂的高薪技术专家、管理层核心骨干等位置,普通人拿不到,这种歧视是客观存在的。客观分析,我们在学习门槛、学习资源、实习机会、信息差、自制力等方面可能存在差距,这不是贬低,是客观存在的差距,我们的学历能力、学习能力、自制力和大厂精英不在一个维度,超不过他们是事实,但这不是终点,我们有自己的长处,要找到自己的赛道,不要去走别人的赛道。
2025-12-24 17:27:31
361
原创 C++ 中手动重载赋值运算符(operator=)时实现部分复制的思路和方法
C++ 中手动重载赋值运算符实现部分复制的核心是:在operator=函数中只拷贝需要的成员变量,忽略不需要的成员。重载时必须先防止自赋值,对指针成员需做深拷贝,并返回自身引用以支持链式赋值。部分复制是基于业务需求的自定义逻辑,适用于某些成员不需要随赋值复制的场景,需注意与深拷贝结合处理指针成员,避免内存问题。
2025-12-23 20:31:31
627
原创 \0的含义和作用
如果字符数组没有以\0结尾,程序处理时会 “越界” 读取内存中的随机数据,直到遇到内存中的某个\0为止,导致乱码:cpp运行// 没有\0的字符数组// 输出:hello + 随机乱码(越界读取)// 结果不确定(直到找到\0)cout << "str数组大小:" << sizeof(str) << endl;// 输出:5(仅包含5个字符)return 0;\0是空字符,ASCII 码为 0,是 C 风格字符串的结束标志,程序通过它识别字符串的边界。用双引号""
2025-12-23 18:28:34
901
原创 ASCII 码的具体含义和作用
ASCII码是美国信息交换标准代码,用7位二进制数(0-127)将字符映射为数字,使计算机能处理文本。它包含33个控制字符(如换行符)和95个可打印字符(字母、数字、符号)。编程中可实现字符与ASCII码的相互转换,并利用其规律(如大小写字母相差32)进行字符处理。但ASCII仅支持英语,后续扩展ASCII码和Unicode(如UTF-8)解决了多语言编码问题,同时保持对ASCII的兼容。
2025-12-23 15:15:04
508
原创 char和string区别
char是 C 和 C++ 共有的基本类型,而string在 C 和 C++ 中的含义完全不同,我们主要以 **C++** 的语境为主(C 中没有原生string类型,通常用char*char[]表示字符串)。类型核心定义(C++)核心定义(C)char基本数据类型,用于存储单个字符 / 1 字节整数与 C++ 一致string标准库类(),管理字符序列(字符串)无原生string,用char*char[]表示字符串本质差异char是 C/C++ 的基本数据类型,存储单个字符 / 1 字节整数;
2025-12-23 15:09:50
673
原创 C++ 里 什么时候不用指针,而选择值拷贝/深拷贝 ?
C++ 中选择 “克隆数据(值拷贝 / 深拷贝)” 而不用指针,核心是为了保证数据的独立性和安全性—— 避免意外篡改原数据、消除悬空指针风险、让复杂对象拥有独立的状态。而指针的 “共享地址” 更适合需要高效共享、动态管理内存的场景,二者是互补的,要根据需求选择。
2025-12-22 20:50:37
321
原创 C++ 中 引用 是如何从 “运行速度” 和 “代码编写” 两个维度极大提升开发效率的。
本文介绍了C++中引用的核心价值与使用技巧。引用能显著提升程序性能,在处理大对象时避免内存拷贝(如10MB图片只需传递8字节地址);相比指针更安全简洁,无需处理空指针异常;配合const使用可兼顾效率与安全性(只读不改数据)。关键原则:小数据直接传值,大对象用引用,只读场景加const。引用实现了零拷贝、编码简洁和安全访问的三重优化。
2025-12-22 20:43:42
183
原创 论指针运算
本文系统讲解了C/C++中指针运算的核心概念。首先指出指针运算的本质是基于类型大小的内存地址偏移,步长由指针指向类型决定(如int指针+1偏移4字节)。接着详细解析了四种核心运算:指针加减整数实现地址偏移,指针减指针计算元素间隔,指针比较用于遍历数组,下标运算本质是*(指针+i)。特别强调了指针运算的注意事项:类型决定步长、避免越界和野指针操作、同类型指针才能运算。最后总结指针与数组名的异同,指出数组名是常量指针。通过代码示例直观展示了各种指针运算的应用场景和潜在风险。
2025-12-21 23:23:23
420
原创 指针在 C++ 中最核心、最实用的两个作用:“避免大数据的复制” 和 “共享”。
摘要:指针在编程中的两大核心优势:1)避免深拷贝提升性能,通过浅拷贝仅复制内存地址而非整个数据;2)实现资源共享节省内存,多个对象可共用同一数据源。类比网页链接与截图的区别,指针如同发送网址而非整个网页,既高效又节省资源。这种机制显著优化了程序运行速度和内存使用效率。
2025-12-20 23:35:19
131
原创 rand():生成伪随机整数
本文介绍了C语言中rand()%7的用法,它通过rand()函数生成0到RAND_MAX的伪随机数,再通过%7取模运算得到0-6范围内的随机整数。文章详细解析了rand()函数和取模运算的原理,并提供了代码示例说明如何配合srand()设置随机种子。同时扩展介绍了生成任意范围[a,b]随机数的通用公式rand()%(b-a+1)+a。使用rand()时需注意要初始化随机种子,否则每次运行会得到相同序列。
2025-12-20 20:12:40
329
原创 操作系统的概念、功能和目标
摘要:操作系统(OS)是管理计算机硬件与软件资源的系统软件,作为硬件与用户/应用程序之间的接口。其核心功能包括处理机管理(CPU调度)、存储器管理(内存分配)、设备管理(外设控制)、文件管理(数据存储)和用户接口(交互方式)。操作系统通过硬件抽象、资源分配和统一接口,实现方便性(简化操作)、高效性(优化资源利用)和可扩充性(支持硬件升级)三大目标。常见的操作系统如Windows、Linux等,是计算机系统运行的基础,没有OS计算机硬件将无法使用。
2025-12-19 19:11:00
617
原创 带你认识C++ 泛型
C++泛型编程通过模板机制实现代码复用和类型安全。主要包括函数模板(如max(T a, T b))和类模板(如Box<T>),支持自动类型推导和显式指定类型。模板特化允许为特定类型定制实现。泛型的优势包括代码复用、编译时类型检查和零运行时开销,广泛应用于标准库容器、算法和智能指针中。示例展示了泛型函数print(T value)可处理多种数据类型。泛型编程提高了C++代码的灵活性和效率。
2025-12-19 19:06:48
302
原创 C++ 中的一元谓词和二元谓词
摘要:谓词是可返回布尔值的可调用对象。一元谓词接受单个参数,用于元素判断(如isEven);二元谓词接受两个参数,用于元素比较(如isGreater)。一元谓词常用于find_if等筛选算法,二元谓词多用于sort等排序比较算法。两者在STL算法中广泛应用,是实现自定义逻辑的关键工具。
2025-12-15 23:42:35
92
原创 C++ 异常处理
C++异常处理机制通过try-catch-throw实现错误检测与处理分离。throw抛出异常对象,try块包裹可能异常代码,catch捕获特定异常。标准异常包括runtime_error等,也可自定义异常类。异常会终止当前函数执行并沿调用栈查找匹配的catch块。优点是代码清晰、跨函数传播错误,但可能影响性能。最佳实践建议:异常仅用于错误处理而非控制流,抛出具体异常类型,配合RAII管理资源,避免滥用catch-all。异常处理能提升代码健壮性,但需权衡性能与可维护性。
2025-12-15 23:06:00
259
原创 归并排序的趟数和时间复杂度
趟数:归并排序的趟数为 **log2n**(n 为元素个数,即拆分 / 合并的轮次),若 n 不是 2 的幂,趟数为向上取整后的log2n。时间复杂度:最好、最坏、平均情况均为O(n log n),这是归并排序的核心优势(不受原始数组有序性影响)。补充:归并排序的空间复杂度为O(n),因为需要辅助数组存储合并后的元素。合并阶段是归并排序的核心,每一趟合并都需要遍历所有 n 个元素 讲讲要理解 “归并排序的每一趟合并都需要遍历所有 n 个元素”,我们需要先明确 “趟。
2025-12-14 23:40:17
521
原创 力扣108. 将有序数组转换为二叉搜索树
本文介绍了利用分治法将有序数组转换为平衡二叉搜索树的方法。通过每次选取当前区间中点作为根节点,确保左右子树高度差不超过1。关键点在于采用左闭右开区间定义[left,right),递归终止条件是left==right。时间复杂度O(n),空间复杂度O(logn)。实例演示了构建过程,最终生成的树结构保持平衡。该算法简洁高效,重点在于掌握区间划分方式。
2025-12-13 23:45:11
230
原创 快速排序(Quick Sort)的“死穴”
快速排序不适于对原本有序或基本有序的记录序列进行排序。这句话的意思是: 如果你拿到一个数组,发现它已经是排好序的(或者倒序的),这时候如果你还傻乎乎地用“取第一个元素当基准”的快速排序去排它,那就是自寻死路,效率最低。那怎么办?实际工程中,为了避免这种尴尬,我们通常随机选基准,或者三数取中(取头、中、尾三个数的中间值当基准),这样就能避开这种“死穴”了。
2025-12-13 22:52:11
349
原创 万能引用和右值引用的区别
本文通过定义、语法、区别和使用场景四个方面,清晰区分了C++中的右值引用和万能引用。核心结论是:万能引用不是独立引用类型,而是auto&&或模板T&&在类型推导时的一种语法现象,可绑定左右值;右值引用则是明确类型,只能绑定右值。文章详细对比了两者的语法条件、绑定对象和推导时机,并通过代码示例展示了右值引用用于移动语义,万能引用实现完美转发的典型场景。区分关键点在于是否存在类型推导:有推导是万能引用,无推导则是右值引用。
2025-12-12 19:02:42
218
原创 unique_ptr的返回值优化(RVO)与移动语义
文章摘要:函数返回局部unique_ptr对象时,编译器会自动将其视为右值并触发移动语义,实现所有权转移,无需手动使用std::move。虽然return up;和return move(up);效果相同,但前者更简洁,是推荐写法。这种机制结合了C++的返回值优化和unique_ptr的移动语义特性,确保了资源的正确管理和代码的高效运行。
2025-12-11 19:33:45
153
原创 C++11 引入的独占式智能指针:unique_ptr
摘要:unique_ptr是C++11引入的独占式智能指针,用于自动管理动态内存。核心特性包括:独占所有权(禁止拷贝,仅支持移动语义)、自动析构、支持数组管理及可自定义删除器。基本用法包括使用make_unique创建、通过std::move转移所有权,以及常用成员函数如get()、reset()等。注意事项包括避免重复释放、不管理栈对象等。适用于需要独占资源所有权的场景,比shared_ptr更轻量高效。
2025-12-11 19:19:51
215
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅