自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 File 类的用法和 InputStream, OutputStream 的用法

File[] listFiles() 返回 File 对象代表的目录下的所有文件,以 File 对象表示 如果想看到所有目录和文件,需要递归。进行文件系统操作,使用路径进行初始化表示具体的文件(可以存在,也可以不存在),基于这个对象进行后续操作。IDEA会自动转换。void deleteOnExit() 根据 File 对象,标注文件将被删除,删除动作会到 JVM 运行结束时 才会进行。read() 读一次返回一个字节的内容(byte) 实际返回类型是int,读取完毕是-1 .使用循环读取文件所有内容。

2025-04-07 22:27:28 455

原创 文件操作和IO

狭义的文件:硬盘上的文件以及保存文件的目录(文件夹)(本章所指)广义的文件:计算机的硬件设备、软件资源在操作系统中都会被视为“文件”。例如标准输入(键盘)stdin、标准输出(控制台)stdout、打印机、网卡:和内存对比机械硬盘 顺序读写效率较高,随机读写效率较低,因为磁头移动需要时间。固态硬盘不存在上述 物理结构,更接近于“内存”,通过大规模集成电路,实现存储功能。操作系统专门有一个模块“”,通过“文件资源管理器”观察文件系统管理的文件。文件目录结构是”树形结构“。分隔符分隔目录和目录。

2025-04-06 18:58:34 813

原创 锁策略, cas 和 synchronized 优化过程

1.1 常見的鎖策略 預測鎖衝突概率 樂觀鎖:加鎖的時候,假設出現鎖衝突的概率不大。圍繞加鎖做的工作會更少。 悲觀鎖:加鎖的時候,假設鎖出現衝突的概率很大。圍繞加鎖做的工作會更多。 synchronized “自適應” 初始是樂觀的。鎖衝突達到一定程度就會轉變爲悲觀的。 加鎖開銷(時間開銷) 重量級鎖 輕量級鎖 挂起等待鎖:悲觀鎖/重量級鎖的一種典型實現。讓出cpu資源,過一段時間通過其他途徑得知,再伺機而動。 自旋

2024-09-24 03:41:36 574

原创 綫程池構造函數

此处的ThreadFactory就可以针对线程池里的线程工厂设计模式是一种在创建类的实例时使用的设计模式。程序员使用的时候,通过形如“submit”这样的方法,把要执行的任务设定到线程池里。初始情况下,可能有M个线程,实际使用中,发现M不太够用,就会自动增加M的个数。核心线程数+非核心线程数的最大值為最大线程数核心线程,会始终存在于线程池内部。非核心线程,繁忙的时候,被创建出来,不繁忙了,空闲了,就会把这些线程真正释放掉。在Java标准库的线程池中,就把里面的线程,分成两类。

2024-09-22 17:40:04 457

原创 线程安全问题

synchronized是JVM提供的功能,通过c++代码实现,进一步的依靠操作系统api实现的加锁。操作系统api来自于cpu上支持的特殊指令实现的。修改操作,不是”原子“的。原子是指在cpu视角不可分割的最小单位:一条指令。java中提供了synchronized关键字,来完成加锁操作。synchronized (locker) 锁任意对象。synchronized (this) 锁当前对象。针对第三个原因,把”非原子“的修改变成”原子“{}里的就是要打包到一起的代码。一个线程针对一把锁连续加锁两次。

2024-08-23 14:54:44 209 2

原创 Java 线程的几种状态

TERMINATED:Thread对象虽然还在,但是内核的线程已经销毁(线程已结束)TIMED_WAITING:有超时时间的等待,如sleep和带参数join。NEW:Tread对象有了,但是未start,内核的线程还没有。RUNNABLE:就绪,正在cpu运行和随时可以去cpu上运行。WAITING:没有超时时间的阻塞等待,join/wait。BLOCKED:锁竞争引起阻塞。

2024-08-22 14:17:22 219

原创 Thread 类的基本用法

一个Thread对象,只能对应系统中的一个线程,只能调用一次start。如果已经调用过start,则进入到其他状态,接下来执行start都会抛出异常。start调用系统函数,真正在系统内核中,创建线程(创建PCB,加入到链表中)。currentThread()是Thread的静态方法,能获取到调用这个方法的实例,类似于this。run描述了线程要执行的任务,也可以称为”线程的入口“。让后结束的线程等待先结束的线程结束,先结束后阻塞才解除。操作系统对于线程执行时随机调度,抢占式执行的过程。

2024-08-22 14:15:59 313

原创 线程和进程的关系

运行一个可执行程序,操作系统就会创建进程,分配系统资源(CPU,内存,硬盘,网络宽带......)同时也会在这个进程中创建出一个或多个线程,这些线程再去CPU上调度执行。多进程编程进程太重,创建进程,销毁进程开销比较大 ,不利于频繁创建销毁进程,例如服务器开发针对每个发送请求的客户端,都创建一个单独进程。线程“Thread”解决了进程开销较大的问题,可以理解成更轻量的进程。进程在系统中,通过PCB结构体来描述,通过链表的形式来组织。线程是系统“调度执行”的基本单位,进程是系统“资源分配”的基本单位。

2024-08-15 18:21:23 236

原创 只出现一次的数字 Java题解

除了某个元素只出现一次以外,其余每个元素均出现两次。找出那个只出现了一次的元素。你必须设计并实现线性时间复杂度的算法来解决此问题,且该算法只使用常量额外空间。如有解释不清的地方,欢迎评论探讨!这里运用了hashset的思想。

2024-05-31 17:42:37 245 1

原创 Java哈希表代码

array数组是哈希表 默认了哈希冲突的阈值是0.75。以上,如果有解释不到位的地方欢迎留言探讨!这是一个内部类,并给出初始化。

2024-05-30 16:04:02 141

原创 Java 实现二叉搜索树 代码

如果左右子节点都在,则用左子树的最大值或者右子树的最小值替换即可,下面给出用右子树的最小值替换的方法。注意,这里删除又写了一个自定义函数。已至删除的位置和其双亲结点,如何让其删除呢?直接在BinarySearchTree类里面写就可以。找到节点并删除,成功则返回true,失败false。如有什么没讲清楚的地方,欢迎留言探讨!找到则返回该节点,没找到返回null。

2024-05-29 19:23:14 458

原创 继承多态 知识要点

继承 extendsclass 子类 extends 父类子类就可以不定义父类当中的成员了使代码重复使用继承之后要添加新成员,否则无意义,自己的成员优先super 指定告诉编译器访问的父类中的成员,构造方法没有被继承,需要super调用。和this一样不能出现在static方法中。super()调用父类的构造方法。必须要在第一行,并且不能和this()同时出现不同包中的子类用super引用java不支持多继承 ,有接口final 常量,方法不能被重写组合 把一个类作为另一个类的成员。

2024-03-21 23:05:15 329

原创 类和对象 java 要点总结

使用**import static**导入包中静态的方法和字段 static修饰的在方法区,不属于对象,通过对象的引用来访问会警告,应该通过类名来访问,属于类。- **包是对类、接口等的封装机制的体现,是一种对类或者接口等的很好的组织方式**,**在同一个工程中允许存在相同名称的类,只要处在不同的包中即可**- 包:域名逆置 package可查看 src底下为默认包 **为了更好的管理类,把多个类收集在一起成为一组,称为软件包**。- 普通代码块/局部代码块 定义在方法中,不需要条件,直接执行。

2024-03-19 13:37:19 405

原创 数据类型与运算符 java

public static void main(String[] args){ //快捷键:psvm main//sout​常见代码补全: 如上 按tab或者回车ctrl+d 复制。

2024-03-17 10:53:20 400 1

原创 C++ inline内联函数注意点

2.inline函数不支持声明和定义分离开,因为编译器一旦将一个函数作为内联函数处理,就会在调用位置展开,即该函数是没有地址的,也不能在其他源文件中调用,故一般都是直接在源文件中定义内联函数的。3.inline函数会在调用的地方展开时,符号表中不会有inline函数的符号名,故不存在链接冲突。因此可以在一个项目的不同源文件内写相同函数名的内联函数。因为inline只是一种建议,需要看此函数是否能够成为内联函数。例如,比较长的函数,递归函数就算定义为inline,也会被编译器忽略.

2024-03-13 20:17:07 405

原创 Linux基本常识

这两者本质都是因此,只是创建空文件,也需要占用磁盘空间,因为此时已经具有文件属性。而对文件操作方式有两种,一种是,另一种是。

2024-03-13 20:12:04 517

原创 C++模板 易错点

8.C++中类模板的声明格式为template<模板形参表声明><类声明>,并且。5.上题,A通过参数推导,T为int,不存在二义性,调用正确;C.通过参数推导,T为float,不存在二义性,调用正确;,用于指定大小,可以根据指定的大小创建动态结构。14.模板类是一个家族,编译器的处理会分别进行。B.由于参数类型不一样,模板不支持类型转换,4.只要支持模板语法,模板的代码就是。10,如上,三种正确的模板声明方式。2.模板最重要的一点就是类型无关,3.模板运行时不检查数据类型,也。,相当于类型的宏替换。

2024-03-09 13:47:50 416

原创 C++内存分配 易错点

8.上题,申请对象数组,会调用构造函数5次,delete由于没有使用[],此时只会调用一次析构函数,但往往会引发程序崩溃。9.上题,与8不同,对于内置类型,此时delete就相当于free,因此不会造成内存泄漏。但是从代码习惯角度建议加上[]。7.栈可以通过函数_alloca进行动态分配,不过注意,所分配空间不能通过free或delete进行释放。主要存在局部变量和函数参数,其空间的管理由。4.32位系统下,最大的访问内存空间为。是自己申请的空间,在不需要时需要。频繁的申请空间和释放空间,

2024-03-09 13:37:20 403

原创 构造函数:初始化列表 篇

在学习初始化列表之前,我们通常在构造函数中为函数赋初值,但这行为并不能称为初始化。因为初始化具有唯一性,只能初始化一次,而构造函数体内可以多次赋值。因此我们引入初始化列表对类进行初始化。初始化列表:以一个冒号开始,接着是一个以逗号分隔的数据成员列表,每个成员变量后面跟一个放在括号中的初始值或表达式。int _month;int _day;

2024-03-05 20:19:01 425

原创 C++ Date类型定义 (类的简单实践案例)

【代码】C++ Date类型定义 (类的简单实践案例)

2024-03-04 22:39:55 504

原创 类与对象详解 C++ (1)

class为定义类的关键字,ClassName为类的名字,{}中为类的主体,注意类定义结束时后面分号不能省略。// 类体:由成员函数和成员变量组成// 一定要注意后面的分号。

2024-03-03 21:35:00 438

原创 C语言 宏的优缺点

所以在C++中引入了内联函数的概念。用inline进行修饰。编译时编译器会在调用内联函数的地方展开。引入:当我们需要频繁调用一个函数时,在C语言中会如何实现呢?2.导致代码可读性差,可维护性差,容易误用。宏是在预处理阶段进行替换。3.没有类型安全的检查。1.增强代码的复用性。

2024-02-27 21:11:01 605

原创 引用 C++

注意:需要出了函数作用域、返回值对象还在,才可使用引用返回。给已经存在的变量取别名。和其指向的对象共用一块储存空间。语法:类型& 引用对象名=引用实体;引用在底层上也是指针,实际上都开了空间。b.对象比较大,减少拷贝,提高效率。引用不开空间,指针开空间。b.减少拷贝,提高效率。a.可以修改返回对象。

2024-02-27 20:54:23 487

原创 函数重载 C++

在同一作用域中声明几个功能类似的同名函数,这些函数的形参列表不同(个数或类型)例如:在Linux环境下。

2024-02-26 22:12:16 561

原创 缺省参数(默认参数)

原因:函数在编译阶段进行检查语法、生成汇编语言的工作。如果有多个文件,在编译之前的预处理展开头文件,声明写在“.h”文件里面在编译阶段可以被看见,不会报错。如果写在对应“.c”文件的定义里,编译的时候无法看到,就会报错。定义里的东西在链接的时候才会被编译器读到。使用规则:如果调用时没有实参则用缺省值,有则用指定实参。概念:定义或声明函数时为函数的参数指定一个缺省值(默认值)。半缺省参数:部分有缺省值。*必须从右往左依次给出缺省值。全缺省参数:每个参数都有缺省值。

2024-02-26 22:02:04 425

原创 计数排序C语言

【代码】计数排序C语言。

2024-02-01 14:31:57 358

原创 归并排序C语言实现

【代码】归并排序C语言实现。

2024-02-01 14:17:49 420

原创 直接插入排序和希尔排序

这样整体而言,可以达到优化的效果。我们实现后可以进行性能测试的对比。的取值方法很多,导致很难去计算,因此在好些树中给出的。元素集合越接近有序,直接插入排序算法的时间效率越高。希尔排序法又称缩小增量法。时都是预排序,目的是让数组更接近于有序。的排序码顺序进行比较,找到插入位置即将。总结:冒泡排序就是gap为1的希尔排序。希尔排序是对直接插入排序的优化。时,数组已经接近有序的了,这样就。希尔排序的时间复杂度不好计算,因为。插入,原来位置上的元素顺序后移。,它是一种稳定的排序算法。

2024-01-02 14:34:10 411

原创 设计循环队列

循环队列的一个好处是我们可以利用这个队列之前用过的空间。在一个普通队列里,一旦一个队列满了,我们就不能插入下一个元素,即使在队列前面仍有空间。但是使用循环队列,我们能使用这些空间去存储新的值。设计你的循环队列实现。循环队列是一种线性数据结构,其操作表现基于 FIFO(先进先出)原则并且队尾被连接在队首之后以形成一个循环。它也被称为“环形缓冲器”。

2023-12-23 00:45:42 1386

原创 顺序表和链表

缺点:难以确定需要开辟的大小N,给小了不够用,给大了浪费,不实用,价值小。的储存单元依次存储数据元素的线性结构,一般情况下采用。线性表是n个具有相同特性的元素数据的有限序列,在。1.原地删除数组中的所有元素val。例如:开辟大小为N=7的顺序表。、非顺序的存储结构。顺序表和链表都属于线性表。2.删除排序数组中的重复项。3.合并两个有序数组。

2023-12-19 11:00:43 462

原创 自定义类型详解:结构体,枚举,联合

3.char 1个字节 4+4+1 但是总空间要是最大对齐数的整倍数,这里最大对齐数是int的4 所以应该是4的整倍数,即12。1.联合的成员是共用同一块内存空间的,这样一个联合变量的大小,至少是最大成员的大小(因为联合至少得有能力保存最大的那个成员)。结构的每个成员可以是不同类型的变量。如果嵌套了结构体的情况,嵌套的结构体对齐到自己的最大对齐数的整数倍处,结构体的整。2.当最大成员大小不是最大对齐数的整数倍的时候,就要对齐到最大对齐数的整数倍。体大小就是所有最大对齐数(含嵌套结构体的对齐数)的整数倍。

2023-09-25 11:35:07 67

原创 内存函数简单介绍

函数作用:把从source开始的num个字节的内容拷贝到从destination开始的空间里。返回destination的起始地址。使用方法:假设有一个字符串叫arr,把她从第四个位置开始的六个字节大小的空间的内容都放上x。警示:最好不要用来处理重叠内存,可能会在拷贝过程中发生重叠使得结果不符合预期。相对于memcpy,可以处理重叠内存的拷贝。函数模拟:需要根据源头和目的地的先后位置关系来分类讨论。优点:相比于strcpy,可以处理更多类型的数据。返回值的规律类似于strcpy。以字节为单位设置内存。

2023-09-21 16:09:46 55

原创 数据结构(1)时间复杂度

时间复杂度

2023-07-25 09:39:00 133 7

原创 5.27 数据在内存中的储存

字符储存的时候,存储的是ASCII码值,是整型,所以放在整型家族。1 2 4 4/8 8 4 8 单位是字节。5.27 数据在内存中的储存。有符号无符号 只针对整型家族。C语言直接提供的类型。

2023-05-31 17:24:28 109

原创 5.24 初阶测评讲解

后置++ p++解引用是*p 还没++5.24 初阶测评讲解。前一个恒为真,=是赋值。注释会被替换成空格。早期c是没有库函数的。

2023-05-30 23:23:02 68

原创 实用调试技巧(2)

int转化为无符号整型,-1会转化为 特别大的整数。断言 宏 括号内为假就报错 assert。左边debug 右边release。Const 左限制*p 右限制p。语法问题,链接期间发生的错误。5.22实用调试技巧(2)返回目标空间的起始地址。

2023-05-30 20:30:07 60

原创 指针初阶(2)+初试结构体

但是同样也限于两个相同类型的指针变量,不同类型的指针变量之间比较大小没有任何意义。指针之间的大小比较的意义,表示在内存中他们指向的位置的高低关系。指针变量就是指针变量,不是数组,指针变量大小是4/8个字节,专门用来存放地址的。结构是一些值的集合,这些称为成员变量,结构的每个成员可以是不同类型的变量。数组是一块连续的空间,可以存放1或多个类型相同的数据。联系:数组名是数组首元素地址,数组名==地址==指针。name是数组名字,为地址,所以报错。数组是可以通过指针来访问的。指针数组:存放指针的数组。

2023-05-29 17:55:35 60

原创 指针初阶(2)+初试结构体

但是同样也限于两个相同类型的指针变量,不同类型的指针变量之间比较大小没有任何意义。指针之间的大小比较的意义,表示在内存中他们指向的位置的高低关系。指针变量就是指针变量,不是数组,指针变量大小是4/8个字节,专门用来存放地址的。结构是一些值的集合,这些称为成员变量,结构的每个成员可以是不同类型的变量。数组是一块连续的空间,可以存放1或多个类型相同的数据。联系:数组名是数组首元素地址,数组名==地址==指针。name是数组名字,为地址,所以报错。数组是可以通过指针来访问的。指针数组:存放指针的数组。

2023-05-29 17:55:04 58

原创 操作符详解(2)

c的整型算术运算总是至少以缺省整型类型的精度进行的。为了获得这个精度,表达式中的字符和短整型操作数在使用之前被转化为普通整型,这种转换称为整型提升。算术转换:如果某个操作符各个 操作数属于不同的类型,那么除非其中一个操作数的类型转换为另一个操作数的类型,否则操作就无法进行。逗号表达式:从左向右计算,整个表达式的结果是最后一个表达式的结果。表达式求值:1.表达式在计算过程中有哪些类型转换?a和b都进行了有符号位的提升,因此不等,c不用 进行提升。整型提升是按照变量的数据类型的符号位来提升的。

2023-05-14 22:30:23 64

原创 操作符详解(1)

首先不管是正整数还是负整数都可以写出二进制原码:根据正负直接写出的二进制序列就是原码。右移:1.算术右移:右边丢弃,左边补符号位 2.逻辑右移:右边丢弃 ,左边直接补0。②负整数原码反码补码需要计算 符号不变,其他位按位取反-反码 反码 +1-补码。<<左移操作符 >>右移操作符 移动的是二进制 操作数必须为整数。整数在内存中使用的是补码,计算时也是使用补码计算的。除法:1.整数除法(除号的两端都是整数)%:取模操作符的两个操作数必须位整数。最高位是符号位,1为负数,0为正数。

2023-05-10 21:43:14 52

空空如也

空空如也

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

TA关注的人

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