- 博客(30)
- 收藏
- 关注
原创 在线音乐播放测试报告
本次测试主要针对在线音乐系统,目标是确保系统各个功能模块正常运行,涵盖登录、音乐操作(添加喜欢、删除喜欢、上传、查询等)功能的正确性与稳定性。测试任务包括对这些功能的手动功能测试以及部分模块的自动化测试。
2025-06-23 18:35:31
547
原创 软件测试——开发模型
增量开发模型,鼓励用户反馈,在每个迭代的过程中,促使开发小组以一种循环的、可预测的方式驱动产品的开发,因此每一次迭代都可能有需求的更改,构建出新的可执行版本,需要测试频繁进行,所以很需要测试人员和开发人员的紧密协作。,换句话来说,没有瀑布模型,就没有剩下的东西,而瀑布模型的特点就是每一个阶段只能执行一次,因此是线性顺序进行开发模型。,因此,测试是后置的,可能在前面有很多的错误到最后才开始测试,会失去及时早修复的机会,导致项目大面积返工。增量模型和迭代模型区别,增量是逐块建造的概念,迭代是返回求精的概念。
2025-05-12 21:12:43
723
原创 常见的锁策略
公平锁讲究的是“先进先出”,而非公平锁就不讲究“先进先出”。而在线程调度这边,是随机调度的,我们可以认为这是不公平的,如果想要让其变公平,则需要通过一些额外数据结构,记录其线程调度顺序,来让其公平,否则就不行。例如在生活职场上,有一个比较重要的项目需要小组去做,而在流程进行中,有一些东西需要请示领导,而在这个时候有俩个员工,分别是员工A和员工B都需要去请示一次领导,员工A认为领导是比较忙的,所以在员工需要。(相当于加锁操作),得到肯定的答复之后,才会去领导的办公室进行商讨,如果得到的是否定的答复,那么就。
2025-03-28 21:55:48
636
原创 多线程——单例模型、阻塞队列
在上面图中,生产的速度是一秒一个,而消费的速度是三秒一个,但阻塞队列的大小为4,所以当生产元素减去消费元素>=4的时候,就会进行阻塞,直到差值小于4.而我们对于阻塞队列中有关的的有生产者消费者模型,这个案例十分典型,解释一下什么是生产者消费者模型,在一个阻塞队列中,生产速度大于消费速度,那么当。,直到保证生产量和消费量的差值比阻塞队列的大小还小,这样就能做到生产者和消费者之间的硬性平衡。,有一点十分注意的是,阻塞队列中有offer的方法,但使用这个是不会被阻塞的,就会变成一个普通的队列。
2025-03-07 00:48:38
863
原创 线程安全——wait()和notify的使用
我们可以发现,线程t1里面的东西因为wait()等待而没被执行到,下面t2、t3线程都被执行到了,而有参数的wait可以通过参数的时间等待执行一次。方法来让线程等待,我们可以用同一个Object类来用wai()方法进行等待,也可以用多个Object()类来进行。wait是Object的方法,sleep是Thread的静态方法。方法需要notify来进行唤醒,如果有参数就是需要满足时间条件唤醒(一个参数是毫秒参数,俩个参数第一个参数是。,也就是把线程放到等待队列中。方法暂停执行,等待条件满足再被唤醒。
2025-01-20 22:17:35
1144
原创 线程安全问题
在count=0的时候,分别执行了一次thread1和thread2,我们预想的结果是count=2,不巧的是,在执行的过程中thread1和thread2的值拿到的都是原先的count=0的值,所以它们俩个修改原先的值都修改变成1,所以结果也是1。按顺序来看,先执行1,再执行2,但通过重排序可能会变成先执行2,再执行1,这样会导致一个问题, 其他线程再还没执行value=1这个步骤的时候,就读取initiallize=true,此时value还是为0,这样就出现了错误。
2025-01-12 21:37:05
799
原创 线程的状态
在图解中,我们可以知道,状态可以相互转化以及转化所需要的条件,在代码中调用即可,这就是线程状态之间的转移。来源就是因为线程在启动中,但每隔俩秒运行一次,而现在的线程就在这俩秒内,而主线程执行完毕之后线程也就结束。在主线程中每隔俩秒打印一个hello thread,而在线程还没start的时候,就执行。,获得的是还没启动的线程,所以是NEW状态,而在启动后,线程就会执行或者等待执行的状态,而在屏幕上的。对于线程之间的状态,是可以转移的,比如。状态,RUNNABLE状态可以转移到。WAITING(等待)
2024-12-22 02:39:13
404
原创 Thread类常见的使用方法
休眠线程一般用俩种,第一种是sleep()方法,第二种是wait/notify方法,第一种在前面代码中有解释,sleep里面的参数为多少毫秒,而第二种wait(),wait分为三类,第一类是无参数,需要靠notify唤醒,第二类为一个参数,多少之后自己被唤醒,参数单位为毫秒,第三类为俩个参数,也是自己被唤醒,第二个参数也是纳秒,因为第二类和第三类和sleep有点像,我们重点说一下第一类。1、第一个常见的属性就是ID,在线程中的方法是getId(),顾名思义,id是线程的唯一标识,不同的线程不会重复。
2024-11-25 12:49:10
1392
1
原创 线程和进程之间的理解
进程是什么?简单来说,一个运行起来的程序,就称为进程。而进程在计算机的定义是进程是操作系统资源分配的基本单位。站在操作系统的视角,如何管理进程呢?首先,我们要描述一个进程是什么样子的,使用结构体,描述出进程的核心属性(通过进程控制块(PCB)来做,因为这个是一个非常大的结构体,里面是有很多很多的属性的),然后把多个进程组织起来。就好比一个进程是一位同学,而进程控制块(PCB)里面里面内容就好比学生的学号、姓名、性别、班别这些,然后班级作为结构体,管理这一群学生。
2024-11-16 01:48:33
890
1
原创 mysql——关于表的增删改查(CRUD)
注意:跟在order by后面的列必须要在select查找范围之内,其次,order by列名后面默认是ASC(升序),而降序需要添加DESC,这个降序DESC和查看表结构的词相同,但意思不同。这个用法也是十分容易的,AND和OR就是一个与和或的概念,比如:我们查找俩个内容,第一个内容是查找语文和数学高于六十分的同学,第二个内容就是查找语文或者数学低于六十分的人。别名的用法只需要在需要修改的名字后面加别名就行,as也可以不加,例如:我需要查看表中的id、sn、name,且别名分别为序号、学号和名字。
2024-09-09 22:46:19
969
原创 mysql——关于表与库的基础操作
desc 表名称(注意desc不止有查表结构的用法,还有在排序中降序的用法)字段1 数据类型 comment '注释',字段2 数据类型 comment '注释'()注意数据库名如果是关键字需要加单引号;drop database 数据库名;展示数据库的指令就是。创建表的基本语法——(注意databases是复数);
2024-08-13 20:01:40
456
原创 数据结构——时间和空间复杂度
一个工厂需要制造300件衣服,而制造衣服的机器只有10台,制造一件衣服的时间是1一个小时,那么制造300件衣服就需要30个小时,而如果机器有30台,那么制造衣服所花的时间就是10个小时,而对于计算机也是一样,我们把机器个数也可以说是空间,而一共需要完成这件事的时间也叫时间,而时间复杂度和空间复杂度也类似。3、如果最高阶的项存在而且不是1,则去除与这个项目相乘的常熟,得到的结果就是大O阶。总的来说,时间复杂度和空间复杂度的规则是一样的,而空间复杂度要注意的就是被回收的空间是不作为空间复杂度里面的空间。
2024-08-04 21:36:31
1199
原创 JAVASE——异常
我们以登录密码这个案例为例。抛出异常代码:if (!throw new UserNameException("用户名错误");if(!throw new passwordException("密码错误");System.out.println("登录成功");我们可以了解到,自定义使用异常的时候,我们需要先throws声明异常先,然后再通过代码里面throw抛出异常进行打印。有几个注意事项:1、自定义异常通常是继承Exception或者RuntimeException。
2024-07-25 20:57:17
925
原创 面向对象三大特性之一——多态
那么就只能把父类看成子类,把子类看成父类,这种向下转型就能做到,通过向下转型又能使用到自己的东西,但必须要注意的是,,然后父类可以使用子类的东西,但是有一个缺点,就是有可能会转型失败,因为子类继承父类的东西,修饰符范围父类有可能比子类低,所以可能转型会失败。通过向上转型,被实例化的子类可以直接调用父类的东西,run()方法是在子类没有的,但可以直接使用父类的。,但如果子类重写过父类的东西,那么子类通过引用父类方法得到的结果确实子类方法的结果,什么意思呢?重写的好处就是,子类可以根据需要,重写父类的内容。
2024-07-07 00:56:21
1178
1
原创 Java面向对象的三大特性之一——继承
这是一个很重要的问题,对于这个问题,在Java里面提供一种解决方法,那就是写一个派生类,里面写出它们的共有的方法和成员变量,而其他方法只需要继承这个这个类就行,这样就实现。我们前面讲到过this关键字的使用,this.属性名的方法指代的是当前对象的属性名,this()的方法是指代当前对象的构造对象,总的来说,this关键字就是用来指代当前对象,而。在Java种不支持多继承,还有一点注意的就是,对于继承之间的层次太复杂,一般我们不希望超出三层的继承关系,如果继承层次太多,就需要考虑对代码进行重构了。
2024-06-20 21:57:49
784
原创 String类知识
StringBuilder和StringBuffer的使用需要创建对象,不像String类那样可以直接//会报错打印出来结果是:那么它们有什么不同呢?方法说明在尾部追加,相当于String的+=,可以追加:boolean、char、char[]、double、float、int、long、Object、String、StringBuff的变量获取index位置的字符获取字符串的长度获取底层保存字符串空间总的大小扩容将index位置的字符设置为ch返回str第一次出现的位置。
2024-06-06 22:10:06
937
原创 java面向对象三大特性之一——封装
自定义包方法:我们通过src new一个包然后输入名字就可以使用,包也是一个文件夹,也可以在文件夹中新建一个文件夹也是一个包。导入包之后我们在包里面写项目内容就会自动导入该包。
2024-05-29 22:22:20
865
原创 类和对象
类是用来对一个实体(对象)来进行描述的。主要描述该实体具有哪些属性,那些功能,好比我说一个学生类,一个学生有姓名、年龄、性别、学号,那么姓名、年龄、性别、学号这些就是类的属性,那么我们用Java语言如何去定义一个类呢?首先我们要了解定义类的格式this调用就是引用指向当前对象(成员方法运行时调用该成员方法的对象),在成员方法中所有成员变量的操作,都是通过该引用去访问。简单来说,this就是调用成员方法的对象,而具体的this调用在上述代码中讲到,我们来讲一下this使用的注意事项。
2024-05-23 23:43:33
630
1
原创 运算符(下)
由于byte是有符号的数,所以第一位是符号位,而第一位为1的话,那么这个数是一个负数,补码10101010的原码是11010110,也就是-86。我们可以发现,俩个二进制数按位与,俩个为1结果为1,我们发现结果也是八十五的二进制;右移操作就是最右侧为不要了,最左侧补符号位,如果原先是正数,则补0,如果是负数,则补1;按位取反是直接讲原先的二进制0和1变成1和0,以代码为例。当表达式1的值为false时,整个表达式的值为表达式3的值;当表达式1的值为true时,整个表达式的值为表达式2的值;
2024-05-14 21:25:42
860
2
原创 运算符(上)
我们来分析一下,第一个--a是先--后使用,所以a=1-1就是为0,第二个++a就是先++后使用,所以a=0+1就是为1,第三个就是先使用后--,先使用,此时a为1,所以打印是1,然后--,a就为0,最好一个a++,也是先使用后++,因为上一次的a--为0,所以打印的是0,打印完之和a++,所以a又为1。会跟我们说不能除0,但是我们运行的时候可以继续运行,是因为我们执行了短路求值,a>b为假之后,那么整个表达式为假,所以不会再去执行第二个表达式,所以第二个表达式没被执行,也就没有报错。
2024-05-07 23:06:20
697
原创 Java基本数据数据类型
java数据类型主要分为俩大类,一类是基本数据类型,一类是引用数据类型(类class引用,接口interface引用和数组引用等),我们重点说一下Java基本数据类型。
2024-05-01 22:51:44
49
原创 自定义类型:结构体
对于char c1来说,默认对齐数是1,因为char只占一个字节,而对于int i来说,int占四个字节,和vs默认8来比更小,所以默认对齐数是四,所以i的偏移量必须是4的倍数,那么中间三个字节浪费了,c2也是一样,所以一共有六个字节浪费掉了,所以一共使用了十二个字节。4、如果嵌套了结构体的情况,嵌套的结构体成员对⻬到⾃⼰的成员中最⼤对⻬数的整数倍处,结构 体的整体⼤⼩就是所有最⼤对⻬数(含嵌套结构体中成员的对⻬数)的整数倍。打印的结果就是6,因为我们把默认对齐数变为1,那么i的偏移量为1的倍数就行。
2024-03-30 23:31:39
750
1
原创 整数和浮点数的存储
因为已经超出了范围,当c=255时,c的补码为11111111,而当c=256时,变为100000000,但char类型只能保存8个比特位,所以1就溢出,256就变成了00000000,257则变成了00000001,所以c=1;而对于无符号整形的存储方式其实和有符号整形的图是一样的,不同的是,无符号整形没有符号位,只有数值位,所以无符号整形没有负数,为了更好的说明,我们还是以unsigned char作为一个参照:(以图为例)(-1)^S表示符号位,当S=0,V为正数,当S=1,v为负数。
2024-03-29 17:38:58
826
1
原创 内存函数以及大小端存储问题
根据图我们可以知道,memcpy一共传了三个参数,第一个是目的参数,也就是被复制到的地方,第二个就是复制的值来源,而我们是不期望该值被修改的,所以在该值加上了const,第三个参数是拷贝的字节参数,这个是实现方法,但在vs里面memcpy和memover都是可以当作一样的,因为内部实现基本一样,但在其他的编译器不行。这个是使用办法和运行结果,而使用这个函数,只需要有一个目的参数,复制的参数和需要复制的大小即可,而我们也可以把它们实现出来,下面我们来说一下这个函数该如何使用吧。注意是字节,不是元素个数。
2024-03-25 21:35:37
1242
1
原创 指针详细讲解(下)
如图,我们可以知道函数指针的调用方法,而且,函数指针有一点奇特的是,变量名可以不加解引用符号,就像图中pf3和(*pf3)效果是一样的,因为函数本身也是一个地址也可以是一个变量,所以我们使用的时候可以不加解引用符号。arr+1和&arr[0]+1所在的位置是第二行第一个元素的位置,因为arr+1和&arr[0]+1是跳过一行的地址,而&arr[0][0]+1只是跳过一个元素,而&arr+1还是老样子,直接跳过整一个数组。函数指针类型解析如图,定义也如图,而函数指针指向的也是地址,那如何使用呢?
2024-03-17 13:30:17
1881
1
原创 指针详细讲解(上)
另外对于代码来说,一个字节占八个比特位,代码我们都是以十六进制来编写,所以每一个数字占四个比特位,而0x12345678一共占了32个比特位,也就是4个字节,所以*p1能将n全部变为0,而*pc一个字节只有八个比特位,也就只能把8/32变成0;对于代码的严谨性,assert()宏的断言还是十分有必要的。每一个内存里面有许多的内存单元的比那好,也成为地址,在c语言中也叫指针,而一个内存单元大小取1个字节,不同的变量类型取不同的地址大小,例如:int类型取四个字节,char类型取一个字节,值得注意的是,
2024-03-11 21:15:34
984
原创 printf()和scanf()详细用法
而值得注意的是,除了%c,其他都会自动忽略棋手的空白字符;而占位符%s,规则是,从当前第一个非空白字符开始读起,直到遇到空白字符(即空格、换行符、制表符等)为止。其中 %d作为该语句的占位符可以在后面用符合该占位符的值替换 ,如果不符合,则会报错 ,而占位符也可以一句连用多个。和printf有点类似,都是需要占位符和参数,其中参数中要携带地址,而&符号就是取地址的意思 ,同时也可以一次读多个变量,例如。%[] :在方括号中指定一组匹配的字符(比如 %[0-9] ),遇到不在集合之中的字符,匹配将会。
2024-02-16 13:57:17
2187
1
原创 扫雷(如何实现加讲解)
目录:1、扫雷的游戏规则2、创建游戏菜单3、包含的头文件实现4、创建游戏过程:(1)、初始化扫雷页面(2)、打印扫雷页面(3)、布置雷过程(4)、计算附近雷个数(5)、排查雷个数。
2024-02-05 12:11:20
407
1
原创 分支循环语句操作符以及其用法
循环类型执行区别适用范围while先判断,后执行适用于大部分先判断条件的语句do while先执行后判断适用先执行语句的范围,比如需要先调用一次外部函数,再执行的语句for先判断,后执行和while一样,但个人觉得比while更方便。
2024-01-27 12:03:16
830
原创 初入编程之路,深入探究未来
首先,能够熟练的掌握编程语言的语法、结构等;除去上课以及看视频,最好能保持有十四小时学习时间,平均每天都有俩个小时动手时间,当然可以周末更长一点,工作日没这么多时间可以稍微减缓一点,但需要每天都有动手的时间,以防生疏。同时,我认为这条编程之路也会充满着趣味性,会指引着我不断探索研究它,从而一步一个脚印走下去。4、多点写代码,不断提升自己的能力,如果没有很好的办法看项目,可以去知乎和csdn看看能不能无偿接单,提升自己实力。而对于就业目标,我也由衷的喜欢我能够成为一名全栈工程师,我也会不断朝着这么目标前进。
2024-01-16 21:12:26
371
1
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人