- 博客(43)
- 收藏
- 关注
原创 【数据结构】哈希表(Map和Set)
3️⃣当堆中不够K个元素时,就直接入堆,入够K个元素之后,此时按照比较规则,堆顶元素一定是出现频率最小的,如果堆中还有其他元素和堆顶元素频率相同,那堆顶元素应该是字典序靠后的。4️⃣再接着遍历集合元素,如果当前元素比堆顶元素频率高,则出堆顶元素,入当前元素;如果当前元素和堆顶元素频率一样高,再比较字典序,如果堆顶元素靠后,则出堆顶元素,入当前元素。5️⃣最终依次出堆顶元素到List中,然后逆序List即可。
2023-06-07 20:11:44
1593
原创 【JVM】
我们写好的java代码(.java文件)首先需要被编译为字节码文件(.class文件),然后由JVM中的将字节码文件加载到内存中的,而字节码文件是JVM的一套规范指令,并不能直接交由CPU执行,需要先将字节码文件编译为底层系统指令,再交由CPU执行,(这个编译过程由特定的命令解析器来完成),而这个过程需要调用其他语言的接口,来完成。JVM主要通过以上的四个部分来执行java程序的。类加载器;运行时数据区;执行引擎;本地接口库。
2023-03-23 23:36:42
323
1
原创 【MySQL】事务
MySQL的常用的存储引擎有InnoDB,MyISAM。InnoDB支持事务,MyISAM不支持事务。那事务是什么呢?事务就是一组操作,这一组操作我们希望它是一个不可分割的整体,这组操作要么全部都执行,要么全部都不执行。在很多环境中都有事务,数据库中有事务,Spring中也有事务。那数据库的什么样的场景下,会用到事务呢?最典型的莫过于转账了。
2023-03-23 08:37:01
253
原创 【MyBatis】MyBatis操作数据库
MyBatis是一个持久层框架(用于实现数据持久化的框架),它的底层也是基于JDBC的,不过用MyBatis比直接用JDBC操作数据库要方便很多。MyBatis是一个ORM(Object Relational Mapping)框架,即对象关系映射框架,映射关系:数据表–>>映射成一个类一条记录–>>映射成一个对象表中的字段–>>映射成类中的属性由于MyBatis实现了这层映射关系,我们可以像操作对象一样来操作数据表。
2023-03-04 10:44:23
493
原创 【SpringMVC】SpringMVC程序开发
SpringMVC是基于servlet API构建的web框架,SpringMVC是spring框架的一个模块,用于快速开发web APP。SpringMVC正式名称是Spring Web MVC,一般叫作Spring MVC,也可以叫作Spring Web。
2023-03-04 10:38:02
120
原创 【SpringBoot】SpringBoot使用
Spring是为了简化java程序开发的,而SpringBoot是为了简化Spring程序开发的,所以SpringBoot底层还是Spring。还是一个Ioc容器,具有存储Bean的功能。SpringBoot翻译成中文:Spring脚手架创建好SpringBoot项目后,有一个复杂的项目目录,其中有一些文件是没有啥用的,直接删掉就可以了:圈的四个文件直接删掉就行了。
2023-03-02 23:00:12
242
原创 【Spring】Bean作用域和生命周期
什么是Bean的作用域呢? 我们知道变量的作用域:在作用域范围内可以访问到该变量,在作用域范围外则不能访问到该变量,这个是变量的作用域,但是Bean的作用域就和作用范围不太一样了==Bean的作用域:==Bean在Spring中的某种行为模式,那什么是行为模式呢?
2022-12-01 14:09:30
200
原创 【Spring】高效使用Spring
在初识Spring时,要使用Spring来存储对象,获取对象,步骤比较繁琐:先创建Spring项目,再把类注册到Spring中,再获取对象并使用,总共三步,三步中又有很多小步。那其实我们是有方法可以更高效使用Spring的,具体点是更高效的注册类到Spring中,以及更高效的从Spring中获取对象。为了更高效的存储对象,我们需要更改之前的存储方式,之前的方式是在spring-config.xml文件中添加一个节点标签,就把该类注册到Spring中了。
2022-12-01 14:08:06
255
原创 【Spring】Spring核心与设计思想
Spring其实就是我们java中的一个框架,不过这是之前流行的框架,现在比较流行的框架是SpringBoot。那什么是框架呢?🔑框架其实就相当于脚手架,让我们开发起来更方便,比如之前用servlet实现网站的后端,步骤比较繁琐,又是创建目录,又是引入依赖,还需要配置SmartTomcat,也就是除了业务逻辑之外我们需要关注的东西比较多。那框架其实就是为了简化开发的,让我们尽量少关注这些环境问题,我们只需要实现业务逻辑就行了。
2022-12-01 14:05:14
164
原创 【网络】http/https
referer的一个作用:比如搜狗网站上有很多广告网站,当在搜狗中访问这些广告网站,每次点击,就需要给搜狗广告费,而这些广告网站,可能在百度上也有,在360上也有,所以是从哪个网站点击跳转到广告网站的呢?
2022-10-08 09:59:47
1032
原创 【前端】JS基础语法
< script > var name = '郝少康';let name1 = '乔仕佳';var< script > var name = '郝少康';let name1 = '乔仕佳';=< script > var name = '郝少康';let name1 = '乔仕佳';'郝少康';< script > var name = '郝少康';let name1 = '乔仕佳';var< script > var name = '郝少康';
2022-10-08 09:57:56
221
原创 【前端】css
==CSS:==层叠样式表 (Cascading Style Sheets) :==样式:==针对html文件渲染出来的内容指定样式:大小,颜色,位置,背景等。==层叠:==针对一个html元素设置多个样式,多个样式之间是叠加的关系。选中所有的同类标签首先:CSS代码得先放入style标签中,使用这个标签就可以将css代码嵌入html代码中,这个style标签放到哪里都可以,一般是放到head标签中。div{}:div代表标签选择器,选择的是div标签(选择所有div标签),大括号里的内容是样式,以键值
2022-09-23 19:11:33
209
原创 【前端】html
html是一个前端语言,是一个标签化的语言,即html代码由标签构成,它没有逻辑。html代码也不需要编译,运行的话在浏览器中就可以直接运行。下面具体来看一下html代码这是一段html代码,由几个标签组成,称为开始标签,称为结束标签。 大部分标签是成对出现的,但是也有标签是单个出现的,只有开始标签,称为单标签。两个标签中是内容,内容可以是文本,也可以是其他标签。在开始标签中可以存放一些属性,这些属性以键值对来表示。整个html文件根据标签可以看成一个树形结构✅这棵树称为一个DOM树(document o
2022-09-23 19:10:11
381
原创 【网络】网络原理之TCP/IP
自定义应用层协议步骤:先理清交互要传输什么信息,然后决定信息按什么格式来组织比如点外卖时先启动程序,启动程序就涉及到一次网络通信:请求:用户信息,位置信息响应::商家的信息(商家名称,商家位置,商家评分,商家预览图)那可以看到请求和响应中包含的有时候可不是一条信息,那这些信息需要通过一定的格式来组织,具体使用啥样的格式来组织,这是可以自定义的,这个过程就是自定义应用层协议。✅一般使用的格式有以下几种:1️⃣使用分隔符:请求:用户ID;位置信息(东经,北纬)响应:商家ID;商家名称;商家位置;
2022-09-13 11:58:30
1058
原创 【网络】网络编程
✅虽然在不停的获取连接,处理连接,但是当一个客户端连接上了,在处理连接的过程中,别的客户端是没法建立连接的(执行不到accept()),只有当第一个客户端断开连接后(执行到accept()),别的客户端才有可能建立上连接,这就很不合理,客户端比较多的话,这也就太慢了,所以解决办法是:把处理连接这个过程放在一个新线程中执行,让主线程只是不停的尝试获取连接,获取到一个连接,就创建一个新线程来处理连接。✅客户端当根据服务器的IP地址,和服务器的进程的端口号创建一个Socket对象时,已经建立好和服务器的连接了。
2022-09-09 11:10:36
362
原创 【网络】网络通信原理
网络通信即是利用网络传输数据,上面的IP地址和端口号是明确了数据的发送地和目的地,而数据的传输过程经过的所有网络设备以及应用程序,操作系统都很多,虽然传输的肯定是0,1序列,但如果不同设备或程序解析0,1序列得到的数据不一样这就没有达到网络通信的目的。下一层的协议给上一层的协议提供服务,上一层的协议具体实现时只需要调用下一层提供的API就行,不用考虑下一层的实现细节,而JVM里就封装了操作系统里传输层对应的一些API,所以进行网络编程时学习java提供的网络编程API就行了。
2022-09-03 09:48:51
1830
原创 文件和IO
在java中操作文件用的是File类,下面来看具体代码//通过路径定义一个文件 File file = new File("d:/test.txt");//获取上一级路径 System . out . println(file . getName());//获取文件名 System . out . println(file . getPath());//构造方法用的获取路径 System . out . println(file . getAbsolutePath());...
2022-08-29 20:33:41
126
原创 【多线程】(进阶)
CAS是相比与synchronized更轻量的实现原子性的指令。✅我们之前为了实现原子操作,需要加锁,使用synchronized,现在操作系统/硬件给JVM提供了一个更轻量的原子操作的机制:CAS(compare and swap),CAS是cpu的一个特殊指令,这是一条指令,所以这个指令是原子的。(比较的是内存和寄存器中的值,如果两个值相等,就把内存中的值和另一个寄存器中的值进行交换,如果不相等,则不做任何操作)
2022-08-25 15:52:02
135
原创 【多线程】(基础三)
❤️我们之前学过字符串常量池,字符串常量池,就是为了避免每次创建字符串的时候都需要在堆上开辟空间,所以搞了一个字符串常量池,每次创建字符串时都往常量池里加入一个字符串,后续如果再写一个字符串,如果常量池里有这个字符串,就不需要再创建字符串对象了。❤️这里的常量池也是为了避免频繁的创建销毁线程带来的时间开销。高并发场景下,创建销毁进程成本比较高,所以为了解决这种问题,引入了线程,同一进程中的线程创建销毁不需要申请释放资源,这样频繁的创建销毁线程就不需要那么高的成本了。...
2022-08-18 20:03:41
190
原创 【多线程】(基础二)
线程安全问题:在操作系统的随机调度下 ,多个线程的并发执行会产生多种可能,可能会产生BUG我们使用两个线程对同一个变量分别自增了5000次,按理来说最后结果应该是10000,下面我们来看结果a++; 这一行代码对应了三条机器指令:从内存读取数据到CPU(load),在CPU寄存器中完成加法运算(add),把运算结果放到内存中(save)那由于两个线程的执行是调度器随机调度的,所以在某一时刻,这两个线程可能都在CPU的不同核心上运行(并行执行),也可能只有一个在CPU上执行,也可能俩线程都没在CPU上
2022-08-18 20:01:55
891
原创 【多线程】(基础一)
因为线程阻塞时,如果不走异常就要等sleep()完,然后走到while()中的判定条件才能让线程中断,假如极端情况下,sleep()要等一小时,那得一小时后才能执行到判断条件让线程中断,这样就不太合理,==我们期望一调用interrupt() ,该线程就能立即做出反应,而不是过了好大一会才做出反应,==对于阻塞中的线程,它不能上CPU,也就不能做出反应,所以让异常把sleep()唤醒,然后执行catch()中的逻辑,做出相应的反应。在哪个线程中调用这个静态方法,就可以返回哪个线程的Thread实例。...
2022-08-18 17:04:44
63
原创 【多线程】进程和线程初识
进程的上下文具体值得就是CPU里一些寄存器的值,在进程被切出CPU时,把寄存器的状态保存到PCB里 (内存),下次进程回到CPU上,就把PCB里的值读取到CPU寄存器中,这样就能接着执行未完成的操作了。 一个进程可以有单个进程(单线程程序),也可以有多个进程(多线程程序),微观层面上,在同一时刻,一个单核CPU只能执行一个进程中的一个线程(通过CPU调度,每个时间片上只有一个线程执行),宏观层面上,由于轮转速度较快,一个进程中的多个线程是同时执行的。(宏观上同时执行,微观上不是同时执行).........
2022-08-17 15:32:48
217
原创 【数据结构】双向链表模拟实现
双向链表模拟实现头插法,链表为空,则head和last都得更新;链表不为空,只有head需要更新,所以分成两种情况写代码。addLast(int data)尾插法,链表为空,则head和last都得更新;链表不为空,只有last需要更新,所以分成两种情况写代码。addIndex(int index,int data)在index位置插入,首先判断index合法性,然后因为头插尾插还是中间插代码是不一样的,所以分三种情况。这里curNode引用了插入位置的前一节...
2022-07-14 10:00:12
65
原创 Comparable,Comparator,Cloneable接口以及深浅拷贝
Comparable,Comparator,Cloneable接口以及深浅拷贝
2022-06-07 16:11:01
148
原创 c语言程序的编译,链接,运行,以及预定义符号的使用
本期博客主要说明一下c语言源程序经编译,链接生成可执行程序的一个过程。编译阶段分为三个步骤:(1) 预编译 (2)编译 (3)汇编(1)预编译阶段:头文件的包含,删除注释,#define 定义符号的替换,经预编译阶段会生成一个test.i的文件(内容还是c语言的代码,仅仅进行了一些文本操作)(2)编译阶段:语法分析,词法分析,语义分析,符号汇总,经编译阶段会生成一个test.s的文件,(内容是汇编代码),(语法问题会在这一阶段被识别出)(3)汇编阶段:把汇编代码解析成二进制指令,..
2022-03-06 18:10:26
713
原创 scanf(),gets(),getchar(),putchar()
scanf(),gets(),getchar(),putchar()的用法及特点
2022-02-20 10:09:35
382
原创 动态内存分配(malloc calloc realloc free)
内存主要分三部分空间,栈区,堆区,静态区,而动态内存函数开辟出来的内存空间是在堆区的。栈区:局部变量,函数形参堆区:动态内存分配的,(malloc,calloc, realloc, free)静态区:全局变量,静态变量malloc函数:malloc函数如果开辟空间成功,则返回那块空间的起始地址,如果开辟空间失败(可能原因:开辟的空间太大),则返回NULL,所以要检验返回的指针,当开辟空间成功,并使用完毕后,应尽快释放这块空间(把这块空间还给操作系统)...
2022-02-13 16:19:40
473
原创 结构体,位段, 枚举,联合体
本期博客主要学习一下这四种类型的使用以及一些细节。结构体 struct S 中有三个成员变量,分别为char,int,char类型,加起来总共是6个字节,而结果却显示大小是12个字节,原因是结构体存在内存对齐规则。offsetof是一个宏,可以计算结构体成员相对于结构体起始内存的一个偏移量(单位是字节),由此可以分析出各个成员变量在内存中的分布,如下图,其实结构体成员变量在存储的时候是遵循内存对齐的规则的。结构体内存对齐规则:1.第一个成员存到结构体变量偏..
2022-02-11 17:41:37
365
原创 浮点数存储规则
int main(){ int n = 9; float* pfloat = (float*)&n; printf("n的值为:%d\n", n); printf("*pfloat的值为:%f\n", *pfloat); *pfloat = 9.0; printf("n的值为:%d\n", n); printf("*pfloat的值为:%f\n", *pfloat); return 0;}这段代码,当我们把9以整型存到内存中去,再以浮点型取出来打印的时候打印的却..
2021-12-01 15:30:51
653
原创 数据运算中的整形提升与算数转换
C的整型算术运算总是以缺省整形类型的精度来进行的,为了获得这个精度,表达式中的字符和短整型操作数在使用之前被转换为普通整型,这种转换称为整形提升。整形提升的意义:表达式的整型运算要在cpu的相应运算器件内进行,cpu内整形运算器(ALU)的操作数的字节长度一般就是int的字节长度,同时也是cpu的通用寄存器的长度。因此,即使两个char类型的数据相加,在cpu执行时实际上也要先转换为cpu内整形操作数的标准长度。通用cpu难以实现两个8比特字节直接相加运算(虽然机器指令中可能有这种字节.
2021-11-30 16:55:58
181
原创 scanf函数及缓冲区问题详解
1.什么是缓冲区? 缓冲区又被称为缓存,是内存空间的一部分,也就是说在内存空间中预留了一定的存储空间,这些存储空间用来缓冲输入或输出的数据,这部分存储空间就叫做缓冲区。 缓冲区根据其对应的是输入设备还是输出设备,分为输入缓冲区和输出缓冲区。1.为什么要引入缓冲区? 比如我们要从磁盘中读数据,我们先把读出的数据放到缓冲区中,计算机再从缓冲区中取出数据,等缓冲区中的数据取完后,再从磁盘中读取数据,这样可以减少磁盘的读写次数,再加上计算机对缓冲区的操...
2021-11-28 20:55:34
3949
3
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人