自定义博客皮肤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)
  • 收藏
  • 关注

原创 详解Map和Set

二叉搜索树上的每一个结点其左子树的值小于根结点的值并且右子树的值大于根结点的值,对二叉搜索树进行中序遍历就能得到一个有序序列,所以二叉搜索树又称二叉排序树。Map是一个接口,但并没有继承Collection类,存放的是Key-Value键值对。Key都有与之对应的Value,Map中Key是惟一的,但Value并不唯一。Map.Entey是Map用于来存放键值对映射关系的内部类。该类主要提供有getKey()、getValue()、setValue()方法,并没有setKey的方法。

2023-01-21 14:29:35 1280 3

原创 一文带你秒懂十大排序

排序就是将一组乱序的数据集合变得有序内部排序:数据全部存放在内存中进行排序。外部排序:数据太多而不能全部存放在内存,整个排序·过程需要在内外存之间多次交换数据才能进行。根据排序的策略分为:插入排序、选择排序、交换排序和归并排序。时间复杂度。空间复杂度。稳定性:就是排序前后两个相同元素的相对位置保持不变。一个稳定的算法可以变得不稳定,但是一个不稳定的算法不能变得稳定。排序在我们日常生活中有很多的应用,例如在购物页面可以选择价格从低到高排序,导航时路程可以根据预测花费时间进行排序。

2023-01-16 18:23:30 2534 11

原创 反射&&枚举

在Java的反射机制指的是在运行状态下对于任意一个类都能获取到它的属性和方法,对于任何任意一个对象能调用它的所有属性和方法。对于拿到的信息也可以进行修改,这种动态获取信息以及动态调用对象方法的功能就是反射机制。将一组常量组织起来创建出个类。

2023-01-14 20:40:08 350 9

原创 堆与优先级队列

堆也是一种数据结构,将一组数据集合按照完全二叉树的方式存储起来,堆分为大根堆和小根堆,如果根结点总是大于孩子结点就是大根堆,如果根结点总是小于孩子结点就是小根堆。优先级队列也是一种队列,普通队列具有先进先出的特点,优先级队列中存放的元素带有优先级,是优先级高的元素先出队。优先级队列主要分为PriorityQueue和PriorityBlockingQueue,前者是线程不安全的,后者是线程安全的,本文主要讲解前者。优先级队列底层是利用堆来实现。

2023-01-13 01:39:50 267 2

原创 二叉树常见题目

前序遍历的顺序是根-左-右,中序遍历的顺序是左-根-右,就可以创建一个递归函数,参数为前序遍历数组和中序遍历的数组以及开始点ib和结束点ie,当ib>ie是就退出递归,此时已经越界,否则就将i所指的元素包装为根结点,可以定义一个变量i从0开始对前序遍历的序列进行遍历,得到i对应的元素k,k就为根结点,然后在中序遍历中查找k对应的下标index,那么左子树的范围就是0~index-1,右子树的范围是index+1~len,len表示数组长度,然后逐步递归,最后返回root。

2023-01-12 19:24:10 378 3

原创 Java实现二叉树

二叉树也是一种特殊的树结构,但是二叉树的度最大只能为2,也就是说,二叉树中只存在度为1的结点和度为2的结点以及叶子结点。二叉树的子树有左右之分,次序不能颠倒,因此二叉树是有序树。

2023-01-09 21:10:07 223 5

原创 Java实现队列

队列也是常见的数据结构,是一种线性数据结构,队列的主要特点:“先进后出”。队列有队头和队尾,一般在队尾进行插入操作,队头进行删除操作。

2023-01-08 00:46:51 141 3

原创 Java实现文件操作

在计算机中,通常都需要文件系统来管理文件,文件系统中通过“树形” 组织文件和目录,文件可以分为文本文件和二进制文件,如果文件记事本打开出现乱码就是二进制文件,否则就是文本文件,常见的二进制文件有:.txt,.c,.java等;常见的文本文件有:.doc,.jpg,.class以及office系列的一些文件。在文件系统中,文件的路径可以分为绝对路径和相对路径。绝对路径:就是从根目录开始到文件,也就是从盘符开始的文件,例如:D:\bin\aa\c.txt。

2023-01-07 10:21:14 414 3

原创 Java实现栈结构

栈(Stack)也是数据结构的一种,属于线性数据结构,栈最大的特点是“先进后出”,就是先进入栈的元素后出来,栈只能每次弹出栈顶元素,不能弹出处在栈中间的元素。

2023-01-05 18:14:17 470 5

原创 秒懂双向链表

双向链表也是线性结构,但是与单链表相比,不仅有next指针指向下一个结点,还有prev指针指向前一个结点,在双向链表中,除了head指向首元结点之外,还有last指向双向链表的最后一个结点。}}

2023-01-04 16:10:25 488 5

原创 多线程问题(四)

ABA问题就是在CAS进行比较的时候不能确定内存中的值是不是未发生任何改动的预期的旧值,就比如说有两个线程,线程1首先拿到内存中的值记录为oldValue,然后将oldValue与内存中的值进行对比,但是此时有可能是线程2对内存中的值先加1再减1进行了两次操作,虽然此时内存中的值未变,但实际上已经进行了两次修改,此时线程1就无法判断内存中的值是oldValue还是已经经历了一个变化过程。

2022-12-31 23:24:52 562 1

原创 多线程问题(三)

但是此时的代码还存在一个问题:就是队列中的任务的执行时间还没到,执行线程就会一直进行时间判断,处于忙等的状态,于是就可以利用wait和notify,wait等待任务执行时间减去当前时间,当在队列中加入任务时,就需要进行唤醒,需要查看新加入的任务是否需要执行。每次创建和销毁线程时,都需要在内核态支持运行,这样的效率十分低,所以就在反复创建线程时就使用线程池直接在用户态运行,这样就可以极大地减少每次创建线程和销毁线程的损耗。先执行main方法,在3500ms之后执行TimerTask中的任务。

2022-12-29 16:22:01 484 4

原创 多线程问题(二)(安全问题)

出现上述情况导致的结果就是更新丢失,例如是自增操作: 假设内存中的变量的初始值为0,t1就先把0加载到寄存器,但是t2进行抢占,也从内存中把0加载到寄存器然后自增为1,然后将1加载回内存,然后t1再自增为1,再将1加载回内存,按道理两次自增应该为2,但是由于线程的抢占以及自增操作是非原子的就会出现上述情况。线程的抢占式执行就是在一个线程的执行过程中,另一个更优先的进程会抢占当前线程执行的任务,当前线程就会被迫中断,这是引发线程不安全的根本原因,但是线程的调度是随机的,这是由系统决定的,我们无法改变。

2022-12-25 21:22:45 140 1

原创 多线程问题(一)

自行设置一个标志位作为中断条件,但是这样写并不严谨,后续博客会解释。try {}}});t.start();try {}}}

2022-12-23 21:10:10 288 1

原创 MySQL索引

索引是一种特殊的文件,包含对数据表中所有记录的引用指针,可以对数据表中一列或多列创建索引,并且还可以指定索引的类型。通俗来说,索引相当于目录。

2022-12-19 18:00:00 291 1

原创 JDBC编程相关知识(实现图书管理系统进阶版)

在借阅图书时,首先对输入的图书进行查找,若有才能进行借阅,使用update语句对图书的是否借出还有借阅时间进行修改,在创建图书类的日期是使用的是util包的Date类,但是在book表中的datetime是sql包的Date类,需要进行转换,对数据库中的book表完成更新后,同时也要修改书架上的图书信息。输入要删除的图书名称,利用书架类的数组遍历,此处不使用select语句进行查找是后面对书架进行删除时需要得到图书在书架的位置,找到后使用delete语句删除图书,然后再使用循环覆盖删除书架中的该图书。

2022-12-18 12:47:58 560 5

原创 MySQL事务

写者事务修改数据结束后,读者事务开始数据,此时数据处于解锁状态,当读者事务读的过程中,写者事务又开始修改数据,读者事务还没读完过程中,写者事务又提交了新的数据,导致读者事务前后读到的数据不一致,这就导致。两个写者事务同时对相同数据进行修改,就会出现一个事务的数据覆盖另一个事务的更新数据,比如上图写者1修改数据a就会覆盖写者2修改的数据a,导致。写者事务正在修改数据,但是读者事务读取了正在修改的数据,读到的是一个中间数据,而不是最终版的数据,这就是。解决方法:给读操作也进行加锁服务,保证读到的数据前后一致。

2022-12-14 23:14:36 557 4

原创 MySQL表的进阶知识

主键约束,主键约束就是不能为空,并且是惟一的,也就是含有前两个约束条件,在上述市里的student2表中,对id进行not null 和unique约束后,在查看表结构时,就出现id是primary key的结果。主键自动增长约束,例如在插入数据时,未插入主键,则就在已插入元组的主键+1,作为新插入元组的主键,主要针对整型类型的主键,默认从一开始。外键约束,就是一个表的某字段需要参照另一个表中的某一字段,例如:在学生表和班级表中,学生表中的班级就要参照班级表中的班级号。

2022-12-13 18:15:42 494 3

原创 MySQL数据表的基础知识

这里的结果已经并不符合当初设置math为double(3,1),此时有效数字已经为4位,但是能执行成功的原因就是这些结果并没有插入到实际的数据表中,只是临时表。select 列名 from 表名 order by 列名 asc(升序)/desc(降序);insert into 表名 values(...),(...),...(...);大于为1,小于为0,可以在查询字段中加上学生的姓名,班级等相关信息使查询结果更加清晰。例如:查找语文成绩大于85或者数学成绩大于90并且是一班学生的信息。

2022-12-12 19:16:31 543 3

原创 查找两个链表的第一个公共结点

由于时间复杂度不超过O(n),那么最多只能遍历一次,我们可以设置两个结点分别指向链表的首元结点,两个链表都进行遍历,就是如果当前的链表遍历完之后,就让其遍历另一条链表,因为遍历的速度一样,且遍历的总长度一样,如果有相同结点则一定会在遍历结束前找到,否则没有相同结点。对于该题我首先想到的是对两个链表同时进行遍历,若两个结点相同,则直接返回相同结点,但是提交之后无法通过,最后发现我的这种解法只适合等长链表求相同结点,这种解法并不可行。可以看到它们的第一个公共结点的结点值为6,所以返回结点值为6的结点。

2022-12-09 17:46:12 157 4

原创 MySQL基础知识

create table 数据表名(字段名 数据类型,字段名 数据类型,……character set 字符集 collate 指定字符集的校验规则;MySQL中存放多个数据库,就需要指定某个数据库来进行相关操作。drop database 数据库名;这是一个比较危险的命令,谨慎操作。drop table 表名;desc 数据表名;

2022-12-08 17:50:03 565 1

原创 MySQL插入汉字报错的解决方案

找到[mysql],在下面新增default-character-set=utf-8 找到[mysqlld],在下面新增character-set-server=utf-8 注意对修改的文件要进行保存。

2022-12-07 21:42:12 959 7

原创 数据结构——链表

目录一、链表概述二、模拟实现链表 1、结点 2、遍历链表3、获取链表的长度 4、添加元素 (1)、头插法 (2)、尾插法 (3)、在指定位置插入元素 5、删除元素 (1)、删除第一次出现值为key的结点 (2)、删除所有值为key的结点6、清空链表 三、常见笔试题 1、单链表转置2、获取单链表的中间结点 3、获取倒数第K个结点4、合并两个有序链表 2、遍历链表3、获取链表的长度 4、添加元素 (1)、头插法 (2)、尾插法

2022-12-04 13:29:54 170

原创 数据结构——顺序表

顺序表是数据结构的一种,是List的子类,以数组的形式进行存储。顺序表的特点:顺序表都是连续的。存取速度快,依靠下标直接进行存取。不适合频繁插入和删除,需移动大量元素,时间复杂度高。首先需要定义一个牌类,有花色和大小两个属性。}}

2022-11-29 17:39:11 454 1

原创 JavaSE整体总结

throw new POSException("参数异常");JavaEE可以分为。

2022-11-26 20:09:35 78 3

原创 Java实现图书管理系统

书架类需要定义一个图书类的数组,还有书架的容量,以及书架当前存放图书的数目,还需要定义获取指定位置图书的方法,以及指定位置修改图书的方法。首先应该判断书架是否已满,若未满,则输入图书信息,然后再需要对将要添加的图书与书架中的图书进行比较,判断是否已经存在,若未存在,则添加成功,书架目前存放图书数目加一,否则无法添加。用户输入要归还的图书名称,然后在书架上依次进行遍历,找到要归还的图书,将图书的状态改为false,即为未借出,归还成功,若未找到,则不存在该图书,归还失败。

2022-11-18 23:28:56 724 4

原创 static关键字详解~

static是Java中的关键字,可以修饰变量、方法、代码块。被static修饰的变量、方法、代码块称为静态成员,存放于内存的方法区,并且伴随类的加载而加载,不单独属于类的某个对象。

2022-11-10 18:38:28 377 2

原创 递归详解~

递归:一个方法中又包含了本身。通俗来说,递归就是自身中又包含了自己,是将一个原问题题分成若干子小问题,子问题与原问题的解法是一致的。构成递归的两个必要条件 :要有递归出口,否则就会进入死循环。将原问题划分为若干子问题,原问题要与子问题的解法一致。解决递归问题的关键是要求出递推公式。

2022-11-03 19:13:40 200 3

原创 Java运算符详解

所以,对于上述例子,第一段代码是先对b进行赋值运算,再自增,故a=1,b=2;但是在第二段代码中,是先对a进行自增运算,此时a的值为2,再进行赋值,故b的值为2。分析:由于a==b的值为false,&&便不会执行后面的代码,所以a=1。分析:由于a==b的值为true,&&便会执行后面的代码,所以a=2。自减运算符:--a(前置自减),a--(后置自减)自增运算符:++a(前置自增),a++(后置自增)算术运算符有:+=,-=,*=,/=,%=通俗来说,关系运算符主要功能时进行判断。

2022-10-28 23:27:11 705 6

原创 JAVA数据类型详解

Java八大数据类型详解

2022-10-27 20:08:00 483 2

原创 利用分而治之求最大子列和

分而治之方法与软件设计的模块化方法非常相似。小问题通常与原问题相似,可以递归地使用分而治之策略来解决。

2022-10-19 23:03:29 473 5

原创 电子狗的心事

计算机程序世界中有一位孤独的电子狗,这个电子狗每次只能执行一种操作指令:朝着现在的方向前进X米,然后左转。电子狗认为,它不断的执行这样的指令,最终有一条指令,能使它回到曾经走过的地方。然而,实际上,当它已经执行完给定它的n条指令时,并不一定会回到它曾经走过的地方。并且,电子汪很想知道结果。如果给了它n条指令,在第几条指令时,它能第一次回到自己已经走过的地方。如果指令执行完,都没有回到它曾经走过的地方,电子汪将会十分伤心,这个时候请输出“regret”。第一行为T,表示输入数据组数。

2022-10-17 23:18:25 37 8

原创 利用宏定义解决问题

对于这个题目,首先用#define定义的宏应该要包含两个参数,一个是结构体变量,另一个是该结构体的成员,因为计算的是偏移量,要用变量的地址减去结构体变量的首地址,那么我们可以假设结构体变量的初始地址为0。

2022-10-16 21:23:10 26

原创 模拟实现atoi函数

atoi函数的功能是将字符串转换为整数 ,并且该函数能转换正负数,和对字符串前面的空格进行跳跃,遇到数字进行转换,遇到非数字字符转换结束,还有若转换成整数越界也无法转换。

2022-10-15 23:15:36 60 2

原创 单身狗问题

面对这样的问题, 可能首先想到的是对数组的元素进行遍历,记录每个元素出现的次数,然后找到只出现一次的数字,但是有一种更为巧妙的方法,就是对遍历数组元素并进行异或运算,异或运算有如下所示的性质,利用异或运算自反的性质就找到那个单身的数字。我们可以从位异或结果第一个为1的 位置进行分组,因为代表这两个数字在这一位必然是一个为0,另一个为1,然后将这两个数分到两个不同的数组中,然后再进行位异或就可以得到这两个单身的数字了。在一个整型数组中,有两个数只出现了一次,别的数都出现了两次 ,请找出这两个仅出现一次的数。

2022-10-15 22:18:42 68 6

原创 升级版通讯录(C语言版)

在低版本中,我们使用固定长度的数组存放通讯录信息,但是数据信息过多就会出现越界错误,如果数据信息过少,又会造成极大的内存浪费,故我们可以采用动态内存开辟来很好地解决。我们首先需要改变初始化函数,先利用malloc开辟一定的空间。接下来在添加元素时,可能会出现空间不足的情况,所以我们首先应该判断size是否等于capacity,如果容量不足,我们就需要利用realloc函数进行扩容。但是在退出程序时,我们需要对开辟的内存进行释放,那么我们就需要再增加一个函数来释放空间。

2022-10-11 17:24:55 486 7

原创 C语言文件操作

1、文件:文件是计算机文件属于文件的一种,与普通文件载体不同,计算机文件是以计算机硬盘为载体存储在计算机上的信息集合。文件可以是文本文档、图片、程序等等。数据文件和程序文件。文件路径、文件名、文件后缀。文件名可以不包含后缀名。文件中不能包含这些字符:\/:*?"|。文件路径指的是从盘符到该文件所经历的路径中各符号名的集合。文件后缀名决定了一个文件的默认打开方式。二、文件的打开与关闭。

2022-10-11 16:24:17 391 2

原创 C语言实现扫雷游戏

在扫雷游戏中,我们需要设计两个二维数组,一个用来存放雷(雷的位置用‘1’表示,非雷用‘0’表示),另一个用来进行扫雷,初始全为‘*’,但是由于在对存放雷的数组进行扫雷时,容易越界,我们就将存放雷的数组的行数和列数各加2来解决。初始化函数利用两层for循环。扫雷函数利用用户指定的坐标,如果该坐标不是雷,则计算周围雷的个数存放到扫雷数组中,直到排查出所有非雷的坐标为成功,游戏结束,否则“炸死”,游戏结束。统计需要由用户指定一个坐标,然后程序在存放雷的数组中统计其周围的8个坐标中元素为‘1’的个数。

2022-10-05 13:30:42 676 8

原创 C语言实现三子棋

用户下棋时,主要是输入下的棋坐标,用户的坐标从1开始,但是在实际的内存中是从0,故在判断越界等操作时需要对用户所输入的坐标进行减一操作,除了判断是否越界,还需要判断用户所输入的坐标是否已经被占用。判断输赢是游戏的一个重要部分,三子棋判断输赢的标准就是看用户和电脑谁先连成一条线,可以是某一行或者某一列、对角线、反对角线,还有当棋盘满的话就是平局,否则就继续。三子棋游戏就需要将用户和电脑的下棋位置来打印到屏幕上,还提升用户的体验,同样利用for循环来实现,但是需要注意布局,增加‘_’和‘|’来增强美感。

2022-10-04 15:22:26 942 3

原创 C语言——详解回调函数

回调函数:通过函数指针调用的函数,就是将一个函数的指针(地址)作为参数,当函数指针调用其所指向的函数时,这就叫回调函数。回调函数不是由该函数的实现方直接调用,而是在特定条件下,由另外一方进行调用,用于对该条件的相应。

2022-10-03 15:20:05 164 4

空空如也

空空如也

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

TA关注的人

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