知其所以然
文章平均质量分 89
MrYuShiwen
能够成就别人的人才能称得上是真英雄,愿我们彼此相互成就,成为那个真英雄!
Java开发工程师,后端工程师,努力想成为架构师的小萌新;
写代码和学习新知识是一件非常有趣的事情,它即是个人爱好也是个人职业;
愿我的文章对读者有用,欢迎评论,一起进步!
如果期待更多我的知识分享,请关注我,一起成为那个了不起的人吧!
展开
-
HashMap中扩容问题夺命6连问,问到了硬件层,你能顶住吗?
HashMap中扩容为什么是2的n次幂?在进行Hash值计算的时候方便与长度length-1进行按位与操作,相较于取模,速度更快。负数取模存在负数的情况,效率也比较慢。普通计算器是通过硬件的逻辑运算实现加减乘除的。1、加法是基本运算,逻辑关系是异或,即0与0和1与1为0,0与1和1与0为1,得到本位和的值,根据运算要求,确定是否要进位;2、 减法是进行补码加运算,即将减数取反加1,后进行加法运算。实际上加法也是进行补码加运算,只是在数据前用符号为表示,0为正,1为负;3、乘法是采用移位相加,或采原创 2022-03-16 09:34:19 · 8271 阅读 · 116 评论 -
高并发之volatile、synchronized关键和内存屏障(Memory Barrier)
我们都知道在Java中,如果不使用volatile和synchronized指令可能会发生重排,指令重排分为编译器指令重排和CPU指令重排。- Java多线程程序通常使用高层程序设计语言中的同步原语,比如volatile和synchronized,因此一般不需要明确使用内存屏障。- 也就是说在Java中我们使用的是volatile和synchronized关键字,javac编译转化成字节码的时候,还是用到了内存屏障。原创 2022-03-04 08:44:13 · 2454 阅读 · 48 评论 -
“了解高并发底层原理”,面试官:讲一下MESI(缓存一致性协议)吧
本期围绕着,什么是(Who),为何来(How),是什么(What),这三点内容来进行讲解该协议。1.什么是(Who):MESI(Modified Exclusive Shared Or Invalid)协议是基于Invalidate的高速缓存一致性协议,并且是支持回写高速缓存的最常用协议之一。 它也被称为伊利诺伊州协议(由于其在伊利诺伊大学厄巴纳 - 香槟分校的发展)。用于解决缓存一致的问题。2.为何来(How):2.1缓存不一致带来的后果如上图,数据加载的流程如下:(从内存到寄存器)将原创 2022-02-22 09:10:21 · 2750 阅读 · 28 评论 -
面试:精通Java;面试官:来讲一下JVM虚拟机内存模型的最底层原理,必须说详细说清楚,知其所以然。看完后,你还敢在简历上写精通Java吗?
面试简历:精通Java和JVM面试官:来说说JVM虚拟机内存模型的最底层原理,必须说详细说清楚,达到知其所以然的目的。看完后你还敢在简历上写精通Java吗?原创 2022-02-15 19:07:00 · 16645 阅读 · 84 评论 -
SpringBoot中server.port的默认值为什么是8080以及如何修改端口号
1.如何设置值首先我们进入ServerProperties中查看其内容:发现其类上面有注解@ConfigurationProperties(prefix = “server”,ignoreUnknownFields = true)prefix为前缀,前缀名为server所以我们在properties、yaml、yml文件中可以用server.xxx的方式进行属性配置。我们点进pom.xml文件中的spring-boot-starter-parent:springboot会去resourc原创 2021-01-02 17:07:40 · 8589 阅读 · 9 评论 -
MySQL的存储引擎(InnoDB与MyISAM)
Mysql 底层数据引擎以插件形式设计,最常见的是 Innodb 引擎和 Myisam 引擎,用户可以根据个人需求选择不同的引擎作为 Mysql 数据表的底层引擎。MyISAM 存储引擎是 MySQL 中常见的存储引擎,虽然性能极佳, 拥有较高的插入,查询速度,但却不支持事务处理(transaction),不支持外键。曾(MySQL 5.5及之前版本)是 MySQL 的默认存储引擎。InnoDB 存储引擎是MySQL的数据库引擎之一,现为MySQL的默认存储引擎,事务型数据库的首选引擎原创 2021-12-22 20:30:25 · 2698 阅读 · 26 评论 -
mysql索引的数据结构为什么用B+树,知其所以然
前提:以下的一些数据结构大家需提前知道,否则看起来会比较有困难,大家也可以按照本文所提到的知识点去主动查阅学习。1.Hash表?No因考虑到在数据检索的过程中经常会有范围的查询(如下),而hash表不能提供这种功能。SELECT * FROM hero WHERE age>5 AND age<20;使用哈希算法实现的索引虽然可以做到快速检索数据,但是没办法做数据高效范围查找,因此哈希索引是不适合作为 Mysql 的底层索引的数据结构。2.二叉查找树(BST)?No二叉查找树(Bi原创 2021-12-20 17:16:34 · 2825 阅读 · 11 评论 -
Bloom Filter布隆过滤器(解决redis缓存穿透)
1.布隆过滤器:布隆过滤器(英语:Bloom Filter)是 1970 年由布隆提出的。它实际上是一个很长的二进制向量和一系列随机映射函数。布隆过滤器可以用于检索一个元素是否在一个集合中。它的优点是空间效率和查询时间都比一般的算法要好的多,缺点是有一定的误识别率和删除困难。如果想要判断一个元素是不是在一个集合里,一般想到的是将所有元素保存起来,然后通过比较确定,链表,树等等数据结构都是这种思路. 但是随着集合中元素的增加,我们需要的存储空间越来越大,检索速度也越来越慢。比如:链表O(n),树O原创 2022-01-17 18:09:07 · 5748 阅读 · 12 评论 -
加解密,加签、验签也就这肥事
1.非对称加密非对称加密技术,需要两个秘钥,公钥和私钥。公钥和私钥成对出现。常见算法有:RSA、ECC(移动设备用)、Diffie-Hellman、El Gamal、DSA(数字签名用)等。1.1.加密加签、解密解签完整流程下图为本人用processon画的图:1.2.为何只能用公钥进行加密、解签,私钥解密、加签加签的目的:验证信息的发送方是否正确,信息是否被其他人篡改。之所以用发送方的私钥加签,是因为,即便信息被黑客拦截,黑客修改了信息,但是加签需要用发送方的私钥,黑客没有发送方的私原创 2021-12-09 15:54:06 · 4892 阅读 · 30 评论 -
Java解析XML(DOM解析和SAX解析)
前言:在程序中访问和操作XML文件一般有两种模型:DOM(文档对象模型)和流模型;在本篇文章中分别对应DOM解析和SAX解析。1 .DOM解析与SAX解析的相关知识点1.1 DOM文档对象模型(Document Object Model,简称DOM),是W3C制定的标准接口规范,是一种处理HTML和XML文件的标准API。将HTML或XML文档转化为DOM树的过程称为解析(parse)。HTML文档被解析后,转化为DOM树,因此对HTML文档的处理可以通过对DOM树的操作实现。DOM模型不仅描述了原创 2021-12-15 10:49:02 · 1760 阅读 · 45 评论 -
DOM方式解析XML的时候encoding属性的作用
目录1.规定2实际DOM解析的时候或者是浏览器解析XML的规则2.1如果出现以下几种情况XML解析将会出错:(用上述规则进行分析)2.2出现如下几种情况正常解析3.Dom4j解析中的编码4.这里对BOM说明一下(了解的同学可跳过该部分)1.规定W3C定义了三条XML解析器如何正确读取XML文件的编码的规则:如果文本文件头部有BOM(Byte Order Mark),即字节顺序标记(它是在Unicode编码标准中用于标识文件是采用哪种格式的编码),就按照BOM来。如果没有BOM,就查看XML声明的编原创 2021-12-14 13:57:23 · 2144 阅读 · 0 评论 -
Git底层原理与相关操作
本地Git相关知识工作区、版本库、暂存区:如上图,左侧为工作区,在电脑中能看到的部分;右侧为版本库,工作区有一个隐藏目录 .git,这个不算工作区,而是 Git 的版本库,如下图第一个红框;在版本库中标记为 “index” 的区域是暂存区,英文叫 stage 或 index。一般存放在 .git 目录下的 index 文件(.git/index)中,所以我们把暂存区有时也叫作索引(index),如下图第二个红框。分支:标记为 “master” 的是 master 分支所代表的目录树,我原创 2022-01-11 09:21:38 · 1148 阅读 · 9 评论 -
CPU和寄存器详解
1.CPU编译器是一个将用用程序语言写的程序翻译成特殊结构的电脑的机器语言的程序。通常,每一种类型的CPU都有它自己唯一的机器语言。这是为什么为Mac写的程序不能在IBM类型PC机运行的一个原因。电脑通过使用时钟来同步指令的执行。时钟脉冲在一个固定的频率(称为时钟频率)。当你买了一台1.5GHz的电脑,1.5GHz就是时钟频率,即每秒15亿次的时钟脉冲。时钟并不记录分和秒。它以不变的速率简单跳动。电子计算机通过使用这个跳动来正确执行它们的操作,就像节拍器的跳动如何来帮助你以正确的节奏播放音乐。一原创 2022-01-24 20:57:30 · 11600 阅读 · 5 评论 -
用户代码和操作系统代码是如何在CPU上面运行的(用户态和内核态)
1.CPU的四种状态与操作系统的两种状态(用户态和内核态)首先我们要知道CPU有四种状态,分别为编号为0(特权最大)到3(特权最小),以及3个受保护的主要资源:内存、I/O端口和执行某些机器指令的能力。操作系统它基于CPU之上,只用到了CPU的两种状态,一个内核态,一个用户态,内核态运行在CPU的第 0 等级,用户态运行在CPU的第 3 等级。2.操作系统的用户态和内核态之间的切换首先内核态与用户态是操作系统的两种运行级别,跟intel cpu没有必然的联系, intel cpu提供Ring原创 2022-01-20 20:36:56 · 4718 阅读 · 11 评论 -
从byte(字节)的bit(位)层面去理解编码(玩爆底层篇)
话不多说,直接上干货干货结论:java不论是负数还是正数在定义、存储、计算的过程中,都是用其补码第二个结论需要自己去体会,详情看下面的2.从byte(字节)的bit(位)层面去理解编码论证说明:1.Byte类型用二进制八进制十六进制定义数值类型数据举例用byte存一个负数,比如负27,我们一般情况下用十进制可以这样表示:byte b1 = -27;那么用二进制如何去声明负27这个数呢?用气原码,反码,还是补码去声明呢?我们都知道负27这个数,其:原码:1001 1011反码:11原创 2021-08-19 12:39:07 · 1117 阅读 · 3 评论 -
base64编码底层转换规则举例解读
一.作用Base64就是一种基于64个可打印字符来表示二进制数据的方法,把一些不可打印的字符转换成全部都是可打印的字符。ps:关于ASCII编码(含扩展ASCII)中,打印字符和不可打印字符:https://blog.csdn.net/MrYushiwen/article/details/107998062二.base64编码转换表(64个可打印字符)总共64个可打印字符,从0开始到63结束。三.base64举例说明全过程1.规则关于这个编码的规则:把3个字节变成4个字节,6位为一组,高原创 2021-09-13 14:51:11 · 3093 阅读 · 15 评论 -
Java中关于win下的环境变量以及不同版本JDK自由切换的原理分析,授人以渔
一. 不同版本JDK自由切换须知点:下载JDK之后,系统会自动将java.exe,javaw.exe,javaws.exe三个可执行文件复制到了 [C:\Windows\System32或C:\Program Files (x86)\Common Files\Oracle\Java\javapath或C:\Program Files\Common Files\Oracle\Java\javapath或C:\ProgramData\Oracle\Java\javapath]中,由于这个目录在windows原创 2021-09-27 16:08:41 · 809 阅读 · 0 评论 -
Java中native方法read()可以人为的去输入-1让文件读取的时候还没到末尾提前结束读取吗?
InputStream就是Java标准库提供的最基本的输入流。它位于java.io这个包里。java.io包提供了所有同步IO的功能。要特别注意的一点是,InputStream并不是一个接口,而是一个抽象类,它是所有输入流的超类。这个抽象类定义的一个最重要的方法就是int read(),起方法在源码中定义如下:我们如下以FileInputStream类为例,来结束read()方法,在FileInputStream类中,read()方法调用了read0()方法,而read0()方法才是我们标题中提到的n原创 2021-09-26 22:58:41 · 715 阅读 · 0 评论 -
为什么定义补码等于反码加一,知其所以然
如何你看到了这篇文章,想必你应该是一个爱思考,善于学习的人!我们经常说:补码=反码+1,但为什么要这样去定义补码呢?补码,反码被早期计算机学家设计出来的目的是什么呢?下面我们就对上面的问题进行详细解答。ps:以下的举例都用8位二进制。1.原码的诞生,原码的弊端原码诞生我们都知道,对于计算机只识别0和1,那么我们如何用计算机中二进制去表示我们生活中的十进制数字呢?首先,对于生活中十进制的正数,我们计算机中的二进制可以很好的表示出来,比如18就是0001 0010;对于十进制负数,我们二进制原创 2020-08-17 21:22:26 · 6084 阅读 · 17 评论