Java
文章平均质量分 79
Java相关学习
@追风少年
"code".equals("life") ? "false" : "success"
展开
-
基于AOP、Redis分布式锁实现重复提交拦截
重复提交是一个很令人头疼的问题,就算是用户没有恶意,当网络不稳定的时候,用户发表一篇博文或者在注册的时候,数据提交到后台,已入库了,但是前台收不到成功的消息,导致用户重复提交导致库中存在两份甚至多份相同的数据,这不是我们希望看到的,所以有了重复提交拦截。一、导入依赖,分布式锁的实现导入jedis依赖:(用于实现分布式锁的依赖)<dependency> <groupId>redis.clients</groupId> <artifactI.原创 2022-03-19 14:58:30 · 930 阅读 · 0 评论 -
本地缓存Guava Cache实践
本地 Cache 的老大哥Guava Cache 通过简单好用的 Client 可以快速构造出符合需求的 Cache 对象,不需要过多复杂的配置,大多数情况就像构造一个 POJO 一样的简单。一、Guava Cache实现这里我们是通过CacheLoader的方式来对Guava Cache进行实现,但是它还可以通过Callable的方式实现。/** * @author zheyue * @date 2021/11/3 **/@Slf4j@Servicepublic class Cach.原创 2021-11-16 11:47:38 · 434 阅读 · 0 评论 -
线程池踩坑记录
线程池原理简单参考:对Java中线程池的理解线程池的创建使用和注意事项1. 手动创建// 线程池创建private ExecutorService threadPoolExecutor = new ThreadPoolExecutor( 10, 20, 1, TimeUnit.MINUTES, new LinkedBlockingDeque<>(10000), new ThreadFactoryBuilder().setNameForma原创 2021-11-12 11:15:06 · 491 阅读 · 0 评论 -
设计模式之策略模式
一、背景:为什么要用到策略模式?阿里开发规约-编程规约-控制语句-第六条 :超过 3 层的 if-else 的逻辑判断代码可以使用卫语句、策略模式、状态模式等来实现。普通代码示例:if (a == 1) { ...} else if ( a == 2 ) { ...} else if (a == 3) { ...} else { ...}这种代码虽然写起来简单,但是很明显违反了面向对象的 2 个基本原则:单一职责原则(一个类应该只有一个发生变化的原因):因为之后修改任何一原创 2021-09-26 11:38:54 · 164 阅读 · 0 评论 -
Java流式编程
最近刚接触项目,发现项目中大量使用流式编程,这里我分享一下流式的几个基本使用方法,自己以前用的并不多,在这里总结一下stream() 流式编程 只是一种风格,当然使用流式实现的功能 for 循环也可以实现,但是它的使用对于我们编写的的代码看起来非常简洁,不像循环那样臃肿。我在这里直接代码演示了:第一种:转为List或者Set String str = "123.456.675.4433.2223"; List<Integer> collect = Arrays.stream.原创 2021-05-15 15:59:30 · 371 阅读 · 0 评论 -
Spring整体架构知识构建
Spring一、Spring两大核心1、IOC2、AOP二、Spring bean1、Bean的作用域2、线程安全问题3、Bean的生命周期4、循环依赖问题⭐三、Spring 中的事务问题1、四种事务特征(ACID)2、五种隔离级别(比数据库多了一个默认级别)3、七种传播行为一、Spring两大核心1、IOCIOC其实它是一种思想,“控制反转”(官方解释),其实这种思想就是 将原本在我们自己写的程序里面去创建对象的权利,交给Spring框架来管理。IOC容器是Spring 用来实现Ioc的载体,I原创 2021-03-14 18:02:51 · 403 阅读 · 1 评论 -
深入理解CAS与AQS
CAS与AQS一、CAS1、什么是CAS2、CAS进行原子操作的三大问题3、循环CAS二、AQS1、核心思想2、具体实现3、AQS 对资源的两种共享方式4、AQS 的应用一、CAS1、什么是CAS首先,CAS是一种算法,不是锁CAS,其实是个简称,全称是 Compare And Swap,对比之后交换数据CAS的实现原理首先呢,我们通过它的全称就可以看出来,CAS先是对比数据,然后再执行具体的原子操作。几个参数介绍:this:Unsafe 对象本身,需要通过这个类来获取 valu原创 2021-03-03 21:04:20 · 636 阅读 · 2 评论 -
Java线程池
Java中的线程池是运用场景最多的并发框架,几乎所有需要异步或并发执行任务的程序 都可以使用线程池。一、使用线程池的好处在开发过程中,合理地使用线程池能够带来3个好处。降低资源消耗通过重复利用已创建的线程降低线程创建和销毁造成的消耗。提高响应速度当任务到达时,任务可以不需要等到线程创建就能立即执行。提高线程的可管理性线程是稀缺资源,如果无限制地创建,不仅会消耗系统资源, 还会降低系统的稳定性,使用线程池可以进行统一分配、调优和监控。二、线程池的实现原理线程池处理.原创 2021-03-02 17:54:14 · 280 阅读 · 0 评论 -
ConcurrentHashMap的实现原理
一、为什么要是用ConcurrentHashMap在并发编程中使用HashMap可能导致程序死循环(这是在JDK1.7中,在JDK1.8中导致的线程不安全主要是put方法可能会导致值被覆盖)。而使用线程安全的HashTable效率又非常低下(全表数据被synchronized修饰),基于以上两个原因,便有了ConcurrentHashMap的登场机会。1、HashMap线程不安全HashMap原理请参考:HashMap原理JDK1.7线程不安全主要体现在发生扩容的时候,重新哈希(rehas原创 2021-03-02 00:53:34 · 432 阅读 · 7 评论 -
深入理解 “死锁“
死锁理解一、什么是死锁二、长生死锁的条件三、如何避免死锁1、第一种方式2、第二种方式(拓展)一、什么是死锁死锁为两个或两个以上的线程在执行过程中,由于竞争资源而造成的一种阻塞的现象,若无外力作用,它们都将无法推进下去。当线程互相持有对方所需要的资源时,会互相等待对方释放资源,如果线程都不主动释放所占有的资源,将产生死锁。举个例子(个人理解):就是比如说两个线程:线程A、线程B,各自持有自己的资源(A持有资源a,B持有资源b),当A需要资源b,B需要资源a。但是此时A抓着a资源不放,B抓这b资原创 2021-02-28 21:58:36 · 274 阅读 · 1 评论 -
Java设计模式之单例模式
单例模式(Singleton Pattern)是 Java 中最简单的设计模式之一。这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式。这种模式涉及到一个单一的类,该类负责创建自己的对象,同时确保只有单个对象被创建。这个类提供了一种访问其唯一的对象的方式,可以直接访问,不需要实例化该类的对象。一、单例模式介绍从上面的定义中我们可以得知单例模式具有以下几点特征:单例类只能有一个实例单例类必须自己创建自己的唯一实例(不需要外部实例化该类对象)单例类必须给所有其他对象提供这一实例.原创 2021-02-27 22:53:58 · 138 阅读 · 0 评论 -
深入理解Java虚拟机(二)
第二篇,主要来说一下Java虚拟机的垃圾收集算法。一、判断对象是否 “已死”在堆里面存放着Java世界中几乎所有的对象实例,垃圾收集器在对堆进行回收前,第一件事情就是要确定这些对象之中哪些还“存活”着,哪些已经“死去”(“死去”即不可能再被任何途径使用的对象)。判断对象是否 “已死” 有两种算法:引用计数算法在对象中添加一个引用计数器,每当有一个地方 引用它时,计数器值就加一;当引用失效时,计数器值就减一;任何时刻计数器为零的对象就是不可 能再被使用的。引用计数算法有一个缺点就.原创 2021-02-22 22:33:32 · 200 阅读 · 4 评论 -
深入理解Java虚拟机(一)
在此之前我们先来看一下JDK和JRE。我们可以把Java程序设计语言、Java虚拟机、Java类库这三部分统称为JDK(Java Development Kit),JDK是用于支持Java程序开发的最小环境。可以把Java类库API中的Java SE API子集和Java虚拟机这两部分统称为 JRE(Java Runtime Environment),JRE是支持Java程序运行的标准环境。Java内存区域一、运行时数据区域Java虚拟机在执行Java程序的过程中会把它所管理的内存划分.原创 2021-02-22 19:18:55 · 1284 阅读 · 11 评论 -
Java核心技术卷知识点总结
基本数据类型byte(1字节,8位)short(2字节,16位)int(4 字节 32位)long(8字节 , 64位)float(4字节 32位)double(8字节 , 64位)char(2字节 16位)boolean(4字节 32位)面向对象的特点面向对象的三大特点:继承、封装、多态面向对象就是将一个模块或者是一个完整需求按照某些特点或者功能进行拆分,将具有共有特性的封装到一起,可以独立进行操作的这种低耦合、易扩展维护的思想多态,简述多态多态简单来..原创 2021-02-21 21:10:07 · 223 阅读 · 0 评论 -
String、StringBuffer、StringBuilder的区别
String:我们对String都不陌生,相信大家也都知道String是不可变的,那么他为什么是不可变的呢?我们通过研究String的源码就不难发现String类已经被final修饰,并且它的 value[] 成员也被final修饰了,我们知道,String存取字符串是将他们一个一个的存到了字符数组里面,所以这也是最重要的String为什么是不可被修改的原因。拓展:final有哪些作用呢?final修饰的类不可被继承;final修饰的方法不可被重写;final修饰的常量不可被修改;在并发的时候,fina.原创 2021-02-19 20:36:09 · 121 阅读 · 0 评论 -
RBAC权限系统分析、设计与实现
目前,使用最普遍的权限管理模型正是RBAC(Role-Based Access Control)模型,这些文章也主要是介绍基于RBAC的权限管理系统,这篇文章从RBAC是什么、如何设计RBAC两部分来介绍。我所负责的项目涉及到角色权限的问题全部是通过RBAC来实现的,以前只是出于熟练使用的层面,现在学习一下RBAC更深层次的理论知识。一、RBAC是什么1、RBAC模型概述RBAC认为权限授权的过程可以抽象地概括为:Who是否可以对What进行How的访问操作,并对这个逻辑表达式进行判断是否为.原创 2021-02-14 20:09:06 · 982 阅读 · 0 评论 -
SpringBoot中应用 微信授权登录
总结项目的过程中,这是一个自己探索的点,项目用到了微信授权登录的功能,因为之前没有做过,所以自己也是在网上搜集了很多资料,现在分享给大家。其实类似于微信授权登录的其他三方登陆,原理是一样的。现在我们就来看一下这是怎么实现的,其实很简单。首先我们在访问登录页面的时候,就去调用微信官方给我们提供的接口,我们需要提供几个参数,分别是 openid、appid、redirect_uri(重定向链接)下面看返回登录界面的controller代码一开始这一部分是我用到的一些跟业务相关的代码,大家可.原创 2021-02-04 10:04:06 · 792 阅读 · 5 评论 -
SpringBoot中应用@Transactional注解对事务控制的管理(不要滥用)
我们在开发过程中事务是无法回避的一个问题,什么是事务呢?简单来讲就是 “要么都成功,要么都失败”;典型案例就是我们在做支付的时候,如果没有失误控制,那么就有可能发生故障,比如说我在支付的过程中,突然出现了断网,我这边的钱扣出去了,但是对方却没有收到钱,这是极其严重的。抛开支付,我们在开发的过程中,涉及到两张及以上表的修改操作时,也是需要考虑事务的。那么我们怎么去控制呢?使用 @Transactional 注解去解决@Transactional 是声明式事务管理 编程中使用的注解@Trans.原创 2021-01-29 12:47:52 · 666 阅读 · 1 评论 -
SpringBoot接入支付宝支付功能(沙箱操作)
官网给出的例子,跑到自己本地如下图:一、前期准备进入开放平台,沙箱环境,登录,一开始需要填写基本信息下载支付宝开放平台开发助手,生成密钥需要用到配置参数保留appId 和 支付宝网关,后面我们会用到生成密钥(打开我们下载的开发助手), 保留公钥和私钥将公钥配置到我们的沙箱环境中,保留最后的支付宝公钥,后面我们会用到二、项目应用后台代码编写 AlipayConfig.java 类,里面设计的参数,我们前一步都获取到了,填写到对应位置就可以了.原创 2021-01-28 18:35:46 · 606 阅读 · 0 评论 -
SpringBoot 创建 定时任务
项目中创建定时任务是一种常见并且常用的技术,近几天我在整理项目的过程中,整理了springboot中通过@Scheduled 来创建定时任务,希望可以帮到大家,同时我也做一个记录。首先我们需要两个注解来书写我们的定时任务的类,我这里的场景是清除数据库中已经废弃了的 ‘房间’ 的信息,这两个注解分别是:@Component :将这个类放到spring ioc 容器中来帮助我们管理这个类@Scheduled :开启定时任务,应用于方法上这个类的代码如下/** * @ClassName .原创 2021-01-20 14:11:15 · 160 阅读 · 1 评论 -
Spring Boot 应用切面Spring AOP以及AOP机制的简单理解
切面应用场景:日志记录,加密解密,token令牌验证等等我在这里应用到的是 token令牌验证 ,来验证当前我这个app端用户在调用后台接口的时候是否是已登录状态,没有登陆(没有token或者token失效)的用户是不允许访问对应接口的上述场景是需要切面来验证的,否则的话每一个需要验证的接口都需要调这个公共方法时会产生代码混乱以及代码分散的情况,同时基于AOP不会破坏原来程序逻辑,因此它可以很好的对业务逻辑的各个部分进行隔离,从而使得业务逻辑各部分之间的耦合度降低,提高程序的可重用性,同时提高.原创 2021-01-18 13:34:21 · 230 阅读 · 0 评论 -
算法题解:蛇形矩阵
题目描述输入两个整数n和m,输出一个n行m列的矩阵,将数字 1 到 n*m 按照回字蛇形填充至矩阵中。输入格式输入共一行,包含两个整数n和m。输出格式输出满足要求的矩阵。矩阵占n行,每行包含m个空格隔开的整数。数据范围1≤n,m≤100输入样例:3 3输出样例:1 2 38 9 47 6 5思路:图形如下一开始是从 (0 ,0)点出发,按照右(偏移量为(0 ,1):x不变,y加一)→ 下(偏移量为(1 ,0):x加一,y不变)→ 左(偏移原创 2021-01-17 16:25:13 · 850 阅读 · 3 评论 -
EasyExcel 的读写使用
最近在总结项目项目中用到的知识点,EasyExcel 是一个技术点:EasyExcel是一个基于Java的简单、省内存的读写Excel的开源项目。在尽可能节约内存的情况下支持读写百M的Excel。我之前用过apache的poi技术来读取本地的excel文件,但是他有一个显著的缺点就是 在处理的数据非常多的时候,非常消耗内存,并且很容易出现异常的情况,所以在选择技术工具的时候选择了阿里的easyExcel。因为我负责的项目采用的是spring boot框架,所以我这里主要讲解一下如何在spring .原创 2021-01-16 12:10:02 · 438 阅读 · 0 评论 -
SpringBoot + mybatis-plus整合webscoket
webscoket原理:请参考WebSocket的实现原理 webscoket一开始我只是简单会用,但是我觉得掌握webscoket原理是很有必要,他会加深我们对计网的理解。一、永恒第一步:导入pom依赖<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-websocket</artifactId>&.原创 2020-09-24 17:12:25 · 822 阅读 · 1 评论 -
spring boot 整合 阿里云oss上传
Spring Boot 整合 阿里云OSS上传OSS申请和配置1. 注册登录2.开通以及配置springboot整合使用1. 进入我们springboot的项目中,导入oss相关依赖2. 再配置文件中添加相关信息3. 书写获取配置信息的java文件,建立properties包(导入依赖,否则无法识别这个包)4. 整合oss,书写相关java文件1. 文件常量java文件 FileConstants.java2. 文件操作工具类 OssFileUtils.java3. 阿里云 对象云存储工具类 OssUti原创 2020-08-09 11:39:27 · 3776 阅读 · 0 评论 -
spring boot 缓存应用实例讲解
最近在做springboot的一个项目,用到缓存做登录验证(这块也可用Redis),学到了一些新知识,想和大家分享一下。一、创建springboot项目个人认为创建spring boot项目最快的地方就是访问spring.io官网,从官网创建,里面的一些基础配置都给我们配置好了,直接添加即可。首先我们通过QUICKSTART进入点击start.spring.io,进入springboot的搭建界面,进行配置选择成功以后直接下载,下载直接解压,导入maven项目(在这里我用的IDEA工具).原创 2020-07-29 10:57:05 · 3988 阅读 · 0 评论 -
阿里巴巴Java开发手册(华山版)
这是第二次研读阿里规约,这本书对我们的编码规范影响非常深远,希望大家可以参考哦。前 言《Java 开发手册》是阿里巴巴集团技术团队的集体智慧结晶和经验总结, 经历了多次大规模一线实战的检验及不断完善, 公开到业界后,众多社区开发者踊跃参与,共同打磨完善, 系统化地整理成册。现代软件行业的高速发展对开发者的综合素质要求越来越高, 因为不仅是编程知识点,其它维度的知识点也会影响到软件的最终交付质量。比如: 数据库的表结构和索引设计缺陷可能带来软件上的架构缺陷或性能风险; 工程结构混乱导致后续维护艰难;没.原创 2020-07-05 13:31:35 · 7666 阅读 · 0 评论 -
基于ssm和Thymeleaf的在线考试系统----独立开发
近几天自己搞了个在线考试系统,功能已经实现,现在分享给大家,希望对大家有帮助。github链接: https://github.com/TianEn-Zhao/qcby在线演示在线考试系统技术栈选型功能介绍具体页面演示技术栈选型JDK版本:1.8Maven版本:3.5.3本次项目使用java框架:spring + springmvc + mybatis数据库使用版本为 mysql 5.7前端使用 layui框架开发工具为 IntelliJ IDEA 2020.1 、NavicatL.原创 2020-06-08 13:29:45 · 6633 阅读 · 5 评论 -
Mybatis自带分页插件的使用
一、在ssm项目中引入依赖,数据库版本是mysql 5.7<!-- mabatis分页插件 --> <!-- https://mvnrepository.com/artifact/com.github.pagehelper/pagehelper --> <dependency> <groupId>com.github.pagehelper</groupId> <artifactId>pageh原创 2020-06-05 11:27:30 · 6993 阅读 · 0 评论 -
详细介绍使用java实现微信支付功能
我已经将项目放在了GitHub上,可供参考,我也是参考学长留下来的,受益匪浅。GitHub链接: https://github.com/TianEn-Zhao/wxpay这个项目我是整合在ssm框架中来实现的。数据库使用的是mysql 5.7,数据库文件已放在了项目中,可运行到自己数据库本地。我们看具体的流程是怎样的:业务流程时序图相关sdk我们可以在官方文档中下载一、项目目录文件浏览二、运行整个项目查看我们可以看到整个支付功能已经实现了。三、分析运行的流程当然这里面原创 2020-06-04 17:31:46 · 6804 阅读 · 0 评论 -
Java:数组30多行代码实现堆排序
在堆的数据结构中,堆中的最大值总是位于根节点(在优先队列中使用堆的话堆中的最小值位于根节点)。堆中定义以下几种操作:1、最大堆调整(Max Heapify):将堆的末端子节点作调整,使得子节点永远小于父节点2、创建最大堆(Build Max Heap):将堆中的所有数据重新排序3、堆排序(HeapSort):移除位在第一个数据的根节点,并做最大堆调整的递归运算...原创 2020-05-22 11:58:08 · 5758 阅读 · 0 评论 -
Mybatis原理解析
mabatis启动流程:伴随tomcat,在tomcat启动时候,cat扫描web.xml文件,找到mabatis配置文件路径,mabatis配置文件包括但不限于xml文件。对于web.xml来说,只能引入其他xml文件。如果mabatis配置文件(或其他配置文件)是其他类型文件,非xml文件是由xml文件记录它的路径。举例:假设有一个文件a.properties,那么引入路径是:在web.xml中,引入自定义的b.xml,在b.xml中记录了a.properties的路径。a.proper.原创 2020-05-20 15:33:19 · 5767 阅读 · 0 评论 -
java构建哈夫曼树,实现哈夫曼编码和译码
哈夫曼树是一种带权路径长度最短的二叉树,也称为最优二叉树。 我们通过一个具体的实例来讲解哈夫曼树的构造以及编码和反编码。比如说我们要对一字符串进行01编码,该如何做?我们要清楚为什么要使用哈夫曼编码?答案很简单,哈夫曼编码占位可以做到最少。一、给出指定字符串二、统计各个字母出现的次数三、以每个字母为一个叶子节点,出现次数作为权重,构建哈夫曼树注:每次挑选两个权重最小的结点执行父节点以此类推,得到最终的哈夫曼树:我们可以得到根节点的权值为18。四、进行编码从根节点开始,路径左为.原创 2020-05-14 20:16:41 · 8155 阅读 · 1 评论 -
树的广度优先插入以及广度优先遍历
树的广度优先插入以及广度优先遍历(二叉树)重点:树的广度操作 二叉树的广度优先插入借助队列来实现一、对二叉树的认识:二叉树是每个结点最多有两个子树的树结构。二、本文主要是对树的广度优先插入进行操作。三、原理解析:1、首先建立一个队列(原理请参考 “循环队列的最优实现” 一文)源码如下:public class CilQueDemo<T> { private T...原创 2020-01-09 17:45:59 · 174 阅读 · 0 评论 -
解决Mybatis反向生成的mapper.xml中对应数据库表名带有引号的问题
相信有好多情况Mybatis反向生成的xml中表名带有双引号,这种情况在调用的时候会出现错误。1、方案一很简单,利用idea的查找替换,讲带有双引号的替换成不带双引号的,但是一个文件还好,要是很多岂不费时。因此我们有了方案二。2 、方案二这是很细的一个点,有的情况生成的带有双引号,有的配置文件生成的就不带有,这是我的亲身经历。下面给大家附上生成xml文件无误的代码导入依赖:<!-- Mybatis反向生成 --> <dependency> .原创 2020-05-13 17:44:37 · 8226 阅读 · 1 评论 -
栈的最优实现(数组实现)
一、对栈的简单理解1、栈是一种运算受限(只允许在表尾进行插入和删除)的线性表(先入后出);2、栈是对程序指令进行顺序控制的;3、(与线程的关系)每个线程都有一个线程栈,线程之内的所有方法(也称为线程栈方法)都对Threadlocal共享,出了线程就不再共享。4、从栈中每次取出的数据都是最新数据,可以边放入边取出。二、用数组实现栈的进出操作为什么用数组实现而不用链表呢?很简单,最大原...原创 2019-12-13 12:44:30 · 226 阅读 · 0 评论 -
java反射总结(框架灵魂)
反射库(reflection library) 提供了一个非常丰富且精心设计的工具集, 以便编写能够动态操纵 Java 代码的程序。这项功能被大量地应用于 JavaBeans 中,它是 Java 组件的体系结构。 - - - - - - - - - - - - - - - - - - -源于Java核心技术(卷Ⅰ)的引用一、什么是反射能够分析类能力的程序称为反射(reflective)。二、获得class类对象的三种方式在程序运行期间,Java 运行时系统始终为所有的对象维护一个被称为运.原创 2020-05-09 22:15:24 · 5814 阅读 · 0 评论 -
对Java中 “方法调用“ 的深入理解
对动态绑定的理解简单来讲其实就是对方法调用的理解。可能好多学习编程的人想:方法的调用我还不会吗?希望这篇博客能够给大家提供帮助,博客来源于Java核心技术(卷Ⅰ)弄清楚如何在对象上应用方法调用非常重要。下面假设要调用 x.f(args,) 隐式参数 x 声明为类 C 的一个对象。下面是调用过程的详细描述:编译器査看对象的声明类型和方法名。假设调用 x.f(param,) 且隐式参数 x 声明为 C类的对象。需要注意的是: 有可能存在多个名字为 f, 但参数类型不一样的方法。例如,可能存在方法.原创 2020-05-08 21:56:54 · 5781 阅读 · 0 评论 -
阿里一道题理清了Java的初始化顺序
看题:package com.test;public class Test{ private static int k = 1; private static Testt1 = new Test("t1"); private static Testt2 = new Test("t2"); private static int i = print("i");...原创 2020-05-08 12:02:59 · 5693 阅读 · 0 评论 -
深入理解java值传递
我们在这里通过具体的代码示例来讲解java中的值传递1、首先我声明一个Student类,用于测试package com.test;/** * @author zte * @date 2020-05-07 18:01:06 */public class Student { /** * 为了方便测试,我这里声明为public */ public...原创 2020-05-07 19:38:01 · 5640 阅读 · 0 评论