自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 【JavaEE】多线程安全问题

线程是随机调度,抢占式执行,这样的随机性会使程序的执行顺序产生变数,从而产生不同的结果,但是有时候,遇到不同的结果,认为不可接收,认为是bug多线程代码引起的bug,这样的问题就是“线程安全问题”存在“线程安全问题的代码”,就称为“线程不安全”i < 50000;});i < 50000;});

2024-05-04 20:30:15 1451 24

原创 【JavaEE】多线程的等待与状态

先创建thread1线程,再创建thread2线程,thread1没有阻塞直接执行代码,而thread2遇到阻塞,等待thread1执行完毕之后,thread2解除阻塞,由于main线程阻塞,所以要等待thread2线程执行完毕,当thread2线程执行完毕之后,main线程解除阻塞,执行main线程中的代码。join()方法是Thread类的一个方法,用于让一个线程等待另一个线程执行结束,当一个线程调用join()方法时,当前线程就会阻塞,直到被调用的线程执行结束。指的是,这个线程“随叫随到”,

2024-05-02 20:13:17 1566 7

原创 【JavaEE】Thread的方法和属性

在Java代码中,main线程是前台线程,程序员创建出来的线程在默认情况下都是前台线程,我们可以通过setDaemon方法把线程设置为后台线程。

2024-05-02 14:39:51 1191 9

原创 【JavaEE】线程的概念

线程是进程中实际执行的最小单位,在一个进程中,可以存在一个或者多个线程,同一个进程中的若干线程之间,是共用相同的内存资源和文件资源,线程是系统调度执行的基本单位利用线程可以解决进程创建/销毁开销大的问题线程thread也被称为“轻量级进程”创建/销毁开销小线程比进程更轻量,核心在于创建进程可能要包含多个线程,在这个过程中涉及到资源分配/资源释放,创建线程相当于资源已经有了,省去了资源分配/释放步骤。

2024-05-01 21:50:49 966 6

原创 【JavaEE】进程的概念

一个程序,运行起来/跑起来,在操作系统中就会出现一个对应的进程进程就是一个跑起来的应用程序除了上述自己运行起来的应用程序是进程之外,还有一些是系统自带的/安装某些程序,给你添加的,这些进程对于你的系统能够稳定运行有很重要的意义要想让一个程序能够稳定运行,就必须得给这个进程分配系统资源,包括不限于cup,内存,硬盘,网络带宽,显卡…进程也可以视为操作系统进行资源分配的基本单位在操作系统中包含了许多的进程,一旦进程多了我们就要进行管理,对于管理我们通用的做法是,先组织,再描述。

2024-05-01 21:49:43 421 5

原创 【MySQL】查询(进阶)

在前面的内容中我们已经把查询的基本操作介绍的差不多了,接下来我们就要介绍一些更加复杂的查询操作。

2024-04-21 20:52:02 1363 26

原创 【MySQL】表的基本约束

上述图片中用红色圈起来的地方就是加上unique约束之后,每次插入/修改都会需要先进行查询,如果发现重复(已经存在)就会插入/修改失败,加上unique之后执行效率就会降低,对数据的校验更严格,有助于写代码的时候减少出错的概率(提高开发的效率)表的设计是一个比较抽象的概念,有了一定经验后,会更好理解,结合后期的项目设计,再来理解表的设计,可能会更好,这里我们简单介绍一下常见设计。此时,就把class表,制约别人的表,也称为“父表”(parent table)一个班级对应多个学生,一个学生对应一个班级。

2024-04-19 20:44:37 901 13

原创 【MySQL】增删改查操作(基础)

delete 的操作,后面的条件是可以跟 update 一样的,支持 where,order by,limit 等操作。搭配offset关键字,offset称为偏移量(相当于下标),offset默认是从0开始的。在我们的数据库中,用insert into来进行新增操作,首先我们需要一张表。order by 也可以指定多个列排序,通过多个列排序约定更复杂的比较规则。为查询结果中的列指定别名,表示返回的结果集中,以别名作为该列的名称。也可以按照别名的方式进行order by直接表达式是一样的。

2024-04-06 11:18:41 1976 20

原创 【MySQL】数据库基础

数据库是一类软件,是对数据进行高效的组织,数据库是基于数据结构实现出来的软件,内部会用到很多数据结构的东西数据库大概可以分为两类:上述所说的都是软件,以下所讲的都是SQL这门编程语言,去操作MySQL数据库。

2024-04-05 18:02:20 988 10

原创 【Java】哈希表

哈希表的长度没有扩容是定长的,即 α 与 元素的个数是成正比的,当 α 越大,即代码哈希表中的元素个数越多,元素越多,发生哈希冲突的概率就增加了,因此 α 越小,哈希冲突的概率也就越小。通过key获取到index的位置,这个位置可能没有元素,可能是一条链表,但链表中也可能不存在key,也可能存在 key,如果 index 位置没有元素,或者遍历 index 位置都没找到 key,那么就返回 null,找到了即返回 key 对应的 value 值即可。因此只要表中有一半的空位置,就不会存在表满的问题。

2024-03-26 11:16:17 1820 26

原创 【Java】Map和Set

Map.Entry 是Map内部实现的用来存放键值对映射关系的内部类,该内部类中主要提供了的获取,value的设置以及Key的比较方式。可能在查找时进行一些插入和删除的操作,即动态查找,那上述两种方式就不太适合了,下面介绍的Map和Set是一种适合动态查找的集合容器。6.Map中键值对的Key不能直接修改,value可以修改,如果要修改key,只能先将该key删除掉,然后再来进行重新插入。梁山好汉的江湖绰号:每个好汉都有自己的江湖绰号。

2024-03-23 15:24:27 1229 15

原创 【Java】二叉搜索树

插入和删除操作都必须先查找,查找效率代表了二叉搜索树中各个操作的性能。对有n个结点的二叉搜索树,若每个元素查找的概率相等,则二叉搜索树平均查找长度是结点在二叉搜索树的深度的函数,即结点越深,则比较次数越多lognn/2注意:二叉搜索树不要求是完全二叉树或满二叉树,甚至会出现单分支的二叉搜索树,所以针对这种特殊的情况进行了优化也就延申出了AVL树,当发现二叉搜索树左右子树高度差太大,会自动旋转,以致平衡,避免旋转的次数太多,又引入了红黑树,给节点增加了颜色,细节部分后期讲解,这里有个概念即可。

2024-03-23 00:12:03 1251 11

原创 几大常用的排序算法

3、在走的过程中,若right遇到小于key的数,则停下,left开始走,直到left遇到一个大于key的数时,将left和right的内容交换,right再次开始走,如此进行下去,直到left和right最终相遇,此时将相遇点的内容与key交换即可。这里的稳定性指假定在待排序的记录序列中,存在多个具有相同的关键字的记录,若经过排序,这些记录的相对次序保持不变,即在原序列中r[i]=r[j],且r[i]在r[j]之前,而在排序后的序列中,r[i]仍在r[j]之前,则称这种排序算法是稳定的;

2024-03-15 16:06:39 1305 25

原创 【数据结构】之优先级队列(堆)

大根堆的特点是根节点的元素始终比左右子树都要大,所以我们要调整这棵树,是需要将较小的根的从上面下降至下面,简称。(2).如果2 * i + 1 小于节点个数,则节点i的左孩子下标为2 * i + 1,否则没有左孩子。(3).如果2 * i + 2 小于节点个数,则节点i的右孩子下标为2 * i + 2,否则没有右孩子。(1).如果i为0,则i表示的节点为根节点,否则i节点的双亲节点为 (i - 1)/2。(2).插入元素的位置是插入在数组的末尾,即树的最后一个结点。(3).插入的元素要进行向上移动的操作。

2024-03-02 14:16:34 1672 25

原创 二叉树【Java】

树是一种非线性的数据结构,它是由n(n>=0)个有限结点组成一个具有层次关系的集合。**把它叫做树是因为它看起来像一棵倒挂的树,也就是说它是根朝上,而叶朝下的**。

2024-01-17 20:55:17 1498 27

原创 栈和队列的实现(Java篇)

栈: 一种特殊的线性表,其只允许在固定的一端进行插入和删除元素操作。进行数据插入和删除操作的一端称为栈顶,另一端称为栈底。栈中的数据元素遵守后进先出LIFO(Last In First Out)的原则压栈:栈的插入操作叫做进栈/压栈/入栈,入数据在栈顶出栈:栈的删除操作叫做出栈。出数据在栈顶栈是一个特殊的顺序表,所以采用链表和数组的方式都可实现,但是,一般采用数组的方式实现创建一个类:2.1压栈(push)在入栈之前我们要判断栈是否满了,如果满了就要进行扩容2.2出栈(pop)同样在出栈的时

2023-12-17 11:11:07 814 25

原创 Java中的链表

在前面我们已经学习了关于顺序表ArrayList的一些基本操作。通过源码知道,ArrayList底层使用数组来存储元素,由于其底层是一段连续空间,当在ArrayList任意位置插入或者删除元素时,就需要将后序元素整体往前或者往后搬移,时间复杂度为O(n),效率比较低,因此ArrayList不适合做任意位置插入和删除比较多的场景。因此:java集合中又引入了LinkedList,即链表结构。

2023-12-15 00:01:44 722 21

原创 【Java】实现顺序表基本的操作(数据结构)

在了解顺序表之前我们要先了解什么是线性表,线性表(linear list)是n个具有相同特性的数据元素的有限序列。线性表是一种在实际中广泛使用的数据结构,常见的线性表:顺序表、链表、栈、队列…线性表在逻辑上是线性结构,也就说是连续的一条直线。但是在物理结构上并不一定是连续的,线性表在物理上存储时,通常以数组和链式结构的形式存储在集合框架中,ArrayList是一个普通的类,实现了List接口,具体框架图如下:1.ArrayList是以泛型方式实现的,使用时必须要先实例化。

2023-12-06 22:46:18 1875 17

原创 【Java】泛型的简单使用

就是适用于许多许多类型。就是指定当前的容器,要持有什么类型的对象,让编译器去做检查class 泛型类名称 {// 这里可以使用类型参数class 泛型类名称 extends 继承类/* 这里可以使用类型参数 */ {// 这里可以使用类型参数// 可以只使用部分类型参数//1//2//31.类名后的< T >代表占位符,表示当前类是一个泛型类【规范】类型形参一般使用一个大写字母表示,常用的名称有:E 表示 Element。

2023-11-29 20:41:52 987 21

原创 【Java】认识异常

Java 中虽然已经内置了丰富的异常类, 但是并不能完全表示实际开发中所遇到的一些异常,此时就需要维护符合我们实际情况的异常结构实现一个用户登录功能:具体方式:1.自定义异常类,然后继承自Exception 或者 RunTimeException2.实现一个带有String类型参数的构造方法,参数含义:出现异常的原因super();super(s);super();super(s);if(!throw new UserNameException("用户名错误!");if(!

2023-11-24 21:00:35 393 27

原创 【Java】认识String类

在C语言中已经涉及到字符串了,但是在C语言中要表示字符串只能使用字符数组或者字符指针,可以使用标准库提供的字符串系列函数完成大部分操作,但是这种将数据和操作数据方法分离开的方式不符合面相对象的思想,而字符串应用又非常广泛,因此Java语言专门提供了String类。与equals不同的是,equals返回的是boolean类型,而compareTo返回的是int类型。尽量避免直接对String类型对象进行修改,因为String类是不能修改的,所有的修改都会创建新对象,效率非常低下。

2023-11-23 17:51:37 1478 26

原创 【Java】抽象类和接口

使用继承抽象类的代码比继承普通类的好处就在于:实际工作不应该由父类完成, 而应由子类完成. 那么此时如果不小心误用成父类了, 使用普通类编译器是不会报错的. 但是父类是抽象类就会在实例化的时候提示错误, 让我们尽早发现问题。对于 sort 方法来说, 需要传入的数组的每个对象都是 “可比较” 的, 需要具备 compareTo 这样的能力. 通过重写 compareTo 方法的方式, 就可以定义比较规则。在Java中,类和类之间是单继承的,一个类可以实现多个接口,接口与接口之间可以多继承。

2023-11-20 22:51:33 2816 24

原创 Java中的多态

到这里为止我们已经把面向对象的三大特性中的封装和继承讲完了,接下来我们接着学习关于多态的知识重写(override):也称为覆盖。重写是子类对父类非静态、非private修饰,非final修饰,非构造方法等的实现过程进行重新编写,返回值和形参都不能改变。即外壳不变,核心重写!重写的好处在于子类可以根据需要,定义特定于自己的行为。也就是说子类能够根据需要实现父类的方法方法重写的规则1.子类在重写父类的方法时,一般必须与父类方法原型一致: 返回值类型 方法名 (参数列表) 要完全一致。

2023-11-18 11:28:32 321 26

原创 Java中的继承

在前面的学习中我们已经讲解了面向对象的三大特性中的封装,接下来我们再来讲解三大特性中的继承。

2023-11-15 15:13:54 270 27

原创 Java中的类和对象

在java中定义类时需要用到class 类名称 {成员变量 / 实例变量;成员方法;this引用指向当前对象(成员方法运行时调用该成员方法的对象),在成员方法中所有成员变量的操作,都是通过该引用去访问注意:this引用的是调用成员方法的对象。

2023-11-06 14:25:46 822 27

原创 关于Java中的运算符

在之前我们已经学习了关于C语言的运算符,接下来我们再来学习Java中的运算符计算机的最基本的用途之一就是执行数学运算作为一门计算机语言,Java也提供了丰富的运算符来操纵变量。Java中的运算符可分为以下:算术运算符(+ -/)、关系运算符(< > ==)、逻辑运算符、位运算符、移位运算符以及条件运算符等。

2023-10-27 20:51:07 375 24

原创 (Java)中的数据类型和变量

2.计算机中的字符本质上是一个整数. 在 C 语言中使用 ASCII 表示字符, 而 Java 中使用 Unicode 表示字符. 因此一个字符占用两个字节, 表示的字符种类更多, 包括中文。3.Java虚拟机规范中,并没有明确规定boolean占几个字节,也没有专门用来处理boolean的字节码指令,在Oracle公司的虚拟机实现中,boolean占1个字节。有些内容可能会经常改变,比如:人的年龄、身高、成绩分数、数学函数的计算结果等,对于这些经常改变的内容,在Java程序中,称为变量。

2023-10-25 21:09:06 359 14

原创 初步认识Java

Java是一种优秀的程序设计语言,它具有令人赏心悦目的语法和易于理解的语义不仅如此,Java还是一个有一系列计算机软件和规范形成的技术体系,这个技术体系提供了完整的用于软件开发和跨平台部署的支持环境,并广泛应用于嵌入式系统、移动终端、企业服务器、大型机等各种场合。

2023-10-23 20:14:11 375 11

原创 (C语言)文件操作的详解

磁盘上的文件就是文件在程序设计中,我们的文件一般有两种:程序文件和数据文件。

2023-10-16 13:24:09 166 8

原创 (C语言)动态内存分配

所以,如果我们把结构体的内存以及其成员要的内存一次性分配好了,并返回给用户一个结构体指针,用户做一次free就可以把所有的内存也给释放掉。包含柔性数组成员的结构用malloc()函数进行动态的内存分配,并且分配的内存应该大于结构的大小,以适应柔性数组的预期大小。有时我们会发现过去申请的空间太小了,有时候又会觉得申请的空间过大了,为了合理的申请内存,我们会对内存的大小做灵活的调整。这个函数的功能是为大小为size字节的对象分配一块连续可用的空间,并返回指向这块空间的指针,此空间中的初始值不确定。

2023-10-13 18:44:27 233 14

原创 自定义类型中的结构体

在之前我们已经学习过结构体的一些基本知识,现在我们对结构体进行更深的了解结构是一些值的集合,这些值称为成员变量。结构的每个成员可以是不同类型的变量(注意:数组和结构体是一样的,也是一种值的集合,但是数组的每个元素的类型是相同的,而结构体的每个成员可以是不同类型的)

2023-09-24 20:22:00 133 12

原创 库函数strlen的三种模拟实现方式

字符串以 ‘\0’ 作为结束标志,库函数strlen 返回的是在字符串中 ‘\0’ 前面出现的字符个数但是不包括’\0’,双引号(“”)末尾是隐藏着一个 '\0’的。关于库函数strlen我们可以从以下链接中认识:库函数strlen是求字符串长度的函数。因为库函数strlen的返回值是suze_t(无符号整型),所以是大于0的。因为要读到’\0’才会停下来,但是程序中没有’\0’所以得到的是随机值。函数的返回值是 size_t ,是无符号的。参数指向的字符串必须要以 ‘\0’ 结束。

2023-09-19 16:51:14 201 7

原创 关于指针和数组的练习题

在前面我们已经学习了关于指针和数组相关的知识接下来我们开始做一些这方面的练习题sizeof(数组名),这里的数组名表示整个数组,计算的是整个数组的大小&数组名,这里的数组名表示整个数组,取出的是整个数组的地址除此之外所有的数组名都表示首元素的地址。

2023-09-17 17:56:48 305 4

原创 C语言中指针的详解(2)

回调函数就是一个通过函数指针调用的函数。如果你把函数的指针(地址)作为参数传递给另一个函数,当这个指针被用来调用其所指向的函数时,我们就说这是回调函数。回调函数不是由该函数的实现方直接调用,而是在特定的事件或条件发生时由另外的一方调用的,用于对该事件或条件进行响应。接下来我们要使用qsort进行排序,但是在这之前我们先用冒泡排序来对一个整型数组进行升序排序。指向函数指针数组的指针是一个指针,指针指向一个数组,数组的元素都是函数指针。把一个函数的地址存放到一个数组中,那么这个数组就叫做函数指针数组。

2023-09-13 19:32:33 141 5

原创 扫雷游戏的代码实现

这个扫雷其实和我们之前写的三子棋相似都是用到了数组的知识,以下就是关于扫雷游戏代码的编写。

2023-09-03 11:58:44 149

原创 错题总结(1)

以上错题都可以很好的帮助我们获得更多的经验和加深我们对知识的认识有助于以后的学习。

2023-08-21 23:07:28 136 3

原创 三子棋的设计

我们小时候都玩过三子棋吧,那么我们今天就用C语言来模拟实现一个简单的三子棋代码。

2023-08-13 22:36:22 122 1

原创 C语言中指针的详解(1)

pfun1先和*结合,说明pfun1是指针,指针指向的是一个函数,指向的函数无参数,返回值类型为void。&数组名表示数组的地址,不是数组首元素的地址,+1跳过的是整个数组的大小,所以&arr+与&arr相差40。3、指针是有类型,指针的类型决定了指针的±整数的步长,指针解引用操作的时候的权限。2、指针的大小固定是4/8个字节(32位平台/64位平台)指针数组是用来存放指针的数组。数组指针是能够指向数组的指针。字符指针是指向字符的指针。函数指针是指向函数的指针。4、数组和指针的传参。(1)一维数组的传参。

2023-08-13 12:46:40 137 2

原创 数据在内存中是如何存储的

基本的内置类型有:数据类型的意义:1. 使用这个类型开辟内存空间的大小(大小决定了使用范围)。2. 如何看待内存空间的视角类型的归类:整型家族:signed 有符号的unsigned 无符号的字符在内存中存储的是字符的ASCII码值,ASCII码值是整型所以字符类型归类到整型家族char是否是有signed charC语言标准没有规定取决于编译器浮点数家族:构造类型:指针类型:空类型:void 表示空类型(无类型)通常应用于函数的返回类型、函数的参数、指针类型。

2023-08-02 22:53:29 336 1

原创 什么是结构体?

使用typedef简写struct自定义的类型名结构体变量的初始化。

2023-07-31 23:17:38 121

空空如也

空空如也

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

TA关注的人

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