自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

~

~

  • 博客(185)
  • 资源 (1)
  • 收藏
  • 关注

原创 SpringMVC基础

如果⽅法参数名称和需要绑定的URL中的变量名称⼀致时,可以简写,不⽤给@PathVariable的属性赋值,否则需要@PathVariable的属性value赋值。Spring会根据参数名称⾃动绑定到对象的各个属性上,如果某个属性未传递,则赋值为null(基本类型则赋值为默认初识值,⽐如int类型的属性,会被赋值为0)Http响应报头也会向客⼾端传递⼀些附加信息,⽐如服务程序的名称,请求的资源已移动到新地址等,如:Content-Type,Local等。默认情况下,请求中参数名相同的多个值,是封装到数组;

2023-11-18 13:45:11 569

原创 Lombok

写项目时,尤其是在类进行类内部成员字段封装时,需要编写大量的get/set方法,这不仅使得我们类定义中充满了get和set方法,同时如果字段名称发生改变,又要挨个进行修改,甚至当字段变得很多时,构造方法的编写会非常麻烦使用Lombok(小辣椒)就可以解决这样的问题Lombok是一种插件化注解API,是通过添加注解来实现的,然后在javac进行编译的时候,进行处理。实际上在上述的第二阶段,会执行**,它所做的工作就是我们上面所说的,修改语法树。

2023-11-18 13:43:34 181

原创 JavaScript语言

JavaScript 是一种轻量级的脚本语言。所谓“脚本语言”,指的是它不具备开发操作系统的能力,而是只用来编写控制其他大型应用程序的“脚本”。JavaScript 是一种嵌入式(embedded)语言。它本身提供的核心语法不算很多操控浏览器的能力广泛的使用领域易学性JavaScript与ECMAScript的关系:ECMAScript和JavaScript的关系是,前者是后者的规格,后者是前者的一种实现。在日常场合,这两个词是可以互换的。

2023-11-13 21:58:54 194

原创 JVM内存管理

对于进入老年代的数据,会判断一下之前的每次垃圾回收进入老年代的平均大小是否小于当前老年代的剩余空间,如果小于,那么说明也许可以放得下,否则会先来一次Full GC,进行一次大规模垃圾回收,来尝试腾出空间,再次判断老年代是否有空间存放,要是还是装不下,直接抛出OOM错误。一次垃圾回收之后,Eden区域没有被回收的对象,会进入到Survivor区的From区,当From区满了,将From中存活的对象移动到To区,此后每次 gc 存活的对象交换区域,每次交换都会进行年龄判定,当对象经历了15轮则会进入老年代。

2023-11-13 21:56:18 233

原创 JUL日志

来打印信息,项目中存在大量的控制台输出语句,会显得很凌乱,而且日志的粒度是不够细的,假如我们现在希望,项目只在debug的情况下打印某些日志,而在实际运行时不打印日志,采用直接输出的方式就很难实现了,因此我们需要使用日志框架来规范化日志输出。包括很多种配置项,包括 SLF4J | LOG4J | LOG4J2 | JDK_LOGGING | COMMONS_LOGGING | STDOUT_LOGGING | NO_LOGGING,而默认情况下是未配置,也就是说不打印。控制台处理器就默认使用的是。

2023-11-11 14:29:07 290

原创 设计模式-创建型

优点:Factory基类,提供了一个纯虚函数(创建产品),定义派生类(具体产品的工厂)负责创建对应的产品(重写虚函数),可以做到不同的产品,在不同的工厂里面创建,能够对现有工厂,以及产品的修改关闭(符合软件开闭原则)缺点:实际上,很多产品是有关联关系的,属于一个产品簇,不应该放在不同的工厂里面去创建,这样一是不符合实际的产品对象创建逻辑,二是工厂类太多了,不好维护。优点:把对象的创建封装在一个接口函数里面,通过传入不同的标识,返回创建的对象,客户不用自己负责new对象,不用了解对象创建的详细过程。

2023-11-11 14:26:50 226

原创 设计模式-设计原则

使用接口来进行功能定义,然后再去实现,这样通过使用接口,就可以将原有的强关联给弱化,只需要知道接口中定义了什么方法然后去使用即可,而具体的操作由接口的实现类来完成。方法只需要一个IP地址即可,我们完全可以直接传入一个字符串,而不是整个Socket对象,保证与其他类的交互尽可能的少。通过提供一个Coder抽象类,开放给其他具体类型来实现,这样就可以根据不同的业务进行灵活扩展了,具有较好的延续性。有时候类的功能并不符合类的定义,添加在类中会使得类过于臃肿,此时应该将职责根据定义进行划分,以实现高内聚低耦合。

2023-11-09 18:00:38 363

原创 Redis数据库

某个 Key 属于热点数据,访问非常频繁,同一时间很多人都在访问,在这个Key失效的瞬间,大量的请求到来,这时发现缓存中没有数据,就全都直接请求数据库,相当于击穿了缓存屏障,直接攻击整个系统核心。某个 Key 属于热点数据,访问非常频繁,同一时间很多人都在访问,在这个Key失效的瞬间,大量的请求到来,这时发现缓存中没有数据,就全都直接请求数据库,相当于击穿了缓存屏障,直接攻击整个系统核心。,所有的数据全部存放在内存中,它的性能大大高于磁盘IO,并且它也可以支持数据持久化,他还支持横向扩展、主从复制等。

2023-11-06 20:33:45 223

原创 Spring基础

如果Bean不是单例模式,而是采用的原型模式,那么就只会在获取时才创建,并调用init-method,而对应的销毁方法不会被调用(因此,对于原型模式下的Bean,Spring无法顾及其完整生命周期,而在单例模式下,Spring能够从Bean对象的创建一直管理到对象的销毁)高内聚,低耦合,是现代软件的开发的设计目标,而Spring框架就给我们提供了这样的一个IoC容器进行对象的的管理,一个由Spring IoC容器实例化、组装和管理的对象,我们称其为Bean。而原型模式下,只有在获取时才会被创建。

2023-11-04 17:01:29 176

原创 Java新特性

包作为依赖时(包括JDK官方库),实际上很多功能我们并不会用到,但是由于它们是属于同一个依赖捆绑在一起,这样就会导致我们可能只用到一部分内容,但是需要引用一个完整的类库,实际上我们可以把用不到的类库排除掉,大大降低依赖库的规模。记录类型在Java 16才正式开放使用,记录类型本质上也是一个普通的类,不过是final类型且继承自java.lang.Record抽象类的,它会在编译时,会自动编译出。Lambda为所需要的接口提供了一个方法作为它的实现,而之后创建实现类就只需要交给JVM去处理就好了。

2023-11-02 13:10:20 119

原创 Maven项目管理

作为父级项目,通过modules标签将项目的所有子项目引用进来,在build父级项目时,会根据子模块的相互依赖关系整理一个build顺序,然后依次build。作为父级项目,通过modules标签将项目的所有子项目引用进来,在build父级项目时,会根据子模块的相互依赖关系整理一个build顺序,然后依次build。文件夹,可以将一些静态资源,比如配置文件,放入到这个文件夹中,项目在打包时会将资源文件夹中文件一起打包的Jar中,比如Mybatis的配置文件。

2023-10-31 21:55:57 166

原创 Mybatis基础

XML语言发明最初是用于数据的存储和传输HTML主要用于通过编排来展示数据,而XML主要是存放数据,它更像是一个配置文件> < outer > < name > 阿伟 < desc > 怎么又在玩电动啊 < inner type = " 1 " > < age > 10 < sex > 男

2023-10-28 22:57:23 752

原创 Go结构体&接口&反射

Go通过结构体struct和interface实现oop(面向对象编程)struct的成员(也叫属性或字段)可以是任何类型,如普通类型、复合类型、函数、 map、 interface、struct等.....age int //小写私有成员(对外不可见)Class string //首字母大写则该成员为公有成员(对外可见)//...var stu2 *Student= &Student{name:"zhangsan",age:10,Class:"1"} //返回指针,等同于new实例化操作。

2023-10-27 21:54:04 344

原创 GO语言基础

Go 对于值之间的比较有非常严格的限制,只有两个类型相同的值才可以进行比较,如果值的类型是接口,它们也必须都实现了相同的接口。map是一种特殊的数据结构:一种元素对 (pair) 的无序集合,pair 的一个元素是 key,对应的另一个元素是 value,所以这个结构也称为关联数组或字典。make也是用于内存分配的,但是和new不同,它只用于chan、 map以及切片的内存创建,而且它返回的类型就是这三个类型本身,而不是他们的指针类型,因为这三种类型就是引用类型,所以就没有必要返回他们的指针了。

2023-10-26 21:19:42 233

原创 Java-多线程进阶

CAS: 全称Compare and swap,字面意思:”比较并交换“一个 CAS 涉及到以下操作:比较 A 与 V 是否相等(比较)如果比较相等,将 B 写入 V(交换)返回操作是否成功当多个线程同时对某个资源进行CAS操作,只能有一个线程操作成功,但是并不会阻塞其他线程,其他线程只会收到操作失败的信号。CAS 可以视为是一种乐观锁. (或者可以理解成 CAS 是乐观锁的一种实现方式)java 的 CAS 利用的的是 unsafe 这个类提供的 CAS 操作。

2023-10-25 08:29:44 151

原创 CSS样式

绝对定位是相对于离他最近的开启了定位的祖先元素进行定位的(一般情况,开启了子元素的绝对定位都会同时开启父元素的相对定位)如果所有的祖先元素都没有开启定位,则会相对于浏览器窗口进行定位。表格文字对齐:表格中的文本对齐和垂直对齐属性,text-align属性设置水平对齐方式,向左,右,或中心。相邻兄弟选择器:选择紧跟E元素后的F元素,用加号表示,选择相邻的第一个兄弟元素,只能向下选择。通用兄弟选择器:选择E元素之后的所有兄弟元素F,作用于多个元素,用~隔开,只能向下选择。

2023-10-24 16:13:11 88

原创 Java多线程案例

Executors 本质上是 ThreadPoolExecutor 类的封装,ThreadPoolExecutor 提供了更多的可选参数, 可以进一步细化线程池行为的设定。定时器也是软件开发中的一个重要组件. 类似于一个 “闹钟”. 达到一个设定的时间之后, 就执行某个指定好的代码。阻塞队列的一个典型应用场景就是 “生产者消费者模型”. 这是一种非常典型的开发模型。待消费者处理,直接扔给阻塞队列,消费者不找生产者要数据,而是直接从阻塞队列里取。阻塞队列是一种特殊的队列. 也遵守 “先进先出” 的原则。

2023-10-23 12:30:32 139

原创 Java-IO流

实际上进行I/O操作的并不是BufferedInputStream,而是我们传入的FileInputStream,而BufferedInputStream虽然有着同样的方法,但是进行了一些额外的处理然后再调用FileInputStream的同名方法,这样的写法称为。读取的是一个字符串或是一个个字符,但是我只能往一个OutputStream里输出,但是OutputStream又只支持byte类型,如果要往里面写入内容,进行数据转换就会很麻烦,那么能否有更加简便的方式来做这样的事情呢。

2023-10-22 10:36:17 122

原创 Java多线程编程

每个线程都有一个自己的工作内存,可以使用ThreadLocal类,来创建工作内存中的变量,它将我们的变量值存储在内部(只能存储一个变量),不同的线程访问到ThreadLocal对象时,都只能获取到当前线程所属的变量。synchronized用的锁是存在Java对象头里的,synchronized的底层是使用操作系统的mutex lock实现的。synchronized上锁是需要传入对象的,当对象不同时,获取到的是不同的锁,因此并不能保证自增操作的原子性。注:优先级高的线程理论上来说更容易被调度到;

2023-10-21 21:05:02 252

原创 HTML页面

HTML5是用来描述网页的一种语言,被称为超文本标记语言。用HTML5编写的文件,后缀以.html结尾HTML是一种标记语言,标记语言是一套标记标签。标签是由尖括号包围的关键字。

2023-10-21 20:08:42 241

原创 Java泛型

泛型方法会在使用时自动确定泛型类型,比如上我们定义的是类型T作为参数,同样的类型T作为返回值,实际传入的参数是一个字符串类型的值,那么T就会自动变成String类型,因此返回值也是String类型。我们前面说了,重写的条件是需要和父类的返回值类型和形参一致,而泛型默认的原始类型是Object类型,子类明确后变为其他类型,这显然不满足重写的条件,但是为什么依然能编译通过呢?泛型其实就一个待定类型,我们可以使用一个特殊的名字表示泛型,泛型在定义时并不明确是什么类型,而是需要到使用时才会确定对应的泛型类型。

2023-10-21 09:39:47 112

原创 Java面向对象进阶

异常其实就两大类,一个是编译时异常,一个是运行时异常编译时异常只需要继承Exception就行了运行时异常只需要继承RuntimeException就行了还有一种类型是Error,它是所有错误的父类,同样是继承自Throwable的//Math也是java.lang包下的类,所以说默认就可以直接使用//我们可以使用pow方法直接计算a的b次方//abs方法可以求绝对值//快速取最大值//快速取最小值//求一个数的算术平方根//求π/2的正弦值,这里我们可以使用预置的PI进行计算。

2023-10-20 08:21:50 100

原创 Java集合类

集合类其实就是为了更好地组织、管理和操作我们的数据而存在的,包括列表、集合、队列、映射等数据结构。

2023-10-19 21:12:14 193

原创 Java网络编程

通过Socket技术(它是计算机之间进行的或一种方式),我们就可以实现两台计算机之间的通信Socket也被翻译为套接字,是操作系统底层提供的一项通信技术,它支持TCP和UDP而Java就对socket底层支持进行了一套完整的封装,我们可以通过Java来实现Socket通信一旦TCP连接建立,服务端和客户端之间就可以相互发送数据,直到客户端主动关闭连接。

2023-10-17 20:59:14 209

原创 Java-JDBC

JDBC英文名为:Java Data Base Connectivity(Java数据库连接),官方解释它是Java编程语言和广泛的数据库之间独立于数据库的连接标准的Java API根本上说JDBC是一种规范,它提供的接口,一套完整的,允许便捷式访问底层数据库。不同的可执行文件都能通过JDBC访问数据库,又兼备存储的优势。它就是Java与数据库的连接的桥梁或者插件,用Java代码就能操作数据库的增删改查、存储过程、事务等。我们可以发现,JDK自带了一个java.sql。

2023-10-15 15:52:02 291

原创 Makefile学习2

用户自定义函以define开头,endef结束。给函数传递的参数在函数中使用0(0)、0(1)引用。用户自定义函数使用call函数间接调用,各个参数之间使用空格隔开。

2023-08-02 22:54:48 266 1

原创 Makefile学习1

Makefile是在Linux环境下 C/C++ 程序开发必须要掌握的一个工程管理文件。当你使用make命令去编译一个工程项目时,make工具会首先到这个项目的根目录下去寻找Makefile文件,然后才能根据这个文件去编译程序。linux下编写程序,因为早期没有成熟的IDE,一般都是使用不同的命令进行编译:将源文件分别使用编译器、汇编器、链接器编译成可执行文件,然后手动运行。

2023-08-01 09:25:14 193

原创 Shell脚本学习3

函数可以让我们将一个复杂功能划分成若干模块,让程序结构更加清晰,代码重复利用率更高。其中function关键字是可选的调用函数只需要给出函数名,不需要加括号函数返回值,可以显式增加return语句;如果不加,会将最后一条命令运行结果作为返回值Shell 函数返回值只能是整数,一般用来表示函数执行成功与否,0表示成功,其他值表示失败如果一定要让函数返回字符串,那么可以先定义一个变量,用来接收函数的计算结果,脚本在需要的时候访问这个变量来获得函数返回值。删除函数也可以使用unset。

2023-07-31 20:29:10 211

原创 Shell脚本学习2

字符串是shell编程中最常用最有用的数据类型(除了数字和字符串,也没啥其它类型好用了),字符串可以用单引号,也可以用双引号,也可以不用引号。原生bash不支持简单的数学运算,但是可以通过其他命令来实现,例如 awk 和 expr,expr 最常用。Bash 支持很多运算符,包括算数运算符、关系运算符、布尔运算符、字符串运算符和文件测试运算符。bash支持一维数组(不支持多维数组),并且没有限定数组的大小,数组元素的下标由0开始编号。关系运算符只支持数字,不支持字符串,除非字符串的值是数字。

2023-07-30 15:09:09 151

原创 Shell脚本学习1

Shell是一种脚本语言,那么,就必须有解释器来执行这些脚本Unix/Linux上常见的Shell脚本解释器有bash、sh、csh、ksh等,习惯上把它们称作一种ShellShell脚本文件的扩展名为.sh(sh代表shell)Shell支持自定义变量定义变量:变量名不加美元符号($)变量名和等号之间不能有空格,有空格会出错如果手误写错(例如var = test),刚好要使用删除这个目录,实际删除的是变量名的命名须遵循如下规则:首个字符必须为字母(a-z,A-Z)

2023-07-29 22:48:18 189

原创 JavaSE抽象类和接口

在Java中,一个类如果被 abstract 修饰称为抽象类,抽象类中被 abstract 修饰的方法称为抽象方法,抽象方法不用给出具体的实现体。Object是Java默认提供的一个类,Java里面所有的类都会默认继承Object类,即所有类的对象都可以使用Object的引用进行接收。在Java中,类和类之间是单继承的,一个类只能有一个父类,即Java中不支持多继承,但是一个类可以实现多个接口。接口的本质就是一种抽象出来的公共方法,Java不能进行多继承类,但是可以多实现接口,以丰富类的方法。

2023-04-10 12:36:35 289 2

原创 JavaSE异常

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

2023-04-10 00:24:18 359

转载 Java的String类为什么要设成immutable类型

,因为这样的话,如果变量改变了它的值,那么其它指向这个值的变量的值也会一起改变。因为字符串是不可变的,所以它的值是不可改变的,否则黑客们可以钻到空子,改变字符串指向的对象的值,造成安全漏洞。如果你知道一个对象是不可变的,那么需要拷贝这个对象的内容时,就不用复制它的本身而只是复制它的地址,复制地址(通常一个指针的大小)需要很小的内存效率也很高。,因为在多线程同时进行的情况下,一个可变对象的值很可能被其他进程改变,这样会造成不可预期的结果,而使用不可变对象就可以避免这种情况。字符串自己便是线程安全的。

2023-04-09 14:19:29 215 1

原创 MySQL锁机制

对整张表加锁开销小,加锁快,不会出现死锁锁粒度大,发生锁冲突的概率高,并发度低对表中某行记录加锁开销大,加锁慢,会出现死锁锁定粒度最小,发生锁冲突的概率最低,并发度高排它锁(Exclusive),又称为 X 锁,写锁,写锁和其他锁是不兼容的共享锁(Shared),又称为 S 锁,读锁,读锁之间是共享记录的SS可以兼容的,XS、SX、XX之间是互斥的,即读锁之间可以共享,读写和写写之间是不兼容的一个事务对数据对象 O 加了 S 锁,只能对 O 进行读取操作,加锁期间其它事务能对O 加 S 锁但不能加 X 锁一

2023-04-07 08:26:44 451 4

原创 JavaSE继承和多态

并在子类构造方法中选择合适的父类构造方法调用,否则编译失败在子类构造方法中,super(…)调用父类构造时,必须是子类构造函数中第一条语句super(…)只能在子类构造方法中出现一次,并且不能和this同时出现。

2023-04-06 17:30:48 451

原创 MySQL事物

例如当事务A和事务B并发执行时,当事务B查询读取数据后,事务A新增或者删除了一条满足事务B查询条件的记录,此时事务B再去查询,发现查询到前一次不存在的记录,或者前一次查询的一些记录不见了。例如当事务A和事务B并发执行时,当事务A更新后,事务B查询读取到A尚未提交的数据,此时事务A回滚,则事务B读到的数据就是无效的脏数据(事务B读取了事务A尚未提交的数据)例如当事务A和事务B并发执行时,当事务B查询读取数据后,事务A更新操作更改事务B查询到的数据,此时事务B再次去读该数据,发现前后两次读的数据不一样。

2023-04-05 17:24:57 319

原创 MySQL存储引擎

不同引擎的本质上是数据库数据存储的结构方式不同在不同的数据下数据库储存有不同的需求,所以需要不同的引擎种类锁机 制B/B+树索 引哈希索 引外键事务索引缓存数据缓存MyISAM表锁支持不支持不支 持不支持支持不支持InnoDB行锁支持不支持支持支持支持支持Memory表锁支持支持不支 持不支持支持支持说明:锁机制:表示数据库在并发请求访问的时候,多个事务在操作时,并发操作的粒度B/B+树索引和哈希索引:主要是加速SQL的查询速度。

2023-04-04 15:33:13 251

原创 MySQL数据库范式

在要求更好的查询效率时,可以不遵循BC范式(多一个候选键,就多一份表,更多可能需要进行联合查询),候选键储存在主表上也是没有问题的,并不会造成数据的冗余,在一定程度上提高查询效率。比如:noNF表中的skill技能这个字段,有的人是“java,mysql”,有的人描述的是“Java,MySQL”,这样数据就不一致了,解决办法就是将多值属性放入一个新表。BC范式是在第三范式的基础上的一种特殊情况,即每个表中只有一个候选键(在一个数据库中每行的值都不相同,则可称为候选键)

2023-04-03 18:08:28 348 1

原创 MySQL基础-变量/流程控制/游标/触发器

在实际开发中,我们经常会遇到这样的情况:有 2 个或者多个相互关联的表,如 商品信息 和 库存信息 分别存放在 2 个不同的数据表中,我们在添加一条新商品记录的时候,为了保证数据的完整性,必须同时在库存表中添加一条库存记录。启动MySQL服务,生成MySQL服务实例期间,MySQL将为MySQL服务器内存中的系统变量赋值,这些系统变量定义了当前MySQL服务实例的属性、特征。在MySQL数据库的存储过程和函数中,可以使用变量来存储查询或计算的中间结果数据,或者输出最终的结果数据。注:只能用于存储程序。

2023-04-01 23:34:20 586 1

原创 MySQL基础-存储过程与函数

MySQL从5.0版本开始支持存储过程和函数,使得sql语句具有面向过程开发的特点存储过程和函数能够将复杂的SQL逻辑封装在一起,应用程序无须关注存储过程和函数内部复杂的SQL逻辑,而只需要简单地调用存储过程和函数即可存储过程是一组经过 预先编译 的 SQL 语句的封装,预先存储在 MySQL 服务器上,需要执行的时候,客户端只需要向服务器端发出调用存储过程的命令,服务器端就可以把预先存储好的这一系列 SQL 语句全部执行参数 IN 类型:输入参数(值)参数 OUT 类型:输出参数(值)参数 INOUT 类

2023-03-30 23:35:57 239

C语言实现三子棋(井字棋)源码.c

C语言实现三子棋(井字棋)源码

2021-07-30

空空如也

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

TA关注的人

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