自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

cheng的博客

学无止尽

  • 博客(30)
  • 资源 (1)
  • 收藏
  • 关注

原创 关于集合相关类

2、遗传了链表的缺点,当存储value时,创建指针开销很大,其次,遍历链表的缓存性能较差,使处理器缓存无效,我也不懂,书上这么说的,大概意思是说,在查找和删除操作中,需要线性遍历链表,直到找到对应的value,随着链表的长度越大,时间复杂度越高(从最坏的情况考虑)。根据 Java7 HashMap 的介绍,我们知道,查找的时候,根据 hash 值我们能够快速定位到数组的具体下标,但是之后的话,需要顺着链表一个个比较下去才能找到我们需要的,时间复杂度取决于链表的长度,为 O(n)。

2023-04-24 09:19:21 176 1

原创 位运算中的移位运算

编程语言中的位运算是相通的,这里我们讨论的是Java中的移位运算。在Java中有8大基本数据类型,但是只有 byte、short、int、long和char能够使用位运算。位运算包括有:按位与、按位或、按位异或、左移运算、右移运算和无符号右移运算。我们今天讨论后边三种。在讨论这三种方式之前,我们需要知道一些基础的知识:原码、反码和补码。数据在计算机中是以补码的形式保存的,意味着在进行位运算时使用的是补码计算,这点需要注意。数据在计算机中是以二进制补码的形式保存,二进制可以细分为无符号数、正数和负数三

2022-06-30 14:44:55 1464

原创 开发中json的各种转换

开发中json的各种转换

2022-06-16 14:20:14 4193

原创 xxl-job分析

xxl-job是一个分布式调度平台,具体的介绍请看官方文档:https://www.xuxueli.com/xxl-job/你可以简单的理解为它是Quartz的兄弟,做的事情差不多,在项目中用作定时任务的框架。分析源码前,先看一下官网给出的架构图,这里分析的是2.0.1版本的xxl-job,各个版本的架构有略微的区别,需要注意。从架构中看出,其实就两大模块, 调度中心和执行器。看一下后端架构xxl-job-admin模块对应一个admin,也就是管理台或者称为调度中心,管理台可以设置成多个模块

2022-05-30 16:46:12 2381

原创 mybatisPlus在SpringBoot中mapper接口代理类的创建过程分析

这里写自定义目录标题前言:在spring boot框架中,mybatisplus是怎么生成mapper接口代理类的?猜测:通过jdk动态代理生成这个接口的实体类,然后…在spring boot中,我们引入mybatisplus的依赖后,猜测是有自动配置的,我们在第三方包中找,找到如下显示:我们找到mybatisPlus依赖包中的spring.factories目录,里面显示的就是配置类了。我们顺着这个配置类往下顺。MybatisPlusAutoConfiguration类,这个类是我们讨论的入口

2022-05-10 11:39:57 3539

原创 java SPI机制的源码分析

文章目录🌸概述🌷ServiceLoader的成员属性🌼源码刨析🌺Java SPI机制的优点🌻Java SPI机制的缺点🌸概述SPI,是Service Provider Interface的简称,它是Java中常用到的一种机制,目的是为了实现功能的热插拔。像Java中的数据库驱动:java.sql.Driver就使用到了这种机制。我们先来看看一个简单的例子来了解一下SPI🟢第一步:创建一个文件加载的接口public interface FileLoad { void loadFile(Str

2022-04-15 14:04:05 645

原创 浅谈Netty

介绍了Netty的常见类以及源码分析

2022-04-11 17:05:37 879

原创 NIO的理解和使用

一、概述NIO是 non-blocking-io的简称,非阻塞IO,由于它是后续出来的IO模型,有时也叫做 new-IO。NIO是后续比如React等的多路复用的基础模型。它是UNIX的五种IO模型中的一种。NIO有三大组件:buffer、channel和selector,这三大组件共同作用,提供了多路复用的非阻塞解决方案。二、组件一-bufferbuffer是NIO中的顶层缓冲抽象类,在NIO中的buffer存储的是基本类型,但是除了Boolean类型,如下初始化一个buffer,它的posi

2022-04-02 15:26:54 1427

原创 gateway网关的理解和使用

一、概述spring-cloud-gateway是一个库,可以在spring webflux之上建立一个API网关,它的目的是提供一个简单,有效的方式去路由到APIS并且提供:安全、监控和弹性。gateway构建于spring boot2.x,spring webFlux,and Project Reactor,所以,许多同步库如spring Data和spring security不适用于gateway项目中。因为gateway是异步非阻塞的。gateway要求spring boot和spring w

2022-03-24 15:30:24 12939

原创 hystrix的理解和使用

一、概述Hystrix是一个用于处理分布式系统的延迟和容错开源库,在分布式系统中,许多依赖不可避免的会调用失败,比如超时,异常等,Hystrix能保证在一个依赖出现问题时,不会导致整体服务失败,避免级联故障,以提高分布式系统的弹性。二、Hystrix能做什么1、对调用其他服务造成的异常和超时提供保护和控制2、在复杂的分布式系统中防止级联失败3、快速失败和迅速恢复4、当必要时fallback和优雅的降级5、提供实时监控,警告和可选择的控制三、hystrix怎么去执行它的目标1、将外部系统的所

2022-03-23 13:41:16 8837

原创 OpenFeign的理解和使用

一、概述openFeign是要给声明式的web服务客户端,或叫做声明式REST客户端,它让编写web服务客户端变得简单。使用它的步骤:创建一个接口并注解它。它支持spring MVC的注解,spring cloud openFeign整合了hystrix,同时,可以和Eureka和ribbon配合使用,可以实现负载均衡的http客户端。可以理解为是请求转发(RPC调度)的入口。二、使用步骤1、引入spring-cloud-starter-openfeign 依赖。2、启动类上加上@EnableF

2022-03-21 15:31:32 28471 3

原创 openFeign中的坑

问题:使用openFeign,调用微服务报Load balancer does not have available server for client显而易见,这个问题是由于OpenFeign调用Ribbon,Ribbon去Eureka服务端拉取注册表信息找不到我们想要的微服务名称。下面就跟着我来排查问题。步骤一:查看Eureka客户端的pom文件是否引入了eureka-client、Ribbon和openfeign的依赖。步骤二:打开Eureka的页面查看是否注册。我这里是OPENFEIG

2022-03-18 17:27:24 1374

原创 Eureka的理解和使用

一、概述Eureka是Netflix影视公司出品的一套成熟老套的微服务技术,用于注册中心,以后出来的consul、zookeeper和Nacos多少会借鉴一点Eureka的相关思想和技术。二、思想1、Eureka有两个组件:Eureka Client 和 Eureka Server ,Eureka Server 可以理解为是Eureka的服务端或者注册中心,保存注册的服务信息,Eureka Client可以理解为是Eureka的客户端或者是各个微服务模块,他们需要被其他的微服务模块调用和调用其他微服务

2022-03-16 15:07:16 2510

原创 java注解的理解及源码分析

一、概述注解在Java开发中常见,但是很多人不知其中的实现原理,接下来谈谈我对注解的理解和认识二、首先,注解的出现是从Java1.5开始的,注解的分类本人分为了大致的三类:a、Java自带的标准注解:@Override、@deprecated、@supporswarning@Override:表示方法的重写@deprecated:表示方法过时、过时的方法会有横杠,但是不影响使用@supporswarning:表示忽略警告信息b、元注解:@Retention 、@Target 、 @Docume

2022-03-11 17:08:37 2570

原创 CyclicBarrier的理解与应用

一、概述CyclicBarrier类是JUC框架中的工具类,也是一个同步辅助装置:允许多个线程去等待直到全部线程抵达了公共的栅栏点。它的一个很明显的特点就是Cyclic 循环,也就是说栅栏是可以循环使用的,激活循环使用的条件是当所有线程通过了栅栏并释放。二、源码分析//静态内部类,用于表示屏障的状态private static class Generation { boolean broken = false; }//重入锁,用于并发场景下的加锁和释放锁 priv

2022-03-09 15:09:11 3498

原创 Optional工具类

一、概述Optional工具类是Java8的其中一种新特性,或者可以理解为是Java给我们提供的用于处理空指针的工具类。我们来看一下Optional类中比较重要的方法//构造函数,注意,是私有的,我们不能直接调用private Optional() { this.value = null; }//带参构造函数,也是私有的private Optional(T value) { this.value = Objects.requireNonNull(value

2022-03-09 10:44:52 2482

原创 CountDownLatch的源码学习

一、简介1、CountDownLatch类是一个同步辅助装置,允许一个或多个线程去等待直到另外的线程完成了一组操作。2、它通过count进行初始化,await方法会阻塞直到当前的count为0由于调用了countDown方法,之后所有的线程将被释放并且立即返回结果。count不能被重置,如果你想count可以重置,请使用CyclicBarrier。3、CountDownLatch是一个通用的同步工具,可用于多种用途。CountDownLatch初始化使用count作为一个简单的可开可关的大门:所有的线

2021-11-09 21:15:10 149

原创 FutureTask的源码学习

一、简介1、FutureTask是一个可取消的异步计算。这个类是Future的实现类,有开始和取消一个计算的方法,如果一个计算已经完成可以查看结果。如果在计算没有完成的情况下调用get获取计算结果会阻塞。且一旦任务完成后,计算不能重新开始或被取消,除非计算被runAndReset调用执行。2、FutureTask被用来去封装一个Callable或者Runnable,一个FutureTask能够被submit作为一个Executor3、FutureTask 的线程安全由CAS来保证。二、源码分析1

2021-11-07 20:50:20 349

原创 阻塞队列的源码学习

一、BlockingQueue1、BlockingQueue不接受null元素,如果写入null,会抛出NullPointException2、它被设计用来做生产-消费队列3、由于它间接继承了Collection接口,所以,可以通过remove(x)来移除队列中任意一个元素,但是,除了处理对头和队尾的元素,操作其他地方的元素会影响性能,所以,偶尔使用remove方法是可以的,不建议频繁使用。4、BlockingQueue是线程安全的5、有些实现类的容量是受限的,所以,插入元素要注意。示例典

2021-11-07 17:35:47 188

原创 开发常见问题汇总

1、git的问题在团队开发中使用git作为项目的版本管理和团队协作的工具,避免不了会出现问题。在我们的项目中,由于idea整合了git,所以,配置idea即可使用git。具体配置是在:File–>settings–>Git中,配置电脑的git的执行目录即可使用。做完你的任务,首先需要将你的文件commit,提交到本地服务器,然后再git pull,拉最新的项目,再git push ,将本地结合刚才拉下来的最新文件一同上传,如果,不先git pull,再git push,则会将本地的项目覆盖远

2021-10-31 21:32:31 788

原创 排序算法讲解

1、冒泡排序实现过程:假设有10个数,第一轮循环,第一个数和第二个数比较,如果第一个数大,第一个数和第二个数交换位置,否则不动;接着第二个数和第三个数比较,如果第二个数大,第二个数和第三个数交换位置, 否则不动……第九个数和第十个数比较,如果第九个数大,第九个数和第十个数交换位置,否则不动。第一轮循环结束,最大的数挪到了第十个数的位置,比较进行了9次。 第二轮循环,第一个数和第二个数比较,如果第一个数大,第一个数和第二个数交换位置,否则不动……第八个数和第九个数比较,如果第八个数大,第八个数和第九个数交换

2021-10-21 22:03:13 577

原创 idea开发常见问题

idea错误:找不到或无法加载主类猜测:1,未能成功编译 尝试:菜单—》Build—》Rebuild Prodject猜测:2,缓存问题 尝试:菜单—》File—》Invalidate Caches/Restart 选择Invalidate and Restart 或者 只是Invalidate,清除掉缓存,然后Rebuild Project猜测:3,路径问题 3.1 菜单—》File—》Project Structure 3.2 在Modlues中选中项目,删除 3

2021-10-14 20:08:48 685

原创 shiro

1、什么是权限管理权限管理包括用户身份认证和授权两部分,简称认证授权。身份认证:就是判断一个用户是否为合法用户的处理过程。最简单的就是通过核对用户名和密码,看是否与系统中存储的该用户的用户名和密码一致,来判断身份是否正确授权:即访问控制,控制谁能访问哪些资源。主体进行身份认证后需要分配权限可访问的资源。2、整体架构SecurityManager 外部应用与subject进行交互,subject记录当前操作对象,subject在shiro中是个接口,接口中定义了很多认证授权相关的方法,外部程序通过

2021-10-14 19:53:37 1128

原创 MySQL数据库总体知识架构

一、关系型数据库设计理论一些重要术语属性(attribute):列的名字,我们在开发中一般称为字段依赖(relation):字段之间存在的关系元祖(tuple):每一个行,如第二行 (1301,小明,13班,篮球,英语,赵英,70) 就是一个元组外键笛卡尔积(交叉链接Cross join):A表每一行分别与B表每一行组合。连接(theta join):即加上约束条件的笛卡儿积,先得到笛卡儿积,然后根据约束条件删除不满足的元组。内连接(inner join):A表每一行与B表每一行进行匹

2021-10-10 18:56:04 1585

原创 ThreadLocal讲解

1、简介源码中这么说的:此类提供线程局部变量,这些局部变量不同于其他普通的变量,每个线程通过get或set方法访问的是它独有的变量,可以独立的初始的赋值变量副本。ThreadLocal的实例通常是private static修饰的用来联系每个线程的状态,例如:用户id或者事务id个人总结:ThreadLocal是一个将在多线程中为每一个线程创建单独的变量副本的类; 当使用ThreadLocal来维护变量时,ThreadLocal`会为每个线程创建单独的变量副本, 避免因多线程操作共享变量而导致的数据不一

2021-09-28 11:06:21 115

原创 semaphore讲解

一、简介1、Semaphore底层是基于AbstractQueuedSynchronizer来实现的。Semaphore称为计数信号量,它允许n个任务同时访问某个资源,可以将信号量看做是在向外分发使用资源的许可证,只有成功获取许可证,才能使用资源。2、它也是通过内部类Sync继承了AQS,它的方法几乎都是用的AQS的,少部分重写了AQS的方法,同时,它的信号量机制是通过AQS的state属性来操作的,变更state属性使用到了CAS操作保证变量的数据一致性。3、它的方法几乎是通过Sync类,也就是AQ

2021-09-26 10:25:08 6251

原创 ThreadPoolExecutor线程池管理

1、简介是线程池中一个重要的类,与Executor相联系,可以说取代了Executor。用来创建线程池处理高并发。2、原理其实java线程池的实现原理很简单,说白了就是一个线程集合workerSet和一个阻塞队列workQueue。当用户向线程池提交一个任务(也就是线程)时,线程池会先将任务放入workQueue中。workerSet中的线程会不断的从workQueue中获取线程然后执行。当workQueue中没有任务的时候,worker就会阻塞,直到队列中有任务了就取出来继续执行。当一个任务提交至

2021-09-25 11:43:39 636

原创 ReentrantLock基础讲解

思考题什么是可重入,什么是可重入锁? 它用来解决什么问题?ReentrantLock的核心是AQS,那么它怎么来实现的,继承吗? 说说其类内部结构关系。ReentrantLock是如何实现公平锁的?ReentrantLock是如何实现非公平锁的?ReentrantLock默认实现的是公平还是非公平锁?使用ReentrantLock实现公平和非公平锁的示例?ReentrantLock和Synchronized的对比?为啥ReentrantLock默认要是非公平的锁呢?什么时候用Reentr

2021-09-19 17:42:49 449

原创 AbstractQueuedSynchronizer基础讲解

思考题sync队列和condition队列的作用分别是什么?怎么协调的?sync队列中的节点的状态有哪些?都是自旋还是有阻塞的?是怎么争抢锁的?sync队列是怎么保证FIFO的?signal方法和release方法的区别?一、简介1、提供了一个基于FIFO队列,它是CLH队列的变种,CLH队列通常用于自旋锁 ,可以用于构建锁或者其他相关同步装置的基础框架。该同步器(以下简称同步器)利用了一个int来表示状态,期望它能够成为实现大部分同步需求的基础。使用的方法是继承,子类通过继承同步器并需要实现

2021-09-18 22:25:20 292

原创 lambda表达式

简介lambda表达式是Java8的新特性,它免去了使用匿名方法的麻烦,并且给予Java简单但是强大的函数化的编程能力,它允许把一个函数作为方法的参数(函数作为参数传递进方法中)使用lambda表达式可以让代码更加的简洁紧凑,符合未来函数式编程的趋势。普通方式、匿名方式和lambda分别实现线程//普通方法public class test2 implements Runnable{ public static void main(String[] args) { test2 te = ne

2021-09-14 16:09:43 108

个人整理的java基础,基于typora的markdown文本编辑器

个人笔记,如有侵犯到了您的权益,请联系我删除

2021-09-14

空空如也

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

TA关注的人

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