自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 源码梳理(5)HashMap的put方法

源码使用的是JDK17HashMap的数据存放简述1 HashMap中存在一个属性名叫table的哈希表,结构类型是数组2 哈希表这个数组,它的每一个下标位置存放的是Node类型的链表的首节点(链表在一定条件下会转为红黑树)3 每一个Node实例都会有key和value的属性值,对应的是HashMap中的一条数据(也可以说一个Node就是一条数据)

2024-02-22 17:59:07 604

原创 源码梳理(4)ReentrantLock的lock方法(涉及AQS)

本文主要分析非公平的ReentrantLock实例调用lock方法,源码使用的版本是JDK17。通过内部的Sync同步器尝试获取锁通过AbstractQueuedSynchronizer(抽象队列同步器AQS)获取锁源码中的说明:等待队列是 “CLH”(Craig, Landin, and Hagersten)锁队列的一个变种。CLH 锁通常用于自旋锁。

2024-02-21 16:30:44 810

原创 源码梳理(3)MybatisPlus启动流程

这里又通过getSqlSession获取到了一个SqlSession实例,也是真正来执行接口方法(本次示例中是SqlSession的selectList方法)的是实例,先去getSqlSession方法里看看这次获取到的sqlSession又是什么类型,传入的三个参数sqlSessionFactory,executorType,exceptionTranslator都是在构建SqlSessionTemplate时赋值的,后面会分析到的。

2024-02-04 10:37:09 1132

原创 源码梳理(2)SpringMVC的执行流程及涉及到的相关组件

FrameworkServlet的service方法,如果是"DELETE", “HEAD”, “GET”, “OPTIONS”, “POST”, “PUT”, "TRACE"方法的请求会交给父类也就是HttpServlet的另一个(参数是HttpServletRequest,HttpServletResponse重载的)service方法,该service方法会根据请求类型,将任务再分发给doGet(),doPost()等方法,而这写方法都被FrameworkServlet重写了。

2024-02-01 10:24:12 1295

原创 源码梳理(1)Springboot启动过程中的refreshContext(context) 刷新上下文,实例化Bean

AbstractBeanFactory的doGetBean方法中的getSingleton()方法,该方法的第二参数是一个函数式接口ObjectFactory

2024-01-30 14:41:42 934

原创 踩坑(6)Redisson调用unlockAsync方法释放锁失败

通过redisson的lockAsync异步方法获取到锁之后,再业务执行完成后调用lock.unlockAsync()无法释放当前锁,导致后续的方法被阻塞。释放锁的时候,当前如果没有传入线程id就会使用当前线程的id,由于当前方法是异步方法,和获取锁时的线程是不同的线程所以导致锁释放失败。调用unlockAsync() 方法时传入获取锁线程的线程id。

2024-01-24 15:29:02 774

原创 踩坑(5)整合kafka 报错 java.net.UnknownHostException: 不知道这样的主机

整合kafka 报错 java.net.UnknownHostException: 不知道这样的主机

2023-08-01 18:23:30 2541

原创 踩坑(4)SpringCloud Gateway lb:// 负载均衡问题

由于部分新版本spring-cloud-starter-gateway移除了负载均衡依赖,所以需要手动添加spring-cloud-loadbalancer。配置网关服务的时候,uri设置http://localhost:9000可以正常路由,但是设置lb负载均衡后无法路由跳转。

2022-10-09 14:35:13 1236 3

原创 踩坑(3)连接虚拟机Redis报错

连接虚拟机Redis报错 redis连接失败 redis连接超时

2022-09-26 14:17:46 244

原创 踩坑(2) Nacos-Server 启动报错 UnsatisfiedDependencyException UnsatisfiedLinkError

nacos 报错

2022-09-22 15:35:22 895 1

原创 踩坑(1) SpringBoot MyBatisPlus 报错Invalid bound statement (not found)

SpringBoot MyBatisPlus 报错Invalid bound statement (not found)

2022-09-19 10:25:18 414

转载 Day79(java,反射:动态代理)

反射的应用:动态代理代理设计模式的原理:使用一个代理将对象包装起来, 然后用该代理对象取代原始对象。任何对原始对象的调用都要通过代理。代理对象决定是否以及何时将方法调用转到原始对象上。之前为大家讲解过代理机制的操作,属于静态代理,特征是代理类和目标对象的类都是在编译期间确定下来,不利于程序的扩展。同时,每一个代理类只能为一个接口服务,这样一来程序开发中必然产生过多的代理。最好可以通过一个代理类完成全部的代理功能。动态代理是指客户通过代理类来调用其它对象的方法,并且是在程序运行时根据需要动态创

2021-05-11 21:52:57 84

转载 Day78(mysql,存储过程,函数,流程控制)

存储过程#存储过程和函数 /*存储过程和函数:类似于java中的方法好处:1、提高代码的重用性2、简化操作*/#存储过程 /*含义:一组预先编译好的SQL语句的集合,理解成批处理语句1、提高代码的重用性2、简化操作3、减少了编译次数并且减少了和数据库服务器的连接次数,提高了效率*/#一、创建语法 CREATE PROCEDURE 存储过程名 (参数列表)BEGIN 存储过程体(一组合法的SQL语句)END #注意: /*1、参数列表包含三部分参数模式 参数名

2021-05-11 21:51:45 119

转载 Day77(常见约束,标识列,事务,视图,变量)

常见预约#常见约束 /*含义:一种限制,用于限制表中的数据,为了保证表中的数据的准确和可靠性分类:六大约束 NOT NULL:非空,用于保证该字段的值不能为空 比如姓名、学号等 DEFAULT:默认,用于保证该字段有默认值 比如性别 PRIMARY KEY:主键,用于保证该字段的值具有唯一性,并且非空 比如学号、员工编号等 UNIQUE:唯一,用于保证该字段的值具有唯一性,可以为空 比如座位号 CHECK:检查约束【mysql中不支持】 比如年龄、性别 FOREIGN KEY:

2021-05-09 01:35:46 96

转载 Day76(分页查询,联合查询,数组处理之增删改DML语言)

分页查询#进阶8:分页查询 ★ /*应用场景:当要显示的数据,一页显示不全,需要分页提交sql请求语法: select 查询列表 from 表 【join type join 表2 on 连接条件 where 筛选条件 group by 分组字段 having 分组后的筛选 order by 排序的字段】 limit 【offset,】size; offset要显示条目的起始索引(起始索引从0开始) size 要显示的条目个数特点: ①limit语句放在查询语句的最后

2021-05-09 01:34:15 127

转载 Day75(子查询)

子查询#进阶7:子查询/*含义:出现在其他语句中的select语句,称为子查询或内查询外部的查询语句,称为主查询或外查询分类:按子查询出现的位置: select后面: 仅仅支持标量子查询 from后面: 支持表子查询 where或having后面:★ 标量子查询(单行) √ 列子查询 (多行) √ 行子查询 exists后面(相关子查询) 表子查询按结果集的行列数不同: 标量子查询(结果集只有一行一列) 列子查询(结果集只有一列多行) 行子查询(结果集

2021-04-24 16:32:10 102

转载 Day74(99标准连接查询)

99标准连接查询#二、sql99语法 /*语法: select 查询列表 from 表1 别名 【连接类型】 join 表2 别名 on 连接条件 【where 筛选条件】 【group by 分组】 【having 筛选条件】 【order by 排序列表】分类:内连接(★):inner外连接 左外(★):left 【outer】 右外(★):right 【outer】 全外:full【outer】交叉连接:cross */#一)内连接 /*语法:selec

2021-04-21 23:15:55 101

转载 Day73(92标准连接查询)

92标准连接查询#连接查询 /*含义:又称多表查询,当查询的字段来自于多个表时,就会用到连接查询笛卡尔乘积现象:表1 有m行,表2有n行,结果=m*n行发生原因:没有有效的连接条件如何避免:添加有效的连接条件分类: 按年代分类: sql92标准:仅仅支持内连接 sql99标准【推荐】:支持内连接+外连接(左外和右外)+交叉连接 按功能分类: 内连接: 等值连接 非等值连接 自连接 外连接: 左外连接 右外连接 全外连接 交叉连接*/

2021-04-19 00:09:48 89

转载 Day72(分组查询)

分组查询#进阶5:分组查询 /*语法:select 查询列表from 表【where 筛选条件】group by 分组的字段【order by 排序的字段】;特点:1、和分组函数一同查询的字段必须是group by后出现的字段2、筛选分为两类:分组前筛选和分组后筛选 针对的表 位置 连接的关键字分组前筛选 原始表 group by前 where分组后筛选 group by后的结果集 group by后 having问题1:分组函数做筛选能不能放在wher

2021-04-16 22:56:26 82

转载 Day71(分组函数)

分组函数#二、分组函数 /*功能:用作统计使用,又称为聚合函数或统计函数或组函数分类:sum 求和、avg 平均值、max 最大值 、min 最小值 、count 计算个数特点:1、sum、avg一般用于处理数值型 max、min、count可以处理任何类型2、以上分组函数都忽略null值3、可以和distinct搭配实现去重的运算4、count函数的单独介绍一般使用count(*)用作统计行数5、和分组函数一同查询的字段要求是group by后的字段*/#1. 简单的使用

2021-04-16 00:12:16 72

转载 Day70(sql常见函数)

测 试查询员工的姓名和部门号和年薪,按年薪降序 按姓名升序选择工资不在8000到17000的员工的姓名和工资,按工资降序查询邮箱中包含e的员工信息,并先按邮箱的字节数降序,再按部门号升序#1. 查询员工的姓名和部门号和年薪,按年薪降序 按姓名升序SELECT last_name,department_id,salary*12*(1+IFNULL(commission_pct,0)) 年薪FROM employeesORDER BY 年薪 DESC,last_name ASC;#2. 选择

2021-04-12 00:23:08 178

转载 Day69(MySQl语法规范,SQL的语言分类,查询,条件查询,排序查询)

MySQL语法规范不区分大小写(但建议关键字大写,表名、列名小写)每句话用;或\g结尾各子句一般分行写关键字不能缩写也不能分行用缩进提高语句的可读性注释单行注释:#注释文字单行注释:-- 注释文字多行注释:/* 注释文字 */SQL的语言分类DQL(Data Query Language):数据查询语言selectDML(Data Manipulate Language):数据操作语言insert 、update、deleteDDL(Data Define Languge

2021-04-09 00:03:36 128

转载 Day68(获取运行时类的完整结构,调用运行时类的指定结构)

获取运行时类的完整结构通过反射获取运行时类的完整结构Field、Method、Constructor、Superclass、Interface、Annotation实现的全部接口所继承的父类全部的构造器全部的方法全部的Field使用反射可以取得:1.实现的全部接口public Class<?>[] getInterfaces()确定此对象所表示的类或接口实现的接口。2.所继承的父类public Class<? Super T>

2021-04-04 00:50:31 94

转载 Day67(创建运行时类的对象,newInstance())

创建运行时类的对象有了Class对象,能做什么?创建类的对象:调用Class对象的newInstance()方法要求:1)类必须有一个无参数的构造器。2)类的构造器的访问权限需要足够。难道没有无参的构造器就不能创建对象了吗?不是!只要在操作的时候明确的调用类中的构造器,并将参数传递进去之后,才可以实例化操作。步骤如下:1)通过Class类的getDeclaredConstructor(Class … parameterTypes)取得本类的指定形参类型的构造器2)向构造器的形参中传递一个对

2021-04-03 01:04:56 136

转载 Day66(数据库和SQL概述,MySQL安装与使用,MySQL的常见命令)

MySQL数据库和SQL概述数据库的好处实现数据持久化使用完整的管理系统统一管理,易于查询数据库的概念DB数据库(database):存储数据的“仓库”。它保存了一系列有组织的数据。DBMS数据库管理系统(Database Management System)。数据库是通过DBMS创建和操作的容器SQL结构化查询语言(Structure Query Language):专门用来与数据库通信的语言。SQL的优点:1、不是某个特定数据库供应商专有的语言,几乎所有DBMS都支

2021-04-01 23:37:53 129

转载 Day65(类的加载与ClassLoader的理解)

类的加载与ClassLoader的理解了解:类的加载过程当程序主动使用某个类时,如果该类还未被加载到内存中,则系统会通过如下三个步骤来对该类进行初始化。类的加载–>类的链接–>类的初始化类的加载:将类的class文件读入内存,并为之创建一个java.lang.Class对象。此过程由类加载器完成类的链接:将类的二进制数据合并到JRE中类的初始化:JVM负责对类进行初始化加载:将class文件字节码内容加载到内存中,并将这些静态数据转换成方法区的运行时数据结构,然后生成一个代表这

2021-03-29 23:54:50 86

转载 Day64(反射,Reflection,动态语言,静态语言,Class类,获取Class的实例)

反射Java反射机制概述Java ReflectionReflection(反射)是被视为动态语言的关键,反射机制允许程序在执行期借助于Reflection API取得任何类的内部信息,并能直接操作任意对象的内部属性及方法。加载完类之后,在堆内存的方法区中就产生了一个Class类型的对象(一个类只有一个Class对象),这个对象就包含了完整的类的结构信息。我们可以通过这个对象看到类的结构。这个对象就像一面镜子,透过这个镜子看到类的结构,所以,我们形象的称之为:反射。正常方式:引入需要的

2021-03-28 22:16:06 103

转载 Day63(TCP练习,客户端服务端,UDP,DatagramSocket,URL网络编程)

2.客户端发送文件给服务端,服务端将文件保存在本地。import org.junit.Test;import java.io.*;import java.net.InetAddress;import java.net.ServerSocket;import java.net.Socket;import java.net.UnknownHostException;/*2.客户端发送文件给服务端,服务端将文件保存在本地。 */public class TCPTest2 { @Te

2021-03-28 01:09:41 123

原创 Day62(NIO.2,网络编程,IP和端口号,InetAddress,网络通信协议,TCP/IP,Socket,SeverSocket,TCP编程)

NIO.2中Path、Paths、Files类的使用Java NIO 概述Java NIO (New IO,Non-Blocking IO)是从Java 1.4版本开始引入的一套新的IO API,可以替代标准的Java IO API。NIO与原来的IO有同样的作用和目的,但是使用的方式完全不同,NIO支持面向缓冲区的(IO是面向流的)、基于通道的IO操作。NIO将以更加高效的方式进行文件的读写操作。Java API中提供了两套NIO,一套是针对标准输入输出NIO,另一套就是网络编程NIO。

2021-03-23 22:52:49 178

转载 Day61(随机存取文件流)

随机存取文件流RandomAccessFile类import org.junit.Test;import java.io.File;import java.io.FileNotFoundException;import java.io.IOException;import java.io.RandomAccessFile;import java.nio.charset.StandardCharsets;/** * 1.RandomAccessFile直接继承于java.lang.Obj

2021-03-19 22:50:58 64

原创 Day60(打印流,数据流,对象流,对象的序列化,Serializable接口,SerialVersionUID常量)

处理流之四:打印流(了解)出程序。@Test /* * 2. 打印流: * PrintStream 和PrintWriter * 说明: * 提供了一系列重载的print()和println()方法,用于多种数据类型的输出 * System.out返回的是PrintStream的实例 */ public void test1() { PrintStream ps = null; try {

2021-03-17 22:40:33 147

原创 Day59(转换流,InputStreamReader,OutputStreamWriter,字符编码,输入,输出流)

处理流之二:转换流转换流提供了在字节流和字符流之间的转换Java API提供了两个转换流:InputStreamReader:将InputStream转换为ReaderOutputStreamWriter:将Writer转换为OutputStream字节流中的数据都是字符时,转成字符流操作更高效。很多时候我们使用转换流来处理文件乱码问题。实现编码和解码的功能。InputStreamReader InputStreamReader isr = null

2021-03-15 23:47:36 115

原创 Day58(InputStream,Reader,OutputStream,Writer,节点流,缓冲流)

InputStreamint read()从输入流中读取数据的下一个字节。返回0到255范围内的int字节值。如果因为已经到达流末尾而没有可用的字节,则返回值-1。int read(byte[]b)从此输入流中将最多b.length个字节的数据读入一个byte数组中。如果因为已经到达流末尾而没有可用的字节,则返回值-1。否则以整数形式返回实际读取的字节数。int read(byte[]b,int off,int len)将输入流中最多len个数据字节读入byte数组。尝试读取len个

2021-03-12 23:40:34 121

原创 Day57(IO原理,流的分类,节点流和处理流,InputStream&Reader)

IO流原理及流的分类Java IO原理I/O是Input/Output的缩写,I/O技术是非常实用的技术,用于处理设备之间的数据传输。如读/写文件,网络通讯等。Java程序中,对于数据的输入/输出操作以“流(stream)”的方式进行。java.io包下提供了各种“流”类和接口,用以获取不同种类的数据,并通过标准的方法输入或输出数据。输入input:读取外部数据(磁盘、光盘等存储设备的数据)到程序(内存)中。输出output:将程序(内存)数据输出到磁盘、光盘等存储设备中。

2021-03-11 22:59:44 180

原创 Day56(File类的方法,File类练习)

File类的判断功能public boolean isDirectory():判断是否是文件目录public boolean isFile():判断是否是文件public boolean exists():判断是否存在public boolean canRead():判断是否可读public boolean canWrite():判断是否可写public boolean isHidden():判断是否隐藏public void test4(){ Fi

2021-03-10 23:05:47 326

原创 Day55(IO流,File类的使用,常用构造器,路径分隔符,常用方法,获取功能的方法和重命名功能)

IO流File 类的使用java.io.File类:文件和文件目录路径的抽象表示形式,与平台无关File 能新建、删除、重命名文件和目录,但File 不能访问文件内容本身。如果需要访问文件内容本身,则需要使用输入/输出流。想要在Java程序中表示一个真实存在的文件或目录,那么必须有一个File对象,但是Java程序中的一个File对象,可能没有一个真实存在的文件或目录。File对象可以作为参数传递给流的构造器/** * 1.File类的理解 * 1. File类的一个对

2021-03-04 00:24:04 139 1

原创 Day54(泛型练习题)

泛型练习题:定义个泛型类DAO,在其中定义一个Map 成员变量,Map 的键为String 类型,值为T 类型。分别创建以下方法:public void save(String id,T entity):保存T 类型的对象到Map 成员变量中public T get(String id):从map 中获取id 对应的对象public void update(String id,T entity):替换map 中key为id的内容,改为entity 对象public List list():返回m

2021-03-03 00:20:35 495

原创 Day53(泛型方法,泛型在继承上的体现,通配符的使用,有限制的通配符)

自定义泛型结构:泛型方法方法,也可以被泛型化,不管此时定义在其中的类是不是泛型类。在泛型方法中可以定义泛型参数,此时,参数的类型就是传入数据的类型。泛型方法的格式:[访问权限]<泛型>返回类型方法名([泛型标识参数名称])抛出的异常泛型方法声明泛型时也可以指定上限(在12.5中讲public class DAO {public<E> E get(intid, E e) {E result= null;return result; }}publi

2021-03-01 23:52:26 91

原创 Day52(泛型,在集合中使用泛型,自定义泛型结构:类与接口)

那么为什么要有泛型呢,直接Object不是也可以存储数据?1.解决元素存储的安全性问题,好比商品、药品标签,不会弄错。2.解决获取数据元素时,需要类型强制转换的问题,好比不用每回拿商品、药品都要辨别。Java泛型可以保证如果程序在编译时没有发出警告,运行时就不会产生ClassCastException异常。同时,代码更加简洁、健壮。在集合中使用泛型① 集合接口或集合类在jdk5.0时都修改为带泛型的结构。② 在实例化集合类时,可以指明具体的泛型类型③ 指明完以后,在集合类或接口中凡是定义类

2021-03-01 00:02:23 152

原创 Day51(泛型)

泛型为什么要有泛型(Generic)泛型:标签举例:中药店,每个抽屉外面贴着标签超市购物架上很多瓶子,每个瓶子装的是什么,有标签泛型的设计背景集合容器类在设计阶段/声明阶段不能确定这个容器到底实际存的是什么类型的对象,所以在JDK1.5之前只能把元素类型设计为Object,JDK1.5之后使用泛型来解决。因为这个时候除了元素的类型不确定,其他的部分是确定的,例如关于这个元素如何保存,如何管理等是确定的,因此此时把元素的类型设计成一个参数,这个类型参数叫做泛型。Col

2021-02-28 00:21:57 104

空空如也

空空如也

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

TA关注的人

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