自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

1 Byte 的博客

也曾想仗剑走天涯,看一看世界的繁华

  • 博客(77)
  • 收藏
  • 关注

原创 利用枚举实现策略模式

演示的demo 是以拉取短视频平台up主数据为背景,调用三方接口可能返回诸如:被限流、拉取数据失败、拉取数据次数超过每日上限等状态,而对于每种状态如果用 if else进行分支逻辑处理,一旦分支逻辑过多,代码会显得冗余且可读性较差,所以采用策略者模式进行代码优化。

2023-04-20 16:42:02 1334 1

原创 JVM垃圾收集算法与垃圾收集器(Serial、ParNew、CMS) —JVM系列(四)

目前大多数垃圾收集器都是采用的分代收集算法,该算法其实算是一种思想:根据对象存活周期的不同而将内存分为年轻代和老年代,这样就可以根据各个年代的特点选择合适的垃圾收集算法。比如在年轻代中,每次收集都会有绝大多数对象死去(没有被GC root所引用),可以选择复制算法,只需要付出少量对象的复制成本就可以完成每次垃圾收集;而老年代中的对象存活几率比较高,并且没有额外的空间对其进行分配担保,所以选择标记清除算法或者标记整理算法进行垃圾回收;需要注意,通常来讲标记清除算法或标记整理算法会比复制算法慢上许多!

2023-04-09 18:24:40 1752 3

原创 与ChatGPT浅聊Pulsar

最后,Pulsar还提供了多种保证交付的机制,如At-least-once和Exactly-once,以确保每条消息都被正确地传递和处理。Pulsar的底层原理是基于分布式日志存储的架构,它采用了类似于Kafka的思想,将消息存储在一个可水平扩展的、可持久化的分布式存储引擎中,同时支持多租户。在发布/订阅模式下,消息发布者将消息发布到一个主题中,订阅者可以订阅该主题,并接收到所有发布到该主题的消息。在队列模式下,消息发送者发送消息到一个队列中,每个消费者从队列中获取消息,消费者之间实现负载均衡。

2023-04-03 09:40:15 6333 1

原创 Spring 6 IOC容器加载过程与核心方法refresh源码浅析

本篇只对主线核心逻辑进行梳理分析,本篇以AnnotationConfigApplicationContext容器为例进行切入分析【Spring版本为: v6.0.2】

2023-04-01 19:46:53 3168 4

原创 Spring 6 源码编译教程分享~

Spring Boot 3 RELEASE版本于 2022年11月24日 正式发布,此次Spring Boot里程碑的升级也要求了最低JDK 17 和 Spring Framework 6 ,其核心框架的 Spring 也在 2022年11月16日 迎来了从 5.3.x 到 6.0.x 重大版本升级,借着这个机会,写一篇关于 Spring 6 源码编译的教程分享。

2023-04-01 02:04:14 3375 3

原创 centos 7下安装Docker(附根据操作系统日志排查问题思路)

1、Docker 要求 CentOS 系统的内核版本高于 3.10,通过uname -r命令查看你当前的内核版本 2、使用root权限登录 Centos。确保 yum 包更新到最新。6、可以查看所有仓库中所有docker版本,并选择特定版本安装

2023-03-28 17:24:22 3069

原创 windows的cmd界面下使用jps命令提示:‘jps‘ 不是内部或外部命令,也不是可运行的程序或批处理文件

使用jps提示:‘jps’ 不是内部或外部命令,也不是可运行的程序或批处理文件,但是使用java -version却正常。

2023-03-11 21:58:05 3246

原创 解决PageHelper循环依赖:com.github.pagehelper.autoconfigure.PageHelperAutoConfiguration

PageHelper循环依赖解决com.github.pagehelper.autoconfigure.PageHelperAutoConfiguration

2022-07-15 15:42:40 5050 2

原创 Mac使用brew优雅切换golang版本,丝滑

使用brew切换golang版本先升级brewbrew update解绑当前版本绑定brew unlink go🔍搜索可安装的go版本列表> brew search [email protected] [email protected] [email protected] [email protected] [email protected] [email protected]选择想切换的版本,如这里安装[email protected] install [email protected]绑定版本关系brew link [email protected]🆕刷新下配置文件source .bash_p

2022-04-21 11:56:18 5643

原创 Java获取指定年份每一个周的日期范围

需求场景:简述项目相关背景:接到项目组需求,给定年份,返回对应该年份所有周的日期范围代码:思路:一步一步来,从第1周到最后1周,最后返回list,列表的大小即是该年份的总周数public class YearWeeksUtil { public static final String START_TIME = "startTime"; public static final String END_TIME = "endTime"; /** * 获取某年某周

2022-03-30 18:54:42 2553

原创 Java对象和Map互相转换

/** * 将对象装换为map * * @param bean * @return */ public static <T> Map<String, Object> beanToMap(T bean) { Map<String, Object> map = Maps.newHashMap(); if (bean != null) { BeanMap bean.

2022-01-05 19:14:33 1495 1

原创 Redisson读写锁

在高并发场景下如果只用一把互斥锁会出现哪些问题?同一时间只能有一个请求占用,如果是大量的并发上来,性能是会急剧下降的,所有的请求都得加锁比如如果数据没有进行任何修改的话,是不需要加锁的。如果读数据的请求还没读完,这个时候来了一个写请求,这个时候是不能写数据的,不然数据就不正确了,要等到前面读锁全部释放掉以后,写请求才能执行,所以需要给这个读请求加一个标识(读锁),让写请求知道,这个时候是不能修改数据的,不然数据就不一致了。如果已经有人在写数据了,再来一个请求写数据,也是不允许的,这样也会导致数据的不

2021-10-08 15:35:46 2584 1

原创 简析jvm的调优方案

调优时机:heap 内存(老年代)持续上涨达到设置的最大内存值;Full GC 次数频繁;GC 停顿时间过长(超过1秒);应用出现OutOfMemory 等内存异常;应用中有使用本地缓存且占用大量内存空间;系统吞吐量与响应性能不高或下降。调优原则:多数的Java应用不需要在服务器上进行JVM优化;多数导致GC问题的Java应用,都不是因为我们参数设置错误,而是代码问题;在应用上线之前,先考虑将机器的JVM参数设置到最优(最适合);减少创建对象的数量;减少使用全局变量和大对象;

2021-09-28 08:52:21 1140

原创 ThreadLocal原理分析与使用场景

什么是ThreadLocal?ThreadLocal是线程本地存储,在每个线程中都创建了一个ThreadLocalMap对象,每个线程可以访问自己内部ThreadLocalMap对象内的value。ThreadLocal的本质就是一个内部的静态的map,key是当前线程的句柄,value是需要保持的值。由于是内部静态map,不提供遍历和查询的接口,每个线程只能获取自己线程的value。这样,就线程安全了,又提供了数据共享的能力。示例:public class ConnectionManager {

2021-09-27 18:08:08 1708

原创 Java代码实现循环队列

循环队列结构Java代码实现循环队列// 基于数组实现一个循环链表public class CircleArrayQueue<T> { // 定义数组用于存放数据 private T[] arr; private int head; // 记录队列头 private int tail; // 记录队列尾 private int size; // 数组大小 // 循环链表初始化 public CircleArrayQueue(

2021-09-26 21:23:02 2212

原创 CopyOnWriteArrayList适用场景与原理分析

CopyOnWriteArrayList 简介CopyOnWrite机制又称为写时复制:public class CopyOnWriteArrayList<E> implements List<E>, RandomAccess, Cloneable, java.io.Serializable {}在很多应用场景中,读操作可能会远远大于写操作。由于读操作根本不会修改原有的数据,因此如果每次读取都进行加锁操作,其实是一种资源浪费。我们应该允许多个线程同时访问 List

2021-09-26 16:20:37 2796

原创 Java代码实现栈结构

栈结构Java代码实现栈结构// 利用数组实现一个栈结构public class ArrayStack<T> { // 声明数组 private T[] arr = (T[])new Object[1]; // 栈元素初始数量 private int num = 0; public ArrayStack(int size){ this.arr = (T[])new Object[size]; } // 入栈(压

2021-09-26 15:51:33 1408

原创 Java代码实现ArrayList

ArrayList结构图Java代码实现ArrayList注意点:注意数组下标越界问题public class MyArrayList<E> { // 数组长度 private int size; // 数组已存数据的大小 private int index; // 声明数组 private E dadaArr[]; // 构造函数完成初始化 public MyArrayList(int size){ t

2021-09-26 11:22:24 1486

原创 力扣:9. 回文数

题目:给你一个整数 x ,如果 x 是一个回文整数,返回 true ;否则,返回 false 。回文数是指正序(从左向右)和倒序(从右向左)读都是一样的整数。例如,121 是回文,而 123 不是。示例 2:输入:x = -121输出:false解释:从左向右读, 为 -121 。 从右向左读, 为 121- 。因此它不是一个回文数。解法:这题和第7题整数反转类似,比较简单,不多赘述class Solution { public boolean isPalindrome(in

2021-09-25 15:57:16 367

原创 力扣:7. 整数反转

题目:给你一个 32 位的有符号整数 x ,返回将 x 中的数字部分反转后的结果。如果反转后整数超过 32 位的有符号整数的范围 [−231, 231 − 1] ,就返回 0。假设环境不允许存储 64 位整数(有符号或无符号)。示例 1:输入:x = -123输出:-321解法:class Solution { public int reverse(int x) { // 注意int类型反转后的数值可能超出int的表示范围,所以结果用long来存

2021-09-25 15:50:33 333

原创 力扣:1. 两数之和

题目:给定一个整数数组 nums 和一个整数目标值 target,请你在该数组中找出 和为目标值 target 的那 两个 整数,并返回它们的数组下标。你可以假设每种输入只会对应一个答案。但是,数组中同一个元素在答案里不能重复出现。你可以按任意顺序返回答案。示例 1:输入:nums = [2,7,11,15], target = 9输出:[0,1]解释:因为 nums[0] + nums[1] == 9 ,返回 [0, 1] 。解法一: 暴力解法双循环遍历,时间复杂度为O(n2)

2021-09-25 15:32:47 320

原创 Java代码实现双向链表

双向链表结构图Java代码实现双向链表public class DoubleLinkedList { Node head; // 头节点 Node tail; // 尾节点 DoubleLinkedList(){ head = null; tail = null; } // 从头部插入 public void insertHead(int data){ Node newNode = new

2021-09-25 10:15:19 1283

原创 力扣:2. 两数相加

描述给你两个 非空 的链表,表示两个非负的整数。它们每位数字都是按照 逆序 的方式存储的,并且每个节点只能存储 一位 数字。请你将两个数相加,并以相同形式返回一个表示和的链表。你可以假设除了数字 0 之外,这两个数都不会以 0 开头。代码/** * Definition for singly-linked list. * public class ListNode { * int val; * ListNode next; * ListNode() {} *

2021-09-23 10:29:43 308

原创 synchronized和Lock的区别

原始构成:synchronized是关键字属于JVM层面,monitorenter(底层是通过monitor对象来完成,其实wait/notify等方法也依赖于monitor对象只有在同步块或者方法中才能调用wait/notify)lock是类,是api层面的锁使用方法:synchronized不需要手动释放锁,当synchronized代码执行完以后系统会自动让线程释放对锁的占用,ReentrantLock则需要手动释放锁,不然可能会导致死锁现象。是否可中断synchronized

2021-07-25 12:18:59 962

原创 搭建springboot项目与Java爬虫抓取网页数据

这是jdk版本不一致问题导致的,所以需要做以下检查:检查你的pom.xml首先检查你的模块JDK依赖。确保它是1.8;到File —> Project Structure —> Project Settings —> Project 中调整你的JDK版本,并保持一致将路径添加到存储的位置。1.8jdk1.8.0_45.jdk应用更改现在,去Structure ->Modules将ModuleSDK更改为1.8https://blog.csdn.net/shilian

2021-03-14 20:50:51 24243 4

原创 建议使用 Bcrypt加密算法 代替 MD5/SHA1

前言为了保障用户的敏感数据安全,通常都会对其进行加密,然后将加密后的数据存入数据库中,例如用户密码,在用户进行登录的时候,将其输入的密码与数据库中存放的密文进行比较,以验证用户密码是否正确。BCrypt加密: BCrypt是一种跨平台的文件加密工具。 一种加盐的单向Hash,可以简单理解为它内部自己实现了随机加盐处理,不可逆的加密算法,同一种明文(plaintext),每次加密后的密文都不一样,而且不可反向破解生成明文,破解难度很大,BCrypt生成的密文是60位。MD5加密: 是不加盐的单向Ha

2021-03-11 15:28:57 23273 1

原创 MySQL数据类型选择

前言在MySQL中,选择正确的数据类型,对于性能至关重要。 一般应从以下两个方面考量:确定合适的大类型:数值、字符串、时间、二进制;确定具体的类型:有无符号、取值范围、变长定长等。在MySQL数据类型设置方面,尽量采用更小的数据类型,因为它们占用的存储空间更小,通常有更好的性能,花费更少的硬件资源。并且,尽量把字段定义为NOT NULL,避免使用NULL。1.字符串类型类型大小用途CHAR0-255字节定长字符串,char(n)当插入的字符串实际长度不足n时,插

2021-03-01 16:03:23 20381 5

原创 http,tcp,udp协议深度分析(硬核推荐)

文章目录前言一、网络分层原理1.现实世界中的复杂网络环境2.OSI七层协议和TCP/IP协议 第一层:物理层 第二层:数据链路层 第三层:网络层 第四层:传输层 第五层:会话层 第六层:表示层 第七层:应用层3. 一个HTTP请求的分层解析流程二、HTTP协议1.基本概念超文本传输协议(HyperText Transfer Protocol,HTTP) :什么是无状态协议?什么是有状态协议?2.HTTP报文布局请求报文格式:请求行报文格式:15种HTTP请求方法:HTTP请求头信息对照表:响应报文格式:响应

2021-02-19 15:49:54 21460 9

转载 OAuth2实现单点登录SSO

本文转载自:https://www.cnblogs.com/cjsblog/p/10548022.htmlOAuth2实现单点登录SSO1. 前言技术这东西吧,看别人写的好像很简单似的,到自己去写的时候就各种问题,“一看就会,一做就错”。网上关于实现SSO的文章一大堆,但是当你真的照着写的时候就会发现根本不是那么回事儿,简直让人抓狂,尤其是对于我这样的菜鸟。几经曲折,终于搞定了,决定记录下来,以便后续查看。先来看一下效果2. 准备2.1. 单点登录最常见的例子是,我...

2021-01-04 18:02:58 2145

原创 Maven子模块如何引用父模块的jar包

情况1:如果父pom中使用如下方式引入依赖,则子模块pom会自动使用父模块pom中的jar包;<dependencies> ....</dependencies>情况2:如果父pom使用如下方式,则子模块pom不会自动使用父pom中的jar包,如果子模块需要用到父模块的jar包,需要在自己pom中加入<dependency> 并且指定<groupId>和<artifactId>,正常情况下可以不用指定<version>(子p

2020-12-28 22:55:04 4232

转载 linux内核调优tcp_max_syn_backlog和somaxconn的区别

The behavior of the backlog argument on TCP sockets changed with Linux 2.2. Now it specifies the queue length for completely established sockets waiting to be accepted, instead of the number of incomplete connection requests. The maximum length o

2020-12-14 13:28:08 2049

原创 JS,SQL,Java这些语言是否区分大小写

文章目录前言前端语言:后端语言:数据库语言:总结前言总结了一些语言语法对大小写是否敏感,也算是复习这些常识知识啦。前端语言:html 对大小写不敏感 ,不区分大小写; css 对大小写不敏感 ,不区分大小写; JS 对大小写非常敏感 ,区分大小写(变量名,函数,关键字都要区分大小写);TypeScript 对大小写敏感 ,区分大小写; 后端语言: C语言 对大小写敏感 ,区分大写和小写字符; C++ 对大小写敏感 ,区分大写和小写字符;Java 对大小写敏感 ,区分大写和小写字符

2020-11-25 10:36:15 3815 2

原创 JVM中对象创建与内存分配机制—JVM系列(三)

前言:学习本章前先阅读之前我写的关于JVM系列的前两篇文章:JVM类加载机制深入浅出分析 -- JVM系列(1)JVM内存模型 -- JVM系列(2)

2020-11-12 10:52:38 22250 14

原创 JVM内存模型—JVM系列(二)

前言:我们都知道Java语言具有跨平台特性,正是由于JVM的存在,JVM相当于软件与硬件之间的中介,屏蔽了不同操作系统(Windows或Linux等等)底层指令集的区别,所以所深入了解JVM内存模型就显得很重要啦那我就用下面这段代码作为抛砖引玉吧public class Demo { public Car car= new Car(); // 上一篇文章提到过,一个方法对应一块栈帧内存 public int compute(){ int x = 1

2020-11-02 00:08:32 19785

原创 JVM类加载机制深入浅出分析—JVM系列(一)

1.一个类从加载到运行的整体流程这里先用下面一个Demo类的加载到运行过程进行分析public class Demo { public static final int count = 128; public static Test test = new Test(); public int compute(){ int x = 1; int y = 2; int z = (x + y) * 3; ret.

2020-10-25 21:04:23 20306 2

转载 使用quaggaJS识别图片中的条形码

使用quaggaJS识别图片中的条形码quaggaJS是一个纯JS的插件,用于识别图片中的条形码,很方便。一般用于移动端拍照识别,也可以在网页端上传图片识别。github下载地址首先要指定正确格式的条形码,常见的条形码编码类型有EAN和CODE128。另外,并不是所有图片中的条形码都可以被识别出来,而且正确率也不是100%。下面是识别网页上传图片中条码的方法。<!DOCTYPE html><html lang="en"><head> .

2020-07-23 15:15:05 3159

转载 进程和线程的主要区别(总结)

根本区别:进程是操作系统资源分配的基本单位,而线程是任务调度和执行的基本单位在开销方面:每个进程都有独立的代码和数据空间(程序上下文),程序之间的切换会有较大的开销;线程可以看做轻量级的进程,同一类线程共享代码和数据空间,每个线程都有自己独立的运行栈和程序计数器(PC),线程之间切换的开销小。所处环境:在操作系统中能同时运行多个进程(程序);而在同一个进程(程序)中有多个线程同时执行(通过CPU调度,在每个时间片中只有一个线程执行)内存分配方面:系统在运行的时候会为每个进程分配不同的内存空间;而

2020-05-23 19:15:53 393

原创 Tomcat类加载机制与JVM类加载机制对比

类加载  在JVM中并不是一次性把所有的文件都加载到,而是一步一步的,按照需要来加载。  比如JVM启动时,会通过不同的类加载器加载不同的类。当用户在自己的代码中,需要某些额外的类时,再通过加载机制加载到JVM中,并且存放一段时间,便于频繁使用。  因此使用哪种类加载器、在什么位置加载类都是JVM中重要的知识。JVM类加载  JVM类加载采用 父类委托机制,如下图所示:  JVM中包括集中类加载器:  1 BootStrapClassLoader 引导类加载器  2 ..

2020-05-18 22:37:59 20103

原创 解决springboot中无法加载dao同级目录下mybatis.xml文件

首先说一下不能加载的原因是mybatis.xml没有和java文件一起打包,所以就找不到。解决方法:1.在pom.xml文件中添加以下代码(maven打包默认在src/main/java路径下只会打包java文件,不会将xml文件打包,这算是一种约定吧,所以如果需要将xml资源也打包则需要加入以下设置):<build> <resources> ...

2020-05-04 17:56:58 2318

原创 MySQL中实现递归调用查询数据(例如商品多级分类,地区多级分类等)

对于数据库中的树形结构数据,如地区表,有时候,我们需要知道某地区的所有下属地区或者某地区的所有上属地区,这时候就需要用到mysql的递归查询。1.先创建一张地区表如下:DROP TABLE IF EXISTS `t_areainfo`;CREATE TABLE `t_areainfo` ( `id` int(11) AUTO_INCREMENT, `level` int(11) ...

2020-04-27 22:14:24 22582 2

空空如也

空空如也

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

TA关注的人

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