自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 强软弱虚引用

强引用是最传统的“引用”的定义, 是指在程序代码之中普遍存在的引用赋值, 即类似“Object obj=newObject()”这种引用关系。无论任何情况下,只要强引用关系还存在, 垃圾收集器就永远不会回收掉被引用的对象。 软引用是用来描述一些还有用,但非必须的对象。只被软引用关联着的对象,在系统将要发生内存溢出异常前,会把这些对象列进回收范围之中进行第二次回收, 如果这次回收还没有足够的内存,才会抛出内存溢出异常。 弱引用也是用来描述那些非必须对象, 但是它的强度比软

2022-06-03 14:12:59 211 1

原创 synchronized 关键字和 volatile 关键字的区别

synchronized 关键字和 volatile 关键字是两个互补的存在,而不是对立的存在!两者主要有一下区别:1.volatile 关键字是线程同步的轻量级实现,所以 volatile性能肯定比synchronized关键字要好 。2. volatile 关键字只能用于变量而 synchronized 关键字可以修饰方法以及代码块 。3.volatile 关键字能保证数据的可见性,但不能保证数据的原子性。synchronized 关键字两者都能保证。4.volatile关键字主要用于解

2022-03-04 09:45:39 344

原创 启动线程调用strat()方法与run()方法的区别

new 一个 Thread,线程进入了新建状态。调用 start()方法,会启动一个线程并使线程进入了就绪状态,当分配到时间片后就可以开始运行了。 start() 会执行线程的相应准备工作,然后自动执行 run() 方法的内容,这是真正的多线程工作。 但是,直接执行 run() 方法,会把 run() 方法当成一个 main 线程下的普通方法去执行,并不会在某个线程中执行它,所以这并不是多线程工作。总的来说,调用start()方法方可启动线程并使线程进入就绪状态,直接执行run()方法的话不会以...

2022-03-04 09:40:41 362

原创 什么是死锁以及如何避免死锁?

1.什么是死锁线程死锁描述的是这样一种情况:多个线程同时被阻塞,它们中的一个或者全部都在等待某个资源被释放。由于线程被无限期地阻塞,因此程序不可能正常终止。例如,线程 1 持有资源 a,线程 2 持有资源 b,他们同时都想申请对方的资源,并且不释放自己的资源,所以这两个线程就会互相等待而进入死锁状态。2.产生死锁的四个必要条件互斥条件:该资源任意一个时刻只由一个线程占用。 请求与保持条件:一个进程因请求资源而阻塞时,对已获得的资源保持不放。 不剥夺条件:线程已获得的资源在未使用完之前不能被其

2022-03-04 09:35:37 421

原创 Java中的动态代理(三)--cglib动态代理

cglib动态代理使用ASM字节码技术动态生成代理类,因此效率相比反射的jdk动态代理更高。下面为示例。一、目标类,被代理类的本身public class Target { public void method1() { System.out.println("method1 running ..."); } public void method2() { System.out.println("method2 running ...");

2022-01-21 16:26:45 274

原创 Java中的代理(二)--JDK动态代理

JDK动态代理借助接口实现,目标类需是接口形式,代理类继承InvocationHandler类,通过反射方式动态创建目标类。1.目标对象public interface ByShoot { void byShoot(String size);}public class ShootFactory implements ByShoot{ @Override public void byShoot(String size) { System.out.println("已经为您生产出了

2022-01-21 16:14:43 330

原创 Java中的代理(一)

一、概念代理(Proxy)是一种设计模式,提供了对目标对象另外的访问方式;即通过代理对象访问目标对象.这样做的好处是:可以在目标对象实现的基础上,增强额外的功能操作,即扩展目标对象的功能。重要的编程思想:不要随意去修改别人已经写好的代码或者方法,如果需改修改,可以通过代理的方式来扩展该方法。二、Java中的代理定义:给目标对象提供一个代理对象,并且由代理对象控制对目标对象的引用目的:①:通过代理对象的方式间接的访问目标对象,防止直接访问目标对象给系统带来不必要的复杂性②:通过代理业务

2022-01-21 16:00:56 754

原创 Java中抽象类的特点

抽象类的特点1.由abstract修饰的类叫做抽象类,也可以修饰抽象方法2.abstract修饰的抽象方法可以不在抽象类当中实现,但一定要在子类当中重写,并实现3.只有抽象类当中才能有抽象方法,普通类当中不能有抽象方法4.抽象类当中不一定全是抽象方法,也可以使用普通方法,普通方法可以不用重写5.抽象类是对一些类共性的抽取,不能被实例化,但是可以使用多态6.final 不能和abstract同时使用,final修饰的方法禁止重写, abstract修饰的方法要求重写 ,冲突7.pr

2022-01-21 15:40:51 1446

原创 Java中的反射(二)

四、获取类信息并使用1.Field成员变量(1).设置值void set(Object obj,Object value)(2).获取值get(Object obj)(3).暴力反射使用setAccessible(true)方法,可以忽略访问权限修饰符的安全检查。 public static void main(String[] args) throws Exception { //0.获取Person的Class对象 Class pers

2022-01-21 15:28:47 84

原创 Java中的反射(一)

一、反射概念反射,简单来说就是分析类信息的能力,类信息包括属性、方法、构造器等。Java反射机制的核心是在程序运行时动态加载类并获取类的详细信息,从而操作类或对象的属性和方法。本质是JVM得到类对象之后,再通过类对象进行反编译,从而获取对象的各种信息。Java属于先编译再运行的语言,程序中对象的类型在编译期就确定下来了,而当程序在运行时可能需要动态加载某些类,这些类因为之前用不到,所以没有被加载到JVM。通过反射,可以在运行时动态地创建对象并调用其属性,不需要提前在编译期知道运行的对象是谁。

2022-01-21 15:06:36 94

原创 Java类加载顺序大乱斗

代码:加载涉及到静态与初始化,涉及到几个原则:1.未初始化变量拥有默认值(分为0,null,false);2.优先加载带static的的初始化与代码块;public class InitializeDemo { private static int k = 1; private static InitializeDemo t1 = new InitializeDemo("t1"); private static InitializeDemo t2 = new Ini

2022-01-15 20:53:00 298

原创 git基础语法(二)

1.分支管理1.查看分支git branch 查看本地分支git branch -a 查看所有分支2.创建分支 git checkout -b xxx分支名创建并切换分支,等价于=>git branch xxx git checkout xxx 两个命令和远程分支关联,第一次需执行 切换分支之后,第一次推送代码到远程仓库git push --set-upstream origin xxx3.切换分支git checko...

2022-01-13 13:43:20 133

原创 git基础语法(一)

1.常用命令git clone 克隆项目把远程仓库拉取到本地git clone 地址 分支(默认master)git clone git@gitee.com:liuzhenyu666/test0130.git // 默认拉取master分支代码git clone -b dev git@gitee.com:liuzhenyu666/test0130.git // 拉取dev分支代码git remote 远程仓库操作git remote -...

2022-01-13 12:54:45 236

原创 mybatis缓存

一、缓存概念1.什么是缓存?1.存储在内存当中的数据。2.将用户常使用的数据存放在缓存(内存)当中,用户查询数据就不用从磁盘(关系型数据库文件)当中查询,从缓存当中查询,从而提高查询效率,解决了高并发系统的性能问题。2.缓存的作用减少和数据库的交互次数,减少系统开销,提高系统效率。3.使用场景经常查询并且不长改变的数据。二、Mybatis缓存mybatis包含了一个非常强大的查询缓存特性,他可以非常方便的定制和配置缓存。缓存...

2022-01-13 12:32:37 550

原创 MySql中的数据修改

1.insert插入操作单行插入的语法格式:INSERT INTO student(列表1,列表2,列表3,列表4,列表5,列表6) VALUES (值1,值1 , 值1 , 值1 , 值1 ,值1);INSERT INTO student(id,name,sex,age,sno,class_num) VALUES (17,'hah','男',18,'202017','20201004'),(18,'hah','男',18,'202017','20201004'),(19,'hah','男

2022-01-12 21:51:20 1268

原创 MySql中的查询语法(三)--连接查询

连接查询是一种类型的多表查询。连接查询对多个表进行JOIN运算,简单地说,就是先确定一个主表作为结果集,然后,把其他表的行有选择性地“连接”在主表结果集上。如何查询出每一和学生所在的班级名称?就可以使用连接查询,例如,最常用的一种内连接——INNER JOIN来实现:SELECT student.name,class.class_name from student INNER JOIN class on student.class_num = class.class_num;注意INNER

2022-01-12 21:36:06 400

原创 MySQL中的查询语法(二)

1.聚合查询MySql中提供了内置的'函数',可以帮助计算目标行数,平均值等。查询student表中的记录数。SELECT COUNT(*) FROM student;除count()外还提供了其他聚合函数。2.分组查询分组查询的原理:先对数据进行分组,在对分组后的数据进行汇总,分组查询通常用于配合聚合函数,达到分类汇总统计信息的目的。而分类汇总的本质实际上就是先将数组进行分组,分组后相同类别的信息会聚在一起,然后通过需求进行计算。查询各个班的男生的平均身高SELECT

2022-01-12 21:11:29 207

原创 MySql中的查询语法(一)

1.普通查询SELECT * FROM student;SELECT是关键字,表示将要执行一个查询,*表示“所有列”,FROM表示将要从哪个表查询。注意:查询结果也是一个二维表,它包含列名和每一行的数据select语句并不是一定要包含from字句。例如select 100+200;2.条件查询查询班级号为 20201001 的学生SELECT * FROM student where class_num = '20201001';查询班级号为 20201001 的学

2022-01-12 20:45:48 792

原创 数据库中的表关系

1.一对一关系实例假设现在有两张表,一个是妻子表,一个是丈夫表,这两张表很明显存在一对一的关系。存在两张表A和B,分别添加主键,在其中一张表当中设置外键关联另一张表当中的主键。2.一对多关系实例一对多表关系当中,一方的表称为主表,多表的表称为从表。在从表当中添加一个外键用来关联主表当中的主键,这样就可以直线一对多关系。例如:部门与员工(部门表为主表,员工表为从表,在员工表的创建外键与部分表关联)3.多对多关系实例因为每个表中的每条数据都可能对多个数据,所以外键无论放到那张

2022-01-12 20:11:24 2509

原创 SQL中的约束

什么是约束?为了确保表中的数据的完整性(准确性、正确性),为表添加一些限制。是数据库中表设计的一个最基本规则。使用约束可以使数据更加准确,从而减少冗余数据(脏数据)。数据库完整性约束分为以下几个大类:主键约束、唯一约束、非空约束、默认约束、外键约束。1.主键约束理论上来说每一个数据表都必须有一个唯一主键作为数据的唯一标识,设置主键的列不允许为空,主键习惯 id 表示,可以在创建数据时直接指定,也可以通过修改表结构直接添加,设置为主键的列在添加数据时不能重复,即唯一性。添加两条相同主键值的

2022-01-12 19:21:16 237

原创 MySql当中的数据类型

整数类型: tinyint、int浮点类型:float、 double布尔类型:mysql当中没有boolean类型在MYSQL一般boolean类型都用int代替,1代表true,0代表flase字符串类型:varchar: 可变长度类型,无论创建表时指定多大长度,存储数据的时候会按照数据的实际长度进行空间占用,设置的最大值的目的就是设定最大范围。char:固定长度类型,当存储的数据长度小于创建表时指定的长度,则用空格填充,而不会自动调整。日期类型:Data 年月日Ti

2022-01-12 18:38:31 97

原创 对数据库的基本操作

1.创建数据库create database [if not exists] 数据库名 [character set 字符集];if not exists是判断是否已存在该名称数据库,如果无则创建,如果已存在则取消。character set是设置字符集种类。2.查询、使用服务器上已存在的所有数据库1.查询已有数据库show databases;2.使用数据库use [数据库名];3.查询、修改数据库字符集1.查看当前数据库的信息(包含默认字符集)show

2022-01-12 18:33:34 145

原创 八大排序-归并排序

归并排序就是递归得将原始数组递归对半分隔,直到不能再分(只剩下一个元素)后,开始从最小的数组向上归并排序。将一个数组拆分为两个,从中间点拆开,通过递归操作来实现一层一层拆分。 从左右数组中选择小的元素放入到临时空间,并移动下标到下一位置。 重复步骤2直到某一下标达到尾部。 将另一序列剩下的所有元素依次放入临时空间。 将临时空间的数据依次放入原数据数组。 //分 public static void mergeSort(int[] a, int low, int high) { //首

2022-01-09 19:18:54 41

原创 八大排序-快速排序

快速排序:将数组第一个数当做基准数,定义两个指针分别指向待排序数组的左右两段,移动右边指针找到比基准数小的数停止,移动左边指针找到比基准数大的数停止,之后两个指针的值互换,继续寻找至两个指针重合,重合的数值和基准数互换。原第一个数到达正确位置,其左右进行递归快排。 public static void quickSort(int[] arr,int left,int right){ if(left >= right){ return; }

2022-01-09 19:16:05 441

原创 八大排序-基数排序

基数排序:将整数按位切割成不同的数字,然后按每个位数分别比较。具体做法是:将所有待比较数值统一为同样的位数长度,数位较短的数前边补零。然后,从最低位开始,依次进行一次排序,这样从最低位排序一直到最高位排序完成后,就变成一个有序数列。//基数排序方法 public static void sort(int[] arr) { //得到数组当中最大数的位数 int max = arr[0]; //假设第一个数就是最大数 for (int i = 0; i < arr..

2022-01-09 19:14:33 84

原创 八大排序-堆排序

堆排序:完全二叉树:从上到下,从左到右依次平铺满的二叉树。大(小)顶堆:完全二叉树的每个节点的值都要大于(小于)其左右子树的顶点。应用中利用完全二叉树的某些特性而在数组中构建大小顶堆。N[i]的左子节点为N[2i+1],右子节点为N[2i+2],其父节点为N[(i-1)/2]调整指 将换位后的父子节点的子节点的值往堆底移动。 /** * 创建堆, * @param arr 待排序列 */ private static void he.

2022-01-09 19:11:45 46

原创 八大排序-希尔排序

希尔排序(缩小增量排序)(O(nlogn)):根据数组长度的一般来确定每一组的步长,每组内的数据进行插入排序。步长再设置为原来步长的一半,在进行组内插入排序。直至步长缩小为一。缩小为一后,从第一位开始左右比较小左大右尽心微调一遍。public static void shellSort(int[] arr){ for(int gap = arr.length /2;gap > 0;gap /= 2){ for (int i = gap ;i < a

2022-01-09 19:08:14 44

原创 八大排序-插入排序

插入排序(O(n^2)):认定待排序的数组当中的第一个数为已经排序好的的数组,在遍历的过程中将待排序的数组插入到数组中。(数组的下标是连续的内存地址,只能逐渐改变该位置的数值,使整个数组逐渐移位。) public static void Sort(int[] arr) { for (int i = 1; i < arr.length; i++) { //将当前数据插入到已经有序的数字当中(这里需要倒着往前找) for ( in

2022-01-09 18:59:28 131

原创 八大排序-选择排序

选择排序:规定最小指针为第一项,依次与数组后几位比较,将小数放入指针,比较完数组,将指针与第一位交换数值,接着将第二位赋值给指针与后几位比较,重复此操作,将数组第二小放入第二位,重复操作,实现从小到大排序。public class Insert { public static void main(String[] args) { int[] arr = {8,65,41,28,6,1,4,5,32,9,10}; System.out.println("排序前")

2022-01-09 18:54:48 245

原创 八大排序-冒泡排序

冒泡排序:在数组中从第一项开始与其右一位比较大小,大者移至次序较大处,接着第二项与其右一位相比,重复比较大小,大者移至靠右位,如此至最后一项,可使数组最大的数移至最右,数组前几位重复操作一一将最大值移至右位,实现从小到大排序。总结来说,升序排序当中每一轮比较会把最大的数沉到最底(这里以从小到大为例),所有相互比较的次数每一轮会比前一轮少一次。public class BubbleSort { static int[] arr = new int[] {8,65,41,28,6,1,4,5,3

2022-01-09 18:52:30 250

原创 Mybatis连表查询

1.一对一、多对一(association)<select id="listPage1" parameterType="java.lang.Long" resultMap="BaseResultMapOneToOne"> select <include refid="Base_Column_List" /> from student</select>//结果映射<resultMap id="BaseResultMapOneTo

2021-12-25 18:47:43 431

原创 foreach标签

collection:表示迭代集合的名称,自定义名称,可以使用@Param注解指定 只有一个List/Array/Map类型参数时,如果不加@Param注解,collection分别必须填:list、array、map中的key属性 有多个参数时,不加@Param注解,collection和默认参数名称一致 如果加@Param注解,都和注解定义一致 item:表示本次迭代获取的元素,自定义名称;表示本次迭代获取的元素,若collection为List、Set或者数组,则表示其中的元素;若co

2021-12-25 18:41:36 146

原创 trim标签

trim标签是一个格式化的标签,可以完成set或者是where标签的功能1.用 trim 实现if+where 语句<select id="selectUserByUsernameAndSex" parameterType="com.qcby.entity.User" resultType="com.qcby.entity.User"> select * from user<!-- <where>-->

2021-12-25 17:47:46 2274

原创 动态sql与<if>标签

Mybatis中的sql语句处理在遇到where字句中有多项判断,并且判断的入参可能为空时。如果是忽略或者是只是用<if>标签判断非空,仍可能引起查询不正确,或sql语句报错。正确的使用方法时<if>标签搭配<where>标签或<set>标签使用,<set>标签用于可用于插入语句或更新语句。<where><if><select id="selectUserByUsernameAndSex" paramet

2021-12-21 20:25:11 881

原创 #{}和${}的区别

1.配置sql输出日志注意:要在配置文件的第一行进行配置。<!-- settings:控制mybatis的全局行为--><settings> <!--设置mybatis输出日志--> <!--logImpl:表示对日志的控制--> <!--STDOUT_LOGGING:将日志输出到控制台上--> <setting name="logImpl" value="STDOUT_LOGGING" .

2021-12-21 20:08:05 303

原创 MyBatis参数详解

1. parameterType(入参类型)1. 简单数据类型int、double类型、String类型简单的写法:java.lang.Integer --> int integer Int Integer 都可以,框架提供简写的方式。2. POJO(JavaBean实体类)对象类型默认是不能简写,可以配置。例如,User对象。2. resultType(返回类型)1. 返回简单数据类型int、double、long、String2. 返回POJO数据类型例如,

2021-12-21 19:51:07 705

原创 Mybatis的增删改查

1.UserDao接口代码import com.qcby.entity.User;import java.util.List;public interface UserDao { /** * 全部查询 * @return */ public List<User> findAll(); /** * 根据id进行查询 * @param id */ public User findById(in

2021-12-21 19:43:21 49

原创 static关键字

static的作用在《Java编程思想》当中有这样一段话:“static方法就是没有this的方法。在static方法内部不能调用非静态方法,反过来是可以的。而且可以在没有创建任何对象的前提下,仅仅通过类本身来调用static方法。这实际上正是static方法的主要用途。”被static关键字修饰的方法或者变量不需要依赖于对象来进行访问,只要类被加载了,就可以通过类名去进行访问。总结来说,static关键字的作用就是方便在没有创建对象的情况下,去使用对象中的方法和变量。static修饰方法与

2021-12-18 17:22:59 206

原创 String类的常用方法

String类常用API1.char charAt ( int index)返回索引位置的代码单元2.boolean equals(Object other) 比较是否与字符串相同3.boolean equalsIgnoreCase( String other ) 忽略大小写地比较是否与字符串相同4.boolean startsWith( String prefix ) boolean endsWith( String suff...

2021-12-18 17:07:31 212

原创 equals()和hashcode()

Object中的equals()和hashcode()的联系hashCode()是Object类的一个方法,返回一个哈希值。如果两个对象根据equal()方法比较相等,那么调用这两个对象中任意一个对象的hashCode()方法必须产生相同的哈希值;如果两个对象根据eqaul()方法比较不相等,那么产生的哈希值不一定相等(冲突的情况下还是会相等的)。a.hashCode()有什么用与a.equals(b)有什么关系hashCode()方法是为对象产生整型的 hash 值,用作对象的唯一标识。它常用

2021-12-18 15:02:26 61

空空如也

空空如也

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

TA关注的人

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