Java
dreaming9420
还有头发,还能学
展开
-
Java Socket聊天室
Socket聊天室1 创建登录判断类UserLogin2 创建登录服务器LoginServer3 创建聊天服务器ChatServer4 创建客户端Client5 创建服务器用于处理聊天的线程类ChatThread6 创建客户端Client用于发送消息的线程类WriteThread7 创建客户端Client用于接收消息的线程类ReadThread8 测试8.1 登录8.2 群聊8.2 单聊1 创建登录判断类UserLoginimport java.util.HashSet;import java.uti原创 2022-05-24 17:38:48 · 1634 阅读 · 0 评论 -
canal+rabbitmq解决mysql与redis缓存数据一致性问题
文章目录1 mysql1.1 开启 MySQL的binlog1.2 重启mysql1.3 查看binlog是否已被开启1.4 修改密码策略1.5 新建canal用户并授权2 rabbitmq2.1 拉取rabbitmq镜像2.2 运行rabbitmq镜像2.3 进入Rabbitmq Management3 canal3.1 下载canal3.2 创建解压目录并解压3.3 修改配置文件3.3.1 conf/canal.properties3.3.2 conf/example/instance.properti原创 2022-05-02 03:28:26 · 5494 阅读 · 3 评论 -
Spring Boot集成Redisson布隆过滤器解决redis缓存穿透问题
文章目录1 什么是布隆过滤器2 布隆过滤器的作用3 布隆过滤器的基本原理4 在Spring Boot中集成Redisson实现布隆过滤器4.1 添加maven依赖4.2 配置yml4.3 配置RedissonConfig4.4 工具类BloomFilterUtil4.5 编写service实现层1 什么是布隆过滤器介绍布隆过滤器之前,先介绍一下哈希函数,我们在Java中的HashMap,HashSet也接触过hashcode()这个函数。哈希函数指将哈希表中元素的关键键值通过一定的函数关系映射为元素原创 2022-04-14 13:48:00 · 4173 阅读 · 9 评论 -
正则表达式
比如ab(cd)(gh)\1\2,这里的\1就表示"cd",\2就表示"gh",ab(cd)(gh)\1\2等同于abcdghcdgh。如果我们要把搜索到的指定字符串按规则替换,比如各加一个"[]",这个时候,使用replaceAll()的时候,我们传入的第二个参数可以使用$1,$2等来反向引用匹配到的子串。未引入次数之前,我们匹配几个字符就得在正则表达式中重复写几次,例如匹配5个数字,之前是"\d\d\d\d\d",引入次数之后可以写为"\d{5}"单个空白字符,如单个空格或回车(\n)或制表(\t),原创 2022-04-09 16:38:56 · 1122 阅读 · 0 评论 -
Cron表达式
1 什么是Cron表达式Cron表达式是一个字符串,字符串以5或6个空格隔开,分为6或7个域,每一个域代表一个含义,Cron有如下两种语法格式:Seconds Minutes Hours DayofMonth Month DayofWeek Year Seconds Minutes Hours DayofMonth Month DayofWeek2 域取值3 特殊字符4 取值示例...原创 2022-04-08 16:09:27 · 314 阅读 · 0 评论 -
Java实现定时任务
文章目录1 使用java.util.Timer2 使用ScheduledExecutorService3 使用Spring Task1 使用java.util.Timer这种方式的定时任务主要用到两个类,Timer 和 TimerTask,使用起来比较简单。其中 Timer 负责设定 TimerTask 的起始与间隔执行时间。 TimerTask是一个抽象类,new的时候实现自己的 run 方法,然后将其丢给 Timer 去执行即可。代码示例:import java.time.LocalDateTi原创 2022-04-08 15:40:47 · 29149 阅读 · 0 评论 -
深入理解JVM(六)JVM调优
文章目录1 调优原则2 何时进行JVM调优3 JVM调优的步骤4 JVM命令5 可视化故障处理工具6 JVM参数解析及调优1 调优原则大多数的Java应用不需要进行JVM调优,一般项目加个xms和xmx参数就够了,JVM调优不是常规手段,性能问题一般第一选择是优化代码,最后的选择才是进行JVM调优,JVM优化是最后不得已的手段。2 何时进行JVM调优Heap内存(老年代)持续上涨达到设置的最大内存值Full GC 次数频繁GC 停顿时间过长(超过1秒)应用出现OutOfMemory 等内存异原创 2022-04-06 00:59:40 · 828 阅读 · 0 评论 -
深入理解JVM(五)垃圾收集器
文章目录1 概念补充1.1 单线程与多线程1.2 串行、并发和并行1.3 吞吐量1.4 client模式与server模式2 经典垃圾收集器2.1 Serial与Serial Old收集器2.2 ParNew收集器2.3 Parallel Scavenge 和 Parallel Old收集器2.4 CMS收集器2.5 Garbage First(G1)收集器2.5.1 G1新生代垃圾回收2.5.2 G1老年代垃圾回收2.5.3 G1回收失败时的Full GC3 各个垃圾收集器比较如果说收集算法是内存回收原创 2022-04-03 21:17:06 · 704 阅读 · 0 评论 -
深入理解JVM(四)JVM的垃圾回收机制
文章目录1 什么是垃圾回收机制2 Java中的引用类型3 如何判断对象是否可以被回收4 方法区的垃圾收集5 垃圾收集算法5.1 标记-清除(Mark-Sweep)算法5.2 标记整理(Mark-Compact)算法5.3 复制算法5.4 分代收集算法6 内存分配与回收策略6.1 内存分配策略6.1.1 内存分配6.1.2 堆的年轻代为什么要有两个Survivor区6.2 内存回收策略6.2.1 Minor GC 、Major GC、Mixed GC和 Full GC的区别6.2.2 Minor GC触发条件原创 2022-04-01 21:07:30 · 1359 阅读 · 2 评论 -
深入理解JVM(三)Java 类加载机制
文章目录1 什么是类加载机制2 类的生命周期2.1 加载2.2 验证2.3 准备2.4 解析2.5 初始化2.5.1 < clinit >()方法详解2.5.2 类在什么情况下会进行初始化2.6 使用2.7 卸载3 类加载器3.1 什么是类加载器3.2 类的唯一性3.3 类加载的方式3.4 JVM有哪些类加载器3.5 类加载器间的关系3.6 双亲委派模型3.6.1 双亲委派模型的工作过程3.6.2 为什么要设计双亲委派模型3.6.3 可以打破JVM双亲委派模型吗3.6.4 如何自定义自己的类加载原创 2022-04-01 14:37:08 · 1298 阅读 · 0 评论 -
深入理解JVM(二)运行时数据区域
文章目录1 什么是运行时数据区域2 运行时数据区域2.1 程序计数器(Program Counter Register)2.2 虚拟机栈(Java Virtual Machine Stack)2.3 本地方法栈(Native Method Stacks)2.4 Java堆(Java Heap)2.5 方法区(Method Area)1 什么是运行时数据区域JVM在执行Java程序的过程中会把它所管理的内存划分为若干个不同的数据区域,JVM所管理的内存包括以下几个运行时数据区域:2 运行时数据区域2原创 2022-03-31 20:59:51 · 1232 阅读 · 0 评论 -
深入理解JVM(一)字节码详解
文章目录1 什么是字节码文件2 class文件结构2.1 魔数(magic)2.2 次版本号(minor_version)和主版本号(major_version)2.3 常量池2.3.1 常量池容量计数器(constant_pool_count)2.3.2 常量表集合constant_pool[constant_pool_count-1]2.4 访问标志(access_flags)2.5 类索引(this_class)和父类索引(super_class)2.6 接口索引集合2.6.1 接口计数器(inter原创 2022-03-26 18:19:35 · 1499 阅读 · 0 评论 -
如何安全的存储用户密码
文章目录1、明文存储(极不推荐)2、使用MD5或其它算法哈希后存储(较不推荐)3、加盐后哈希存储(较推荐)4、使用BCrypt算法加密后存储(非常推荐)5、Spring Boot中使用jbcrypt对明文进行加密1、明文存储(极不推荐)这种设计思路非常简单,但是缺陷也非常明显,数据库一旦泄露,那么所有用户名和密码都会泄露,后果非常严重。2、使用MD5或其它算法哈希后存储(较不推荐)MD5算法的原理可简要的叙述为:MD5码以512位分组来处理输入的信息,且每一分组又被划分为16个32位子分组,经原创 2022-03-20 23:08:19 · 7206 阅读 · 0 评论 -
接口和抽象类的区别
1.抽象类的子类使用 extends 来继承;接口使用 implements 来实现接口。2.抽象类可以有构造函数;接口不能有。3.抽象类可以有 main 方法,并且我们能运行它;接口不能有 main 方法。4.类可以实现很多个接口;但是只能继承一个抽象类。5.接口中的方法默认使用 public 修饰;抽象类中的方法可以是任意访问修饰符。6.抽象类可以包含具体方法,接口的所有方法都是抽象的。7.抽象类可以声明和使用字段;接口不能,但接口可以创静态的final常量。...原创 2022-03-10 20:04:33 · 252 阅读 · 0 评论 -
Spring AOP实现记录操作日志
1 添加maven依赖<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-aop</artifactId></dependency>2 自定义操作日志注解@Target(ElementType.METHOD)@Retention(RetentionPolicy.RUNTIME)原创 2022-02-16 01:42:06 · 698 阅读 · 0 评论 -
Spring AOP中@Before,@After,@Around, @AfterReturning执行顺序
测试结果如下原创 2022-02-12 15:22:28 · 2398 阅读 · 0 评论 -
Java自定义异常类
自定义异常类一般包含两个构造方法:一个是无参的默认构造方法,另一个构造方法以字符串的形式接收一个定制的异常消息,并将该消息传递给超类的构造方法。1、编写public class MyException extends Exception { public MyException() { super(); } public MyException(String message) { super(message); }}2、测试i.原创 2022-01-27 20:53:57 · 624 阅读 · 0 评论 -
final、finally、finalize 的区别
final如果⼀个类被声明为final,意味着它不能再派⽣出新的⼦类,即不能被继承,因此它和abstract 是反义词。将变量声明为final,可以保证它们在使用中不被改变,被声明 为final 的变量必须在声明时给定初值,⽽在以后的引用中只能读取不可 修改。被声明为final 的⽅法也同样只能使用,不能在⼦类中被重写。finally通常放在try…catch…的后面构造总是执⾏代码块,这就意味着程序⽆论正常执⾏还是发⽣异常,这里的代码只要JVM 不关闭都能执⾏,可以将释放外.原创 2022-01-27 17:12:27 · 347 阅读 · 0 评论 -
Java随机数生成
1、java.util.Randomimport java.util.Random;public class Test { public static void main(String[] args) { //使用种子为10的Random对象生成[0,10)内随机整数 Random random1 = new Random(10); System.out.println(random1.nextInt(10)); //使用种子缺原创 2022-01-26 17:33:27 · 511 阅读 · 0 评论 -
String str=““与new String()的区别
一、基础概念1.1 常量池用来存放一些常量,该常量是在编译期被确定,并被保存在已编译的.class文件中,其中包括了类,方法,接口等包含的数值常量,字符常量和字符串常量。1.2 字符串常量池在常量池中,有个专门用来存储字符串常量的,称之为字符串常量池。当我们需要使用字符串时,首先会在字符串常量池中查找是否存在该字符串,若存在则直接进行使用;若不存在,则会新建一个对应的字符串,并保存在该字符串常量池中。1.3 在编译期间创建的常量和运行期间创建的常量保存的地址对象的引用都是存原创 2022-01-26 16:23:36 · 1560 阅读 · 0 评论 -
链表实现栈
//链表实现栈public class Stack { LinkNode head = null; public void insert(int value) { LinkNode newNode = new LinkNode(value); if (head == null) { head = newNode; return; } LinkNode indexNode = h原创 2022-01-26 15:31:32 · 451 阅读 · 0 评论 -
链表实现队列
//链表实现队列public class Queue { LinkNode head = null; public void insert(int value) { LinkNode newNode = new LinkNode(value); if (head == null) { head = newNode; return; } LinkNode indexNode =原创 2022-01-26 15:29:51 · 328 阅读 · 0 评论 -
String、StringBuilder与StringBuffer的区别
1、是否可变String是不可变的,每次对String的操作都会生成新的String对象StringBuilder与StringBuffer是可变的,能够被多次的修改,并且不产生新的未使用对象2、是否线程安全String是线程安全的,原因是String内部存储字符串的char数组以及和char数组相关的信息都是final的,这就保证了String对象生成的那一刻他在内存里就是不可变的。StringBuffer几乎所有的方法都使用synchronized实现了同步,线程比较原创 2022-01-26 15:13:44 · 75 阅读 · 0 评论 -
String的常用方法
int length():返回字符串的长度char charAt(int index):返回指定索引处的字符boolean isEmpty():判断字符串是否为空String toLowerCase():将字符串中的所有字符转换为小写String toUpperCase():将字符串中的所有字符转换为大写String trim():返回字符串的副本,去掉前导空白和尾部空白,中间的空白不会被去掉boolean equals(Object obj):比较字符串的内容是否相同boolean equa原创 2022-01-26 15:02:51 · 197 阅读 · 0 评论 -
IDEA中使用jdbc连接数据库
1.下载连接mysql所需要的jar包,下载之后解压传送门2.将jar包添加到该项目的库中3.编写代码import com.mysql.jdbc.Connection;import com.mysql.jdbc.Statement;import java.sql.DriverManager;import java.sql.ResultSet;public class JDBC { public static void main(String[] args) {原创 2022-01-18 11:18:03 · 7916 阅读 · 8 评论 -
Java成员变量与局部变量的区别
1. 定义的位置成员变量:在类中方法外面局部变量:在方法中或者方法的参数列表中2. 在内存中的位置成员变量:在堆内存中局部变量:在栈内存中3. 生命周期成员变量:随着对象的创建而存在,随着对象的消失而消失局部变量:随着方法的调用而存在,随着方法的调用完毕而消失4. 初始值局部变量:没有默认初始值,使用之前需要赋值成员变量:有默认初始值public class Demo { byte Byte; short Short; int Int; long Lo原创 2022-01-16 18:27:52 · 106 阅读 · 0 评论 -
Java异常体系
Throwable:有两个重要的子类:Exception(异常)和Error(错误),两者都包含了大量的异常处理类。1. Error(错误):是程序无法处理的错误,表示运行应用程序中较严重问题。大多数错误与代码编写者执行的操作无关,而表示代码运行时jvm(Java虚拟机)出现的问题。比如StackOverflowError2. Exception(异常):是程序本身可以处理的异常。比如ArraylndexQutQfBoundException异常又分为两类:运行时异常、非运行时异常①运行时异常:.原创 2022-01-15 15:35:52 · 123 阅读 · 0 评论 -
Java中的128陷阱
public class Test { public static void main(String[] args) { Integer a1=127; Integer a2=127; Integer b1=128; Integer b2=128; System.out.println(a1==a2); System.out.println(b1==b2); }}为什么第一个是true,原创 2022-01-15 14:39:04 · 173 阅读 · 0 评论 -
addResourceHandlers(ResourceHandlerRegistry registry)自定义静态资源映射目录
本地静态资源路径如图@Override /** * 自定义静态资源映射目录 */ public void addResourceHandlers(ResourceHandlerRegistry registry) { //url访问路径 registry.addResourceHandler("/api/file/**") //映射真实路径,最后面必须加"/",不然映射不到,System.getPrope原创 2021-12-06 01:00:02 · 1749 阅读 · 3 评论 -
Spring Boot解决跨域问题
实现WebMvcConfigurer接口中的addCorsMappings(CorsRegistry registry)方法@Configurationpublic class MvcConfig implements WebMvcConfigurer { @Override /** * 跨域处理 */ public void addCorsMappings(CorsRegistry registry) { //配置可以被跨域的资源的路径原创 2021-12-06 00:43:51 · 463 阅读 · 0 评论 -
Spring Boot腾讯云短信申请与使用
Spring Boot腾讯云短信申请与使用原创 2021-12-02 16:25:47 · 253 阅读 · 0 评论 -
Spring Boot整合redis
在pom.xml中添加依赖<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-redis</artifactId></dependency>2. 配置yml文件spring: redis: database: 0 port: 6379 .原创 2021-12-01 21:00:39 · 357 阅读 · 0 评论 -
Spring Boot使用qq邮箱实现验证码发送
1、获取授权码登录qq邮箱,点击【设置】——》》【账户】下滑至下图所示位置,点击开启,按要求发送短信验证码!!!记录图中的授权码,下面一步会用到2、配置yml文件spring: mail: # 配置 SMTP 服务器地址 host: smtp.qq.com # 发送者邮箱 username: xxxxxxxxx@qq.com # 配置密码,注意不是真正的密码,而是刚刚申请到的授权码 password: ********** #原创 2021-09-22 01:18:59 · 2827 阅读 · 2 评论 -
Spring Boot + Mybatis Plus实现树状菜单
1、实体类中添加子菜单列表或集合 @TableField(exist = false) private Set<SysMenu> childrenList = new HashSet<>();2、定义一个方法递归的获取子菜单public SysMenu getChildrenList(SysMenu sysMenu, List<SysMenu> sysMenuList) { for (SysMenu menu : sysMenuList)原创 2021-09-21 23:28:26 · 1219 阅读 · 0 评论 -
Mybatis Plus实现分页查询
1、自定义实现类MybatisPlusConfigpackage com.company.springboot.config;import com.baomidou.mybatisplus.annotation.DbType;import com.baomidou.mybatisplus.extension.plugins.MybatisPlusInterceptor;import com.baomidou.mybatisplus.extension.plugins.inner.Paginati原创 2021-09-10 02:34:34 · 662 阅读 · 0 评论 -
Spring Boot+Mybatis Plus实现基本的CRUD(增删改查)
不知道如何搭建项目请移步IDEA搭建Spring Boot项目(整合Mybatis Plus)1. 在数据库中创建一个表该表的sql语句如下CREATE TABLE `user` ( `id` bigint(20) NOT NULL AUTO_INCREMENT, `user_name` varchar(30) DEFAULT NULL COMMENT '用户名', `password` varchar(30) DEFAULT NULL COMMENT '密码', `real_na原创 2021-09-10 01:49:31 · 371 阅读 · 0 评论 -
springboot日期时间格式全局处理
springboot日期时间格式全局处理原创 2021-09-07 17:41:00 · 8301 阅读 · 0 评论 -
Java中访问修饰符public、protected、不写(default默认)、private的区别
注意:在不同包中,子类对象可以在子类内调用继承来的protected方法和变量,但是不能在不同包中其它类内调用该方法或变量原创 2021-09-04 02:00:41 · 184 阅读 · 0 评论 -
重载和重写的区别
重载:发生在同一个类中,方法名必须相同,参数类型、个数、顺序不同,与返回值类型。访问修饰符无关,发生在编译时。重写:发生在子类中,方法名、参数列表必须相同,返回值范围小于等于父类,抛出的异常范围小于等于父类,访问修饰符范围大于等于父类;如果父类方法访问修饰符为private则子类就不能重写该方法。重载示例package com.demo;public class Person { public void sleep(){ System.out.println(".原创 2021-09-03 03:16:06 · 157 阅读 · 0 评论 -
Java中的反射
1、反射机制在程序运行状态中,对于任意一个类或对象,都能够获取到这个类的所有属性和方法**(包括私有属性和方法**),这种动态获取信息以及动态调用对象方法的功能就称为反射机制。简单来讲,通过反射,类对我们是完全透明的,想要获取任何东西都可以。...原创 2021-09-02 07:09:58 · 121 阅读 · 0 评论