自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 String类型最大长度你能想到吗

如果看String的源码的话会发现String.length方法返回的值是int,而int的最大值大概是20多亿,但是String字符串长度肯定到达不了这个数,因为java文件在编译成class文件的时候会把常量放在常量池中,而常量池中每一种数据都有自己的类型,String字符串在常量池中以CONSTANT_Utf8类型表示。CONSTANT_Utf8的数据结构CONSTANT_Utf8_info {undefined​u1 tag;​u2 length;​u1 bytes[len

2022-05-20 23:35:08 1263

原创 HTTPS原理

文章目录一、http协议的缺点二、对称加密和非对称加密1.对称加密2.非对称加密3标题对称加密+非对称加密三、https协议一、http协议的缺点普通的http协议是明文传输,存在网络安全问题。1、如果有黑客通过拦截,很容易获取,我们发送的http请求,如果我们在http报文中传输了银行卡号和密码,此时就被黑客获取到了2、如果黑客在我们和服务端之间作为一个中间人,转发我们的请求报文,黑客就可以随意修改里面的内容3、总结一些安全问题出在了:(1)明文传输,数据可能被泄露。(2)不能确定对方

2022-05-20 23:31:11 306

原创 Stream流操作

今天了解了Stream流操作,觉得很有意思,如果在写代码的时候应用到,还是能有很大的帮助的。举个例子,有一个List<String>,我想要找出长度大于10的元素有几个。

2022-05-19 21:52:33 1254

原创 mysql数据库分页查询,limit语句用法

limit语句格式:select * from table limit [offset,] rows offset:表示偏移量,这个偏移量是从0开始的,不是从1开始的。rows: 表示要查询的数据行数select * from comment limit 5,2结果:select * from commit limit 2结果:分页查询:分页查询里有个公式:假设limit 第一个个参数是index,第二个参数是pageSize,那么current.

2022-05-15 23:20:06 2546

原创 深度优先搜索dfs

介绍:通过一道算法题引入:LeetCode:200. 岛屿数量题目给你一个由'1'(陆地)和 '0'(水)组成的的二维网格,请你计算网格中岛屿的数量。岛屿总是被水包围,并且每座岛屿只能由水平方向和/或竖直方向上相邻的陆地连接形成。此外,你可以假设该网格的四条边均被水包围。实例1:输入:grid = [ ["1","1","1","1","0"], ["1","1","0","1","0"], ["1","1","0","0","0"], ["0","0...

2022-05-12 20:58:13 116

转载 看完让你彻底搞懂Websocket原理

标题一、websocket与httpWebSocket是HTML5出的东西(协议),也就是说HTTP协议没有变化,或者说没关系,但HTTP是不支持持久连接的(长连接,循环连接的不算)首先HTTP有 1.1 和 1.0 之说,也就是所谓的 keep-alive ,把多个HTTP请求合并为一个,但是 Websocket 其实是一个新协议,跟HTTP协议基本没有关系,只是为了兼容现有浏览器的握手规范而已,也就是说它是HTTP协议上的一种补充可以通过这样一张图理解有交集,但是并不是全部。另外Html5是指的

2022-04-16 17:44:20 2400

原创 Spring Boot实现定时任务

首先在SpringBoot 启动类上添加注解@EnableScheduling然后在自己定义一个schedule类,并注册进Bean容器通过cron表达式实现实现定时任务@Scheduled(cron = "0/5 * * * * ?") public void test(){ System.out.println("-------------------------"+ new Date()); }结果:cron表达式可以通过在.

2022-04-16 14:41:34 146

原创 死锁产生的条件以及死锁的避免

1.死锁产生的必要条件 互斥条件:进程对他所分配的资源进行排他性控制,就是当他持有资源的时候,不允许其他的线程来持有 请求和保持条件:当进程因请求请求资源被阻塞时,他获得的资源保持不放。 不剥夺条件:进程获得的资源在未使用完之间,不能被剥夺,只能在使用完时自己释放。 环路等待条件:p0等待p1持有的资源,p1等待p2持有的条件,p2等待p3持有的条件········ 2、解决死锁的基本方法破坏死锁产生的条件之一就行 资源一次性分配,这样就不会再有请求了(破坏

2022-04-15 21:11:56 692

转载 Spring、 Spring MVC、 Spring Boot的关系

一、概念1、SpringSpring是一个开源容器框架,可以接管web层,业务层,dao层,持久层的组件,并且可以配置各种bean,和维护bean与bean之间的关系。其核心就是控制反转(IOC),和面向切面(AOP),简单的说就是一个分层的轻量级开源框架。2、SpringMVCSpring MVC属于SpringFrameWork的后续产品,已经融合在Spring Web Flow里面。SpringMVC是一种web层mvc框架,用于替代servlet(处理|响应请求,获取表单参数,表单校验

2022-04-14 20:14:14 1919

原创 Spring 中@Component 和@Bean 的区别

@Component 和@Bean都是声明一个bean交给spring管理,但他们在使用上有一些区别作用对象不同: @Component 注解作用于类,而@Bean注解作用于方法。 @Component通常是通过类路径扫描来自动侦测以及自动装配到Spring容器中(我们可以使用 @ComponentScan 注解定义要扫描的路径从中找出标识了需要装配的类自动装配到 Spring 的 bean 容器中)。@Bean 注解通常是我们在标有该注解的方法中定义产生这个 bean,@Bean告诉了Spring这

2022-04-14 15:55:37 1743

原创 java中的Atomic原子类

并发包 java.util.concurrent 的原子类都存放在java.util.concurrent.atomic下,如下图所示。在JUC中原子类可以分成四类基本类型使用原子的方式更新基本类型 AtomicInteger:整形原子类 AtomicLong:长整型原子类 AtomicBoolean:布尔型原子类 数组类型使用原子的方式更新数组里的某个元素 AtomicIntegerArray:整形数组原子类 AtomicLongArra.

2022-04-14 10:37:27 280

原创 双重检验锁实现单例模式

先上代码public class Singleton{ private volatile static Singleton uniqueInstance; private Singleton(){ } public static Singleton getUniqueInstance(){ //先判断对象是否已经实例过,没有实例化过才进入加锁代码 if(uniqueInstance==null){

2022-04-14 09:41:19 637

原创 一文彻底理解线程池

一、使用线程池的好处 降低资源消耗。通过重复利用已创建的线程降低线程创建和销毁造成的消耗。 提高响应速度。当任务到达时,任务可以不需要的等到线程创建就能立即执行。 提高线程的可管理性。线程是稀缺资源,如果无限制的创建,不仅会消耗系统资源,还会降低系统的稳定性,使用线程池可以进行统一的分配,调优和监控。 二、Executor框架1) 任务(Runnable /Callable)执行任务需要实现的 Runnable 接口 或 Callable接口。Runnable 接口或

2022-04-14 09:36:28 122

原创 synchrnized和 ReentrantLock 比较

目录1、两者都是可重入锁2、实现方式3、ReentrantLock 比 synchronized 增加了一些高级功能1、两者都是可重入锁“可重入锁” 指的是自己可以再次获取自己的内部锁。比如一个线程获得了某个对象的锁,此时这个对象锁还没有释放,当其再次想要获取这个对象的锁的时候还是可以获取的,如果不可锁重入的话,就会造成死锁。同一个线程每次获取锁,锁的计数器都自增 1,所以要等到锁的计数器下降为 0 时才能释放锁。2、实现方式synchronized 依赖于 JVM 而.

2022-04-13 21:43:29 273

原创 java volatile关键字详解

目录一、并发编程的三个重要特性二、CPU 缓存模型三、JMM(Java 内存模型)一、并发编程的三个重要特性 原子性 : 一个的操作或者多次操作,要么所有的操作全部都得到执行并且不会收到任何因素的干扰而中断,要么所有的操作都执行,要么都不执行。synchronized 可以保证代码片段的原子性。 可见性 :当一个变量对共享变量进行了修改,那么另外的线程都是立即可以看到修改后的最新值。volatile 关键字可以保证共享变量的可见性。 有序性 :代码在执行的过

2022-04-13 21:40:19 128

原创 java的synchronized 关键字详解

java的synchronized 关键字详解,介绍了synchronized 的原理,synchronized 的优化,即偏向锁,轻量级锁,自旋锁,锁消除,锁加重

2022-04-13 21:27:40 1818

原创 一文彻底了解redis缓存穿透、雪崩,解决策略和布隆过滤器

目录1、什么是缓存穿透2、解决方法1、参数校验2、缓存无效key3、布隆过滤器1、什么是缓存穿透就是大量的访问数据的请求的key不存在redis中,导致这些请求直接打到数据库上,根本没经过缓存这一层。比方说:有人制造了缓存中不存在的key发送了大量的请求,导致大量的请求落到了数据库上面,可能会造成数据库崩溃。2、解决方法1、参数校验最基本的操作,不合法的参数请求直接返回给数据库。比如查询的数据库 id 不能小于 0、传入的邮箱格式不对的时候直接返回错误消息给客

2022-04-12 15:59:34 958

原创 redis的持久化,快照持久化和只追加文件持久化

持久化是为了将内存中的数据写入到磁盘里面,主要是为了机器重启,机器故障之后的数据恢复。或者说防止系统故障将数据备份。快照持久化(RDB)Redis可以通过创建快照来获得内存里面的数据在某一时间节点上的副本。Redis创建快照之后可以将快照备份到其他服务器,根据这个快照创建具有相同数据的服务器副本(redis的主从结构,提高redis性能)。还可以在重启的时候使用这个快照恢复数据。快照持久化是redis默认的持久化方式,Redis.conf配置文件中默认有此下配置:save 900 1 .

2022-04-12 14:27:51 296

转载 Redis的zset结构跳表

跳表:为什么 Redis 一定要用跳表来实现有序集合?上几篇主要是学习二分查找算法,但是二分查找底层依赖的是数组随机访问的特性,所以只能用数组来实现。如果数据存储在链表中,就没办法使用二分查找了吗?此时跳表出现了,跳表(Skip list)实际上就是在链表的基础上改造生成的。跳表是一种各方面性能都比较优秀的动态数据结构,可以支持快速的插入、删除、查找操作,写起来也不复杂,甚至可以替代红黑树??。Redis 一共有5种数据结构,包括:1、字符串(String)redis...

2022-04-12 13:07:36 946

原创 Redis的五种数据结构以及用法(最强入门介绍)

超级详细的Redis数据结构介绍,以及对应的使用方法,适用场景。一定会对你有所帮助的

2022-04-12 13:02:24 491 1

原创 maven无法下载jar包的原因(超全)

前一段时间用搭框架用到maven,但是在导报的时候总是下载不下来,在这里总结一下失败的原因,帮助大家避坑。

2022-04-11 20:24:39 24387 2

原创 仿写HashMap

最近阅读了HashMap的源码,为了加深对HashMap的理解自己动手仿写了一个HashMap,主要实现了get(),put(),resize()方法。具体的说明在代码的注释里。public class MyHashMap<K,V> { private Node<K,V>[] table; private int size=0; private int capacity; private float loadFactor; /**

2022-04-11 20:00:29 201

原创 MySql中的行锁,表锁

1、行锁作用在数据行上加锁机制:在一个事务中当进行数据访问时比如:select * from persion where name="张三"如果persion 表存在name索引,那么行锁进仅仅加在了name=“张三”的这一行的上面。如果不存在name索引的话,因为MySql数据库不知道sql语句访问的是那条数据,所以会对所有数据行加锁。但是这种加锁方式是非常影响并发效率的,所以MySql server会将不满足条件的数据行取消锁。即时如此还是会影响并发度,所以对数据的访问尽量走索引。

2022-04-11 19:13:14 3019

原创 正确理解MySql的MVCC实现原理

2022-04-11 15:10:52 846

原创 MySql中乐观锁、悲观锁与MVCC

文章目录一、事务并发带来的问题二、正确了解乐观锁与悲观锁悲观锁乐观锁对乐观锁和悲观锁的正确认识三、乐观锁与悲观锁的实现共享锁和排他锁悲观锁的实现方式乐观锁的实现方式四、MVCC(多版本并发控制)快照读与当前读乐观锁、悲观锁、MVCC比较五、总结一、事务并发带来的问题事务并发总结起来有三种场景:读-读:不存在任何问题,也不需要并发控制读-写:有线程安全问题,可能会造成事务隔离性问题,可能遇到脏读,幻读,不可重复读写-写:有线程安全问题,可能会存在更新丢失问题,比如第一类更新丢失,第二类更新丢失

2022-04-11 00:11:23 1726

原创 Mysql数据库的事务隔离机制

文章目录一、事务特性(ACID)二、事务并发带来的问题三.不同的事务隔离机制一、事务特性(ACID)原子性: 事务是最小的执行单位,不允许分割。事务的原子性确保动作要么全部完成,要么完全不起作用;一致性: 执行事务前后,数据保持一致,例如转账业务中,无论事务是否成功,转账者和收款人的总额应该是不变的;隔离性: 并发访问数据库时,一个用户的事务不被其他事务所干扰,各并发事务之间数据库是独立的;持久性: 一个事务被提交之后。它对.

2022-04-10 17:01:44 1756

原创 流水线技术与指令重排序

打个比方,当计算机要执行一个任务的时候,这个任务包含多条指令,计算机要在这些指令间切换,流水线技术大幅度提高了执行效率,但是执行顺序收到了影响

2022-04-10 16:32:50 411 1

原创 sql优化

SQL优化的一些方法1.对查询进行优化,应尽量避免全表扫描,首先应考虑在 where 及 order by 涉及的列上建立索引。2.应尽量避免在 where 子句中对字段进行 null 值判断,否则将导致引擎放弃使用索引而进行全表扫描,如:select id from t where num is null 可以在num上设置默认值0,确保表中num列没有null值,然后这样查询:select id from t where num=0 3.应尽量避免在 where 子句中使用!

2022-04-08 00:16:25 57

原创 多角度彻底理解HashMap

文章目录一、从数据结构的角度看二、从主体数组的角度看计算索引的方式:三、线程安全的角度看一、从数据结构的角度看在jdk1.7的时候hashmap是由数组加+链表实现的。jdk1.8的时候底层是由数组+链表+红黑树实现的因为,数组+链表的话如果链表过长的话,这个hashmap的查找时间复杂度就是O(n)级别。时间复杂度太高,hashmap的效率就很低。所以在jdk1.8的是时候就引入的红黑树的数据结构。但是jdk1.8 哪怕引入的红黑树也没有说一开始解决hash冲突的时候就使用红黑树。因为红黑树是一个

2022-04-04 19:36:10 797

原创 JVM垃圾收集算法

文章目录前言一、如何判断对象的生死1、引用计数法2、可达性分析算法可以作为GC Roots 的是二、分代收集理论1.分代理论内容2.跨带引用假说三、垃圾收集算法1、标记-清除算法2、标记-复制算法3、标记-整理算法前言在jvm堆里面存放着Java世界中几乎所有的对象实例,垃圾收集器在对堆进行回收前,第一件事情就 是要确定这些对象之中哪些还“存活”着,哪些已经“死去”(“死去”即不可能再被任何途径使用的对 象)了。一、如何判断对象的生死1、引用计数法 引用计数法判断对象是否存活靠的是,在对象中添

2022-04-04 19:17:56 407

原创 new对象时JVM做了哪些工作

如果类没有被加载进虚拟机,jvm首先将类加载进虚拟机内存1、类加载,将累加载进jvm,并在准备阶段将类中的静态属性赋默认值,零值。2、初始化类,执行静态代码块,为静态变量赋初值(一个类的静态代码块只执行一次,只能jvm调用)类加载进内存之后 为实例对象分配内存空间,同时给非静态属性赋默认值(空闲列表,指针碰撞,展开说说) 调用父类构造器 父类构造器执行完之后后,如果自己声明属性的同时有显示的赋值,那么进行进行显示赋值把默认值覆盖。 执行匿名代码块 执

2022-04-04 19:11:52 1024

原创 计算机网络中的层次结构

目录一、网络中的层次结构二、各层次结构的作用,以及相应的协议2.1 应用层2.2 运输层2.3 网络层2.4 数据链路层2.5 物理层一、网络中的层次结构计算机的网络结构分为OSI七层结构和TCP四层结构,而我们学习计算机网络时我们一般采用折中的办法,也就是中和 OSI 和 TCP/IP 的优点,采用一种只有五层协议的体系结构,这样既简洁又能将概念阐述清楚。二、各层次结构的作用,以及相应的协议2.1 应用层应用层(application-l..

2022-04-04 16:58:45 6583

原创 彻底理解TCP的三次握手,四次挥手

文章目录前言一、TCP、UDP二、三次握手,四次挥手1.三次握手2、为什么是三次握手,不是两次,四次3、四次挥手4、为什么是四次挥手5、为什么要等待2MSL时间6、TCP的保活计时器三、大白话总结三握四挥前言一、TCP、UDPTCP和UDP是计算机网络结构中运输层的两个协议。传输控制协议 TCP(Transmission Control Protocol)–提供面向连接的,可靠的数据传输服务。用户数据协议 UDP(User Datagram Protocol)–提供无连接的,尽最大努力的数据传

2022-04-04 16:29:01 2832

原创 双亲委派模型

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档文章目录一、类和类加载器二、使用步骤1.引入库2.读入数据总结一、类和类加载器示例:pandas 是基于NumPy 的一种工具,该工具是为了解决数据分析任务而创建的。二、使用步骤1.引入库代码如下(示例):import numpy as npimport pandas as pdimport matplotlib.pyplot as pltimport seaborn as snsimport warningswa.

2022-03-31 16:41:13 308

原创 让你彻底了解类的加载过程

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档文章目录前言一、类的生命周期二、类加载的过程2.1加载2.2验证2.3准备2.4解析2.5初始化前言Java虚拟机把描述类的数据从Class文件加载到内存,并对数据进行校验、转换解析和初始化,最 终形成可以被虚拟机直接使用的Java类型,这个过程被称作虚拟机的类加载机制。下面我们来彻底搞懂虚拟机的类加载机制。一、类的生命周期一个类从被加载到虚拟机内存开始,到卸载出内存为止,它的整个生命周期将会经历加载 (Loading)、验证(.

2022-03-31 15:38:19 1480

原创 强引用、软引用、弱引用、虚引用的区别

强引用 是最传统的引用,是指在程序代码之中普遍存在的引用赋值,Object obj=new Objece() 任何情况下,强引用关系还在,对象就不可能被回收。 软引用 用来描述还有用,但非必要的对象,系统将要发生内存溢出异常前,会把软引用连接的对象列入回收范围进行二次回收。 弱引用 弱引用描述的是非必须对象,引用强度比软引用要弱一些,被弱引用关联的对象只 能生存到下一次垃圾收集发生为止。 虚引用 最弱的一种引用,并且..

2022-03-22 18:28:21 471

原创 强大的G1收集器

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档文章目录前言一、Garbage First收集器1、停顿时间模型2、基于Region二、优先级回收三、G1实现java堆化整为零的关键四、收集过程五、G1 和CMS比较前言一、Garbage First收集器Garbage First(简称G1)收集器是垃圾收集器技术发展历史上的里程碑式的成果,它开创了收集 器面向局部收集的设计思路和基于Region的内存布局形式。G1发展到jdk8的时候提供了并发的类卸载支持,补 全了其计划功能.

2022-03-22 00:01:44 555

原创 CMS收集器

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档文章目录一、CMS收集器二、运作过程1、初始标记2、并发标记3、重新标记4、并发清除二、CMS 收集器的缺陷一、CMS收集器CMS收集器(Concurrent Mark Sweep)收集器是一种以获取最短回收停顿时间为目标的收集器。从名字(包含“Mark Sweep”)上就可以看出CMS收集器是基于标记-清除算法实现的。CMS是一款优秀的收集器,它最主要的优点在名字上已经体现出来:并发收集、低停顿,一些官 方公开文档里面也称之为“并.

2022-03-21 17:08:25 1720

原创 Parallel Scavenge收集器

一、Parallel Scavenge收集器Parallel Scavenge收集器也是一款新生代收集器,它同样是基于标记-复制算法实现的收集器,是 能够并行收集的多线程收集器。Parallel Scavenge收集器的特点是它的关注点与其他收集器不同。Parallel Scavenge收集器的目标则是达到一个可控制的吞吐量(Throughput)。所谓吞吐量就是处理器用于运行用户代码的时间与处理器总消耗时间的比值,即:举例说明:如果虚拟机完成某个任务,用户代码加上垃圾收集总共...

2022-03-21 16:08:58 1367

原创 PerNew收集器

一、PerNew收集器PerNew收集器其实是Serial收集器的并行版本,除了同时使用多条线程并行的进行垃圾收集以外其余的与Serial收集器完全一致。如果你不知道Serial收集器可以参考我的上一篇博客https://blog.csdn.net/m0_57659908/article/details/123635782并行和并发我们要学习垃圾收集器的话一定要明白这两个概念并行:并行描述的是多条垃圾收集器线程之间的关系,说明同一时间有多条这样的线 程在协同工作,通常默认此时用户线程

2022-03-21 15:31:38 406

空空如也

空空如也

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

TA关注的人

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