自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

蛙广志

想象力才是人类的天花板

  • 博客(40)
  • 问答 (5)
  • 收藏
  • 关注

原创 近期阿里八面面经,复盘总结一下

总的来说,阿里的面试还是很有质量的,大部分都是项目相关,八股不多也不难云计算一面(过)订单池的权限管理怎么做(不同的角色看到不同的订单)分布式缓存的定义(内存消耗,数据不一致),为什么用分布式缓存Redis用过没有,哪些用途主要都是项目两道题:一道是适配器设计模式,一道是责任链设计模式,出的很精巧云计算二面(挂,因为实习目的不明确,求知欲望不强?)大部分围绕项目展开,很少八股实习项目:自己介绍10分钟zk选主过程,分布式之间怎么调度Http restful调度和RPC的区别说到

2022-03-11 10:57:48 748 1

原创 【分布式系列文章】Multi-Paxos的具体落地:Raft算法~

通俗易懂地理解分布式Raft算法

2021-12-01 21:55:42 2367

原创 【分布式系列文章】大名鼎鼎的Paxos算法~

对于Paxos算法的通俗理解

2021-12-01 09:35:39 729

原创 算符优先分析程序设计实验【Java版】

一、实验目的根据算符优先分析法,对表达式进行语法分析,使其能够判断一个表达式是否正确。通过算符优先分析方法的实现,加深对自下而上语法分析方法的理解。二、大致思路构建FirstVT级和LastVT集构建算符优先表进行表达式正确性分析三、伪代码构建构建FirstVT集/*求 FirstVT 集的算法*/ PROCEDURE insert(P,a); IF not F[P,a] then begin F[P,a] = true; //(P,a)进栈 end

2021-11-28 14:37:44 1572

原创 字节鸡架(基础架构)日常实习三面面经,许愿hr面~~~

11.17日 一面11.22日 二面11.24日 三面-----------一面-------------1.大部分都是项目相关,八股问的很少2.GC算法,需要详细到复制算法如何复制,整理算法如何移动3.类加载过程4.说说你对集合的理解(Collection,Map)5.HashMap相关6.是否了解线程安全的List集合,我说vector,或者Collection.synclist,面试官想问CopyOnWriteList,当时忘了7.算法:中序递归和迭代,秒了-----------

2021-11-24 19:59:41 964 7

原创 手写基于Netty的RPC框架【纯手写,超硬核】!

写在前面Netty作为网络编程的王者人物,写在简历上是妥妥的加分项,除了对Netty的基本使用和源码分析,这里博主提供一套基本的纯手写RPC框架,基于Netty的实战项目,写在简历上岂不美滋滋,代码食用地址一、整体代码架构图首先我们明白一款RPC框架需要哪些组件,以及整体的执行流程我们需要那些组件或解决哪些问题?确定通讯协议,为了更好的理解RPC通讯原理,本框架使用自定义协议和Http协议两种形式如何解决网络通讯中的拆包粘包?使用动态代理,使得客户端只需要调用需求的方法,在代理中获取请求信息

2021-09-29 19:31:17 1221

原创 【分布式锁】由缓存到分布式锁到缓存一致性问题,万字长文一步步带你全部打通!

写在前面本文使用Redis做缓存中间件,并以分布式为分析背景,从本文中你可以了解到:从本地缓存到引出分布式缓存高并发下,缓存失效的三大问题:缓存,击穿,雪崩的分析和解决使用分布式锁解决三大问题Redisson专业分布式锁框架简化开发Spring-cache由Spring整合缓存操作,一键式注解开发各位看官可以按需所取缓存的定义与使用通常存在缓存中的数据要求实时性不高,常用于读多写少的数据,比如地图信息,电商中的三级分类信息等等使用前提:本地缓存本质上是在堆空间中申请空间创.

2021-08-06 11:01:15 355 2

原创 @valid参数校验使用,全方位多角度保证你的数据安全

写在前面再Javaweb的开发中,为了防止懂技术的人对数据库的恶意攻击,我们通常使用参数校验对无效数据进行筛选,Java生态下的@valid注解配置SpringBoot的使用可以方便快速的完成对数据校验的各种场景同时数据校验分为前端校验和后端校验前端校验通常我们使用脚手架快速搭建页面,比如element-ui提供了可以参数校验的表单,官方文档有较为详细的使用教程,传送门,在此就不再重复,本文重点在于后端的参数校验后端校验如果有人拿到了url地址,使用第三方测试工具比如postman就可以跳过前

2021-07-11 19:30:52 5400 6

原创 【redis深入学习】还在说人人皆知的五大数据结构?来看看底层是如何实现的,绝对够硬核

说到redis,五大数据结构几乎是人人皆知的东西了,这是redis区别memcached的重要特征,那么redis底层是如何实现这五大数据结构的呢?这里面大有学问,且随博主,一探究竟,绝对值得你收藏慢慢看壹:首先我们先明白几个前置知识1.redis中所有的底层的主要的数据结构简单动态字符串SDS、双端链表、字典、压缩列表、整数集合等等2.redis使用对象存储键值对我们要明白Redis中无论是key还是value都是使用对象来存储,每当我们在Redis的数据库添加一个键值对时,底层至少会创建两个

2021-05-31 12:26:39 287 18

原创 【Redis深入学习】面试官常问的字典结构,这次必须一文搞定它!

如果对跳跃表感兴趣可以看博主的另一篇文章:传送门,看不懂来捶我~对于面试常问的Redis五种数据结构类型,相信每个java程序员都刻入到DNA中了,但大厂面试官问必底层,问到把你裤衩子给看穿,所以作为五大数据结构的底层实现结构之一:字典更是重中之重,接下来随博主用最简洁,图文并茂的讲给你听壹:宏观理解字典字典就可以理解为我们生活使用的字典,就是存放key-value的大集合,key相当于想要查的汉字,value:相当于汉字的详细解释,字典存放了一个个的key-value,并且每个key都是唯一的R

2021-05-29 17:26:27 341 24

原创 【Redis深入学习】最通俗的语言讲解跳跃表

写在前面:关于跳跃表网上的博客抄来抄去大差不差,博主用最通俗的语言给你讲懂跳跃表是一种有序的数据结构,说到有序,我们很快能想到Redis的五大基本类型之一——Zset的底层数据结构之一,跳跃表的出现就是为了解决在有序表中增删改查的效率问题,跳跃表支持平均o(logn)最坏o(n)的查找复杂度,大部分情况下和红黑树的效率几乎可以媲美,那为什么不用红黑树呢?有段子说作者不会红黑树,哈哈哈哈,maybe壹:先通俗地了解什么是跳跃表这里,结合生活中的栗子给你来通俗地讲解什么是跳跃表:在我生活的城市.

2021-05-26 09:33:40 425 19

原创 【Netty学习】EventLoop源码剖析

Netty的核心代码十分复杂,NioEventLoop是一个重量级类,我们买办法全部看一遍,这里我会选出核心的流程,带着问题去看源码,便会事半功倍,废话不多说,我们开始老规矩,先看看NioEventLoop的继承关系NioEventLoop的设计原理Netty的NioEventLoop并不是一个纯粹的I/O线程,它除了负责I/O的读写之外,还负责处理以下两种任务系统的task:也就是普通的task任务,通过调用NioEventLoo的execute(task)方法实现,Netty有许多系统Tas

2021-05-09 23:39:21 541 6

原创 【Netty学习】channel,channelPipeline,channelhandlerContext源码级分析

channel,channelPipeline,channelhandlerContext是Netty中的核心组件,接下来我们将从源码的角度分析这三大组件是如何协调工作的,本文建立在对三者有一个基本的了解,一些基本知识就不再赘述前置知识:到底什么是出战和入站服务器端和客户端都有一个装载ChannelHandler链的ChannelPipeline的容器,所以出战和入站我们分为两个角度当数据从socket向pipeline流动时,这个动作称之为入站,当数据从pipeline流向socket时,这个动作

2021-05-09 13:51:29 243

原创 【Netty学习】从Reactor模型到Netty模型,一文搞懂

本文将详细的介绍Reactor模型以及在Netty中的具体体现,阅读前提最好对Netty以及多线程有一个基本的了解,(本文基于韩老师的Netty教程)要想了解Reactor模型,我们从传统的IO阻塞模型一步步分析壹:传统的IO阻塞模型(说明:黄色的框表示对象,蓝色的框表示线程,白色的框表示方法)模型特点:采用阻塞IO模式处理连接请求或者执行read,write方法每个连接都需要独立的线程完成数据的输入,业务处理,数据返回图中多线程阻塞IO模型,请求和read方法都会阻塞线程,传统模型为每个

2021-05-08 23:08:03 247 2

原创 【多线程】AQS中条件变量await()和signal()实现原理

想要了解AQS中条件变量await()和signal()实现原理,需要先对AQS的前置知识有深入了解,博主的万字长文带你读懂AQS的实现原理:传送门条件变量的存储结构本质上每个条件变量其实就对应着一个等待队列,其实现类是ConditionObject等待队列是一个单向链表,我们来看一下ConditionObject的成员变量 //队列的第一个节点 private transient Node firstWaiter; //队列的最后一个节点 private transien

2021-04-11 11:13:41 796 1

原创 【多线程】深入Java线程池,超硬核,带你手写线程池!

本文将全面并且深入地带你全面了解Java线程池,从源码到手写,通俗易懂又硬核,看了不吃亏,不看必后悔~~废话不多说,咱们开始

2021-04-09 17:45:58 227

原创 【异常分析】Springboot中使用测试类报空指针(at com.intellij.rt.junit.IdeaTestRunner$Repeater.startRunnerWithArgs)

先看错误截图当你在测试类中使用到@Autowired自动注入时,会报以上错误解决方案:在测试类上方加上@RunWith(SpringRunner.class)注解原因:注解的意义在于Test测试类要使用注入的类,比如@Autowired注入的类,有了@RunWith(SpringRunner.class)这些类才能实例化到spring容器中,自动注入才能生效不然直接一个NullPointerExecption...

2021-04-06 19:21:58 2059 1

原创 【集合-HashMap】手撕HashMap源码,带你一行一行分析,全面且深入,全程干货!

本文全程硬核~!带你深入底层,一行行分析HashMap,由于篇幅可能过程,本文先介绍学习HashMap的前置知识,考虑到全文篇幅过长影响阅读体验,所以将文章分为以下部分:HashMap的一些概念和底层结构HashMap底层是由哈希表存储数据1.要说哈希表,我们先从数组和链表说起:老生常谈了,简单来说就是数组查询快,链表增删快,那有没有一种结构结合两种数据结构的优点,查询快,增删也快?有,那就是哈希表2.哈希表张啥样?table中的每个元素也是链表的头节点,所以哈希表=数组+链表3.HashM

2021-04-04 15:41:44 170 1

原创 【集合-HashMap】源码级理解HashMap之深入构造方法和神奇位运算

壹:HashMap的基本属性//序列化IDprivate static final long serialVersionUID = 362498820763181265L;//哈希表默认的桶数,也就是数组的长度,同时这个容量必须是二的次数幂 static final int DEFAULT_INITIAL_CAPACITY = 1 << 4; // aka 16//桶的最大数量static final int MAXIMUM_CAPACITY = 1 << 30;//默

2021-04-04 15:38:47 392 2

原创 【集合-HashMap】源码级理解HashMap之get()和remove()方法

壹:get(Object key)方法//调用getNode()方法,获取不到返回null,否则返回key对应的valuepublic V get(Object key) { Node<K,V> e; return (e = getNode(hash(key), key)) == null ? null : e.value; }//重点在这里 final Node<K,V> getNode(int hash, Object key)

2021-04-04 15:38:07 437 3

原创 【集合-HashMap】源码级理解HashMap之resize()方法,带你一行行手撕

1.为什么要扩容?当容器元素比数组长度大的多时,就会链化眼中,get()操作就会退化成链表的顺序查找,为了提高效率,减弱链化,所以进行扩容壹:一行行带你读源码final Node<K,V>[] resize() { //引用扩容前的哈希表 Node<K,V>[] oldTab = table; //表示扩容前table数组的长度 int oldCap = (oldTab == null) ? 0 : oldTab.length

2021-04-04 15:37:36 642 4

原创 【集合-HashMap】源码级理解HashMap之putVal()方法,一行行手撕源码

public V put(K key, V value) { //调用putVal()方法 //传入的参数:经过哈希扰动和hashcode,key,val,onlyIfAbsent,evict return putVal(hash(key), key, value, false, true); }//这里得到onlyIfAbsent表示如果hash冲突时,新值是否替换旧值,false表示替换//evict我们用不到,暂时不分析final V putVal(int ha

2021-04-04 15:37:23 1283 9

原创 【集合-HashMap】HashMap中sizeForTable,hash()算法中的位运算

HashMap中位运算的运用可以说是神乎其神,也很难理解,接下来让我带你理解以下三种位操作,作者不做标题党,图文并茂你一定能看懂,欢迎交流学习Hash中的位运算- `tableSizeFor()`方法,根据传入容量返回一个`>=cap`的最小二的整数次幂的数- 取模运算`(n - 1) & hash`- Hash()算法中的位运算- tableSizeFor()方法,根据传入容量返回一个>=cap的最小二的整数次幂的数static final int tableSizeFor(in

2021-04-02 23:01:57 239 1

原创 【集合】源码级深入理解LinkedList,点开即食

在讲LinkedList之前,建议先对ArrayList有一个较为深入的理解,这样两者对比之下,就能找到更适合生产环境中的容器类型可以阅读博主的另一边文章,带你全面了解ArrayList,从扩容机制,常见方法,到fail-fast以及并发情况下的问题都有深入分析:深入理解ArrayList由ArrayList引发的思考由于ArrayList底层是由数组存储的,优点很明显:连续存储空间可以由角标在o(1)的时间复杂度内完成缺点:1.对于元素的增删操作最差达到o(n)2.并且存在不断扩容的问题,时间

2021-04-01 09:39:20 2096 4

原创 List,AbstractList,ArrayList是什么关系?

在阅读ArrayList的源码过程中,List接口,AbstractList抽象类和ArrayList集合类之间到底什么关系,这是一种什么设计模式?在源码中这样的设计并不罕见,首先在接口中定义这个家族中所有成员的共性方法,且不管其成员具体的实现方式,集中地规范了该有的共性方法例如List接口中的抽象方法那每个实现类都要全部实现这些方法么?那可太麻烦了,例如size()方法,对于每个List实现类来说都是返回size属性,如果每个都要重写,势必会使代码更加臃肿AbstractList中所以.

2021-03-30 21:47:05 448 1

原创 【集合】ArrayList看这一篇就够了,点开即食~!

ArrayList作为平常使用最多的集合之一,今天就彻彻底底地搞懂它,话不多说,开干!别急,整体把控继承实现关系实现了RandomAccess接口,可以随机访问实现了Cloneable接口,可以克隆实现了Serializable接口,可以序列化、反序列化实现了List接口,是List的实现类之一实现了Iterable接口,可以使用for-each迭代三大接口分析首先三大接口都是标志接口,点开源码可以发现接口中什么代码也没有,只是起到一个标志作用,所以叫标志接口在这

2021-03-30 12:17:29 570 9

原创 Diagrams:Idea自带类图分析插件(太香辣)

学习源码的过程中,免不了会想对复杂的继承实现关系一目了然,今天就教你使用Diagrams这一Idea自带的插件假设我想查看ArrayList的继承实现关系1.点进源码2.右键ShowDiagram3.想插入其他类或接口快捷键:空格(记得勾选non-project)4.其他方法使用从左至右:打开属性,打开方法,打开构造方法,打开内部类等等,可以同时打开(具体功能可以自己摸索)5.整体效果...

2021-03-29 16:46:31 2790

原创 【多线程】关于ThreadLocal的,进来看看,你想知道的我都告诉你~

关于多线程的学习,如果不了解ThreadLocal,那么多少有点说不过去,本文将详细讲述ThreadLocal的各个方面,相信我,看完你一定会有所收获ThreadLocal是什么?有什么用?从ThreadLocal的名字上可以看到,这是一个线程的局部变量。也就是说,只有当前线程可以访问。既然是只有当前线程可以访问的数据,自然是线程安全的。当使用ThreadLocal维护变量时,ThreadLocal为每个使用该变量的线程提供独立的变量副本,所以每一个线程都可以独立地改变自己的副本,而不会影响其它线程

2021-03-26 23:26:29 2539 11

原创 【多线程】源码级理解AQS(长文预警)

想要深入了解ReentrantLock、CountDownLatch、Semaphore等并发包中的各种锁机制么?那么少不了理解AQS这个抽象类,一句话来说,AQS就是通过维护一个volatile的state变量以及一个FIFO等待队列来实现前提预警1.本文基于ReentrantLock的非公平锁实现机制,公平锁和非公平锁的区别并不大,会在稍后的博客中介绍2.本文并不分析共享模式和Condition条件3.AQS的实现十分巧妙,值得打开源码深深品味一番AQS的整体结构public abstrac

2021-03-25 17:58:13 1143 3

原创 【Leetcode】只出现一次的数字(异或中的骚操作)

异或中的骚操作今日刷LeetCode发现了只出现一次的数字的系列题,并且深深领会到异或中的骚操作,接下来介绍一些说完让你眼前一亮的操作首先异或的基础介绍什么是异或操作,简单来说就是相同为0,不同为1,更好记忆的方法是不进位+运算,举个简单的栗子:6^7=1所以不难得到:0^N=N,N^N=0异或操作是满足结合律和交换律的,即多个数即异或结果和顺序无关不需要额外空间的互换值maybe交换两个数的值是我们最开始接触过的代码,很简单,用一个额外变量 int a = 1,b = 2,temp;

2021-03-20 10:19:36 251 6

原创 接口能不能new对象?接口中能不能有实现方法?

接口到底能不能new呢?先说结论:接口是不能new的我们在学习多线程的过程中一定会遇到以下的写法new Thread(new Runnable() { @Override public void run() { for(int i = 0;i<=40;i++){ ticket.sell(); } } },"

2021-03-14 20:36:46 3505 2

原创 JVM--详解对象分配内存过程

本文将详解描述一个对象从生到死的过程在java世界里,“几乎”所有的对象实例都在这里分配内存,而这里的几乎由于即时编译技术的进步,尤其是逃逸分析技术的日益强大,使得对象可以在栈上分配首先给出整体过程前提:本文的回收过程仍以分代GC回收器为基础栈上分配不同于大家所熟知的对象分配在堆空间中,在GC中中会回收堆中不再使用的对象,但标记筛选以及回收整理空间都需要消耗大量资源,所以如果一个对象能分配在栈空间中,不在使用时可以直接从栈中弹出,不在经过...

2021-03-09 22:24:42 367

原创 Java 日期类的使用

Java日期类相关的处理1.System获取时间戳2.Date类- 获取当前时间- 获取当前时间的时间戳,返回值单位毫秒- 日期的格式化和解析- 求日期差3.Calendar类常用方法:4.LocalTime,LocalDate,LocalDateTime常用方法:本文介绍日期相关的常用方法,简洁实用,快速上手1.System获取时间戳获取当前时间戳,返回值单位为毫秒,表示当前日期与UTC时间1970年1月1日的差值 long l = System.currentTimeMillis();2.D

2021-03-08 18:14:13 698 3

原创 Java NIO

详解Java NIO写在前面:Java NIO1.Java NIO简介2.JavaNIO与IO的主要区别3.缓冲区(Buffer) 和通道(channel)4.详解缓冲区的创建及常见方法4.1详解Buffer类4.2接下来一个实例来解释执行各种方法时四种变量的变化5.直接缓冲区和非直接缓冲区4.文件通道(FileChannel)5.NIO的非阻塞式网络通信6.管道7.Java NIO2写在前面:在学习完IO后,又深入学习了NIO,这篇笔记花了笔者挺长时间,如果觉得写的不错,点个赞把,如果有什么问题,请不

2021-02-21 23:03:24 175

原创 NIO非阻塞与选择器(Selector)

浅析NIO非阻塞与选择器写在前面阻塞与非阻塞选择器(Selector)什么是选择器?选择器的使用方式选择器常用的方法一个具体实例展示如何使用非阻塞式IO写在前面笔者的另一篇博客详解了NIO中的各个方面,包括缓冲区,通道,分散聚集等等NIO核心内容,附博客链接阻塞与非阻塞首先我们先看一下官方对于阻塞与非阻塞的定义,有一个初步的认知传统的IO 流都是阻塞式的。也就是说,当一个线程调用read() 或write()时,该线程被阻塞,直到有一些数据被读取或写入,该线程在此期间不能执行其他任务。因此,在完

2021-02-21 23:02:41 318

原创 详解IO流

Java IO详解IO概述1.什么是IO2.流及流的分类2.1什么是流?2.2流的分类3.IO流对象3.1字节流4.IO流方法4.1字符流方法4.2字节流方法5.代码实例5.1使用`FileReader`和`FileWriter`实现文本的复制5.2使用`FileInputStream`和`FileOutputStream`实现图片的复制IO概述1.什么是IOI/O是Input/Out普通的缩写,I/O技术是非常使用的技术,用于处理设备之间的数据传输。在Java程序中,对于数据的输入/输出操作以“流

2021-02-19 22:56:28 429

原创 Redis详解

redis1.NoSQL简介Nosql = Not Only SQL不仅仅是sql,泛指非关系型数据库,传统的关系型数据库由单数据库时代,发展大到缓存,水平切分时代发展到读写分离的时代,到分表分库的集群时代,传统的关系型数据库由表为核心的模式已经发展到了极致,所以非关系型数据库不在以表为底层存储数据,而是采用聚合数据结构来存储数据。redis就是非关系数据库的一种代表,基于内存运行的高性能NoSQL数据库,redis中的数据大部分时间都是存储在内存中的,适合存储访问频繁,数据量比较小的数据2.red

2021-02-16 20:23:10 419

原创 Jedis连接redis失败

Exception in thread “main” redis.clients.jedis.exceptions.JedisConnectionException如标题本机连接redis失败1.注释掉bind127.0.0.1或者绑定2.修改protected-mode3.查看防火墙是否对6379端口号开放:firewall-cmd --query-port=6379/tcp如果是yes就是开放的4.重新开始redis服务,记得带上配置文件启动//文件路径根据本机的设置redis-se

2021-02-16 12:18:22 282

原创 SpringBoot

title: springBootcategories: 框架SpringBoot四大核心自动配置,起步依赖,Actuator,命令行界面原理初探:pom.xml·spring-boot-dependencies:核心依赖在父工程中!·我们在写或者引入一些springboot的依赖时无需指定版本,由父依赖统一管理启动器<dependency> <groupId>org.springframework.boot</groupId>.

2020-11-09 22:48:31 572

原创 最小栈问题

title: 最小栈问题categories: 数据结构与算法最小栈的问题首先明确定义:什么是最小栈?就是栈中有一个getMin()方法可以常数复杂度的获取栈中的最小值,所以暴力遍历栈获取最小值是十分不明智的,所以我们会采用一个辅助栈,来帮助我们获取最小值。通常有两种方案,和主栈同步,和主栈不同步。和主栈同步:就是指主栈和辅助栈一定会增加元素import java.util.Stack;public class MinStack { // 数据栈 private Sta.

2020-08-30 12:07:29 214

空空如也

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

TA关注的人

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