自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 Map 重要面试题

为了能让 HashMap 存取高位,尽量减少碰撞,也就是要尽量把数据分配均匀。因为 Hash 值范围是 2^-31 ~ 2^31 -1 ,前后加起来大概 40 亿的映射空间,只要哈希函数映射的比较均匀松散,一般应用是很难出现碰撞的。但问题是一个 40 亿长度的数组,内存是放不下的。所以这个散列值是不能直接拿来用的。用之前还要先对数组的长度取模运算,得到的余数才能用来表示要存放的位置,也就是对应数组的下标。并且每次增加 2 的幂次方倍可以有效防止哈希碰撞的问题。

2023-10-10 19:39:25 33

原创 集合面试题总结(1)

当容量已达到极限并且需要扩容的时,则需要执行一次 O(n) 的操作将原数组复制到新的更大的数组中,然后再执行 O(1) 的操作添加元素。采用链表存储,所以在头尾插入或者删除元素不受元素位置的影响、时间复杂度为O(1), 如果是要在指定位置插入元素的话,时间复杂度为 O(n) ,因为需要先移动到指定位置再插入和删除。指定位置删除:需要将目标元素之后的所有元素向前移动一个位置以填补被删除的空白位置,因此需要移动平均 n/2 个元素,时间复杂度为 O(n)。在后续添加元素的过程中,如果集合长度不够,需要扩容,

2023-10-09 17:54:28 33

原创 MySql 索引详解(3)

​ 如果一个索引包含(或者说覆盖)所有需要查询的字段的值,我们就称之为我们知道在 InnoDB 存储引擎中,如果不是主键索引,叶子界定啊存储的是主键+列值。最终还是要 “回表”,也就是要通过主键再查找一次,这样就会比较慢。而覆盖索引就是把要查询出的列和索引是对饮的,不做回表操作。

2023-10-07 19:35:53 33

原创 MySql 索引详解(2)

按照数据结构维度划分:按照底层存储方式角度划分:按照应用维度划分:​ 数据表的主键使用的就是主键索引。​ 一张数据表只能有一个主键,并且主键的值不能为null,不能重复。​ 在 MySql 的 InnoDB 表中,当没有显示的指定表的主键时, InnoDB 会自动先检查表中是否有唯一索引且不允许 null 值的字段,如果有,则选择该字段为默认主键,否则 InnoDB 将会自动创建一个 6Byte 的自增主键。​ 二级索引又称为辅助索引,是因为二级索引的叶子存储的数据是主键。也就是说,通过二级索引,可以定位主

2023-10-06 19:57:51 34

原创 MySql 索引详解(1)

​​ 索引的作用就相当于书的目录,打个比方:我们在查字典的时候,如果没有目录,那我们就只能一页一页的去找我们需要查的那个字,速度很慢,如果有目录了,我们只需要先去目录里查询字的位置,然后直接翻到那一页进行查询​ 索引底层数据结构存在很多种类型,常见的索引结构有:B+树,B树和 Hash、红黑树。在 MySql 中,无论是 Innodb 还是 MyIsam ,都是使用 B+树作为索引结构。

2023-10-05 19:55:27 15

原创 HotSpot 虚拟机对象探秘

通过后,接下来虚拟机将为新生对象 **分配内存 **。​ 对齐填充部分不是必然存在的,也没有什么特别的含义,仅仅起展位的作用,因为 HotSpot 虚拟机的自动内存管理系统要求对象的起始地址必须是 8 字节的整数倍,换句话说就使对象的大小必须是8字节的整数倍。​ HotSpot 虚拟机的对象头中包括两部分信息,第一部分用于存储对象自身的运行数据( 哈希码、GC 分代年龄、锁状态标志等等),另一部分是类型指针,即对象指向它的类元数据的指针,虚拟机通过这个指针来确定这个对象是哪个类的实例。

2023-09-26 20:09:08 22

原创 JUC 并发面试题(基础)

​ 进程是一个程序运行的基本单位,电脑上每运行一个软件都对应着一个进程​ 线程是程序运行的最小单位,一个进程在执行的过程中可以有多个线程共同执行。

2023-09-25 20:20:49 23

原创 JVM 内存区域详解(3)

​ Class 文件中除了有类的版本、字段、方法、接口等描述信息外,还有用于存放编译期生成的各种字面(Literal)和符号引用(Symbolic Reference)的​ 字面量是源代码中的固定值的表示法,即通过字面我们就能知道其值的含义。字面量包括整数、浮点数和字符串字面两。常见的符号引用包括类符号引用、字段符号引用、方法符号引用、接口方法符号。​ 《深入理解 Java 虚拟机》7.34 节第三版对符号引用和直接引用的解释如下:​ 常量池表会在类加载后存放到方法区的运行时常量池中。

2023-09-23 20:44:46 24

原创 JVM内存区域详解(2)

在 HotSpot 虚拟机中和 Java 虚拟机栈合二为一。​ 本地方法被执行的时候,在本地方法栈也会创建一个栈帧,用于存放该本地方法的局部变量表、操作数栈、动态连接、方法返回地址。​ 方法执行完毕后相应的栈帧也会出栈并释放内存空间,也会出现和两种错误。

2023-09-21 20:43:26 27

原创 Java内存区域详解(1)

​ Java 虚拟机在执行 Java 程序的过程中会把它管理的内存划分成若干不同的数据区域。​ JDK 1.8 和之前的版本略有不同,我们这里以 JDK 1.7 和 JDK 1.8 这两个版本为例介绍​​​​ Java 虚拟机规范对于运行时数据区域的规定是相当宽松的。以堆为例:堆可以是连续空间,也可以不连续。堆的大小可以固定,也可以在运行时按需扩展。虚拟机实现者可以使用任何垃圾回收算法管理堆,甚至完全不进行垃圾回收也是可以的。

2023-09-20 09:55:13 30

原创 Java IO 基础知识总结

IO 即,输入和输出。数据输入到计算机内存的过程即输入,反之输出到外部存储(比如数据库,文件,远程主机)的过程即输出。数据传输过程类似于水流,因此称为 IO 流。IO 流在 Java 中分为输入流和输出流,而根据数据的处理方式又分为字节流和字符流。Java IO 流的 40 多个类都是从如下 4 个抽象类基类中派生出来的。

2023-09-18 21:28:31 23

原创 JVM垃圾回收器详解(3)

​ 标记-清除算法(Mark-and-Sweep)算法为“标记(Mark)“ 和 ”清除(Sweep)“ 阶段:首先标记出所有不需要回收的对象,在标记完成后统一回收掉所有没有被标记的对象。​ 它是最基础的收集算法,后续的算法都是对其不足进行改进得到。​ 关于具体是标记可回收对象还是不可回收对象,众说纷纭,两种说法其实都没有问题,个人更倾向于是前者。​ 如果按照前者的理解,整个标记-清除过程大致是这样的。

2023-09-16 18:18:16 40 1

原创 JVM垃圾回收详解(2)

​ 无论是通过引用计数法判断对象引用数量,还是通过可达性分析法判断对象的引用链是否可达,判断对象的存活都与“引用”有关。​ JDK 1.2 之前,Java 系统中引用的定义很传统:如果 reference 类型的数据存储的数值代表的是另一块内存的起始地址,就称这块内存代表一个引用。​ JDK 1.2 以后,Java 对引用的概念进行了扩充,将引用分为了强引用、软引用、弱引用、虚引用四种(引用强度逐渐减弱)​1. 强引用(StrongReference)

2023-09-15 20:36:16 22

原创 JVM垃圾回收详解(1)

​ Java 的自动内存管理主要是针对对象内存的回收和对象内存的分配。同时,Java 自动内存管理最核心的功能是内存中对象的分配和回收​ Java 堆是垃圾收集器管理的主要区域,因此也被称为。​ 从垃圾回收的角度来说,由于现在收集器基本都采用分代垃圾收集算法,所以 Java 堆被划分为了几个不同区域,这样我们就可以根据各个区域的特点选择合适的垃圾回收算法。​ 下图展示的 Eden 区、两个 Survivor 区 S0 和 S1 都属于新生代,中间一层属于老年代,最下面一层属于永久代。​。

2023-09-14 14:38:35 31 1

原创 Mysql 存储引擎

​ Mysql 核心在于存储引擎,想要深入学习 Mysql,必定要深入研究 Mysql 存储引擎。

2023-09-12 19:40:11 24

原创 双亲委派模型

​ 类加载器有很多种,当我们想要加载一个类的时候,具体是哪个类加载器加载呢?这就需要提到双亲委派模型了。​ 根据官网介绍:类使用委托模型来搜索类和资源。每个实例都有一个相关的父类加载器。需要查找类或资源时,实例会在试图亲自查找类或资源之前,将搜索类或资源的任务委托给其父类加载器。虚拟机中被称为 “bootstrap class loader” 的内置类加载器本身没有父类加载器,但是可以作为实例的父类加载器。从上面的介绍可以看出下图展示的各种类加载器之间的层次关系被称为类加载器的。

2023-09-07 18:15:41 26

原创 类加载器详解

​ JVM 中内置了三个重要的启动类加载器):最顶层的加载器,有 C++实现,通常表现为 null,并且没有父级,主要用来加载 JDK 内部的核心类库(目录下的rt.jar等 jar 包和类)以及被参数指定的路径下的所有类。(扩展类加载器):主要负责加载目录下的 jar 包和类以及被系统变量锁指定的路径下的类。(应用程序类加载器):面向我们用户的加载器,负责加载当前应用 classpath 下的所有 jar 包和类。

2023-09-06 19:53:55 49 1

原创 类的生命周期

#类加载过程​ 类从被加载到虚拟机内存中开始到卸载出内存为止,它的整个生命周期可以简单概括为7个阶段:加载阶段(Loading)、验证(Verification) 、准备(preparation)、解析(Resolution)、初始化(Initialization)、 使用(Using)和卸载(Unloading)。其中,验证、准备和解析这三个阶段可以统称为连接(Linking)。​ 这七个阶段的顺序如下图所示:​ Class 文件需要加载到虚拟机中才能运行和使用,那么虚拟机是如何加载这些 Class 文

2023-09-05 21:24:32 28

原创 Linux常用命令

对于我们学习Linux操作系统时,Linux命令是基础,也是学习Linux系统的重点内容,虽然Linux的指令有很多,但是我们常用的指令并不多,大家在学习的时候,主要掌握这部分常用的指令就可以了,对于其他的指令,以后我们用到的时候,知道怎么查询即可。当我们在查看一些比较大的文件时,我们可能需要经常查询文件尾部的数据信息,那这个时候如果文件很大,我们要一直向下翻页,直到最后一页,去看最新添加的数据,这种方式就比较繁琐了,此时,我们可以借助于tail指令。接下来,这几个领域中,代表性的操作系统是那些?

2023-09-03 21:19:25 28

原创 好友关注-Feed流实现方案

推拉模式是一个折中的方案,站在发件人这一段,如果是个普通的人,那么我们采用写扩散的方式,直接把数据写入到他的粉丝中去,因为普通的人他的粉丝关注量比较小,所以这样做没有压力,如果是大V,那么他是直接将数据先写入到一份到发件箱里边去,然后再直接写一份到活跃粉丝收件箱里边去,现在站在收件人这端来看,如果是活跃粉丝,那么大V和普通的人发的都会直接写入到自己收件箱里边来,而如果是普通的粉丝,由于他们上线不是很频繁,所以等他们上线时,再从发件箱里边去拉信息。是从6后一点的5去拿,就拿到了5-1的记录。

2023-09-02 21:07:30 65

原创 Linux简单操作

Linux是一套免费使用和自由传播的操作系统。说到操作系统,大家比较熟知的应该就是Windows和MacOS操作系统,我们今天所学习的Linux也是一款操作系统。不同领域的主流操作系统,主要分为以下这么几类: 桌面操作系统、服务器操作系统、移动设备操作系统、嵌入式操作系统。接下来,这几个领域中,代表性的操作系统是那些?1). 桌面操作系统操作系统特点Windows用户数量最多MacOS操作体验好,办公人士首选Linux用户数量少(桌面操作系统,Linux使用较少)2). 服务器操作系统。

2023-08-29 21:00:40 41 1

原创 Docker实用篇

*数据卷(volume)**是一个虚拟目录,指向宿主机文件系统中的某个目录。[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ethjdyal-1693230218121)(assets/image-20210731173541846.png)]一旦完成数据卷挂载,对容器的一切操作都会作用在数据卷对应的宿主机目录了。这样,我们操作宿主机的/var/lib/docker/volumes/html目录,就等于操作容器内的/usr/share/nginx/html目录了。

2023-08-28 21:43:43 59 1

原创 ReentrantLock与synchronized区别

​实现了Lock接口,是一个可重入且独占式的锁,和关键字类似,不过更灵活,更强大, 增加了轮询, 超时, 中断, 公平锁和非公平锁等高级功能.​里面有一个内部类SyncSync继承了AQS, 添加锁和释放锁的大部门操作实际上都是再Sync中实现的.Sync有公平锁FairSync和非公平锁两个子类默认使用非公平锁,也可以通过构造器来显式的指定使用公平锁。

2023-08-26 20:36:37 21

原创 偏向锁简述

来支持,如果堆上的共享数据不可能逃逸出去被其它线程访问到,那么就可以把它们当成私有数据对待,也就可以将它们的锁进行消除(同步消除:JVM 逃逸分析):如果对象被多个线程访问,但没有竞争,这时偏向了线程 T1 的对象仍有机会重新偏向 T2,重偏向会重置对象的 Thread ID。锁消除是指对于被检测出不可能存在竞争的共享数据的锁进行消除,这是 JVM。享数据的锁进行消除,这是 JVM。

2023-08-25 20:27:00 92 1

原创 synchronzied锁原理

如果使用 synchronized 给对象上锁(重量级)之后,该对象头的 Mark Word 中就被设置指向 Monitor 对象的指针,这就是重量级锁。每个 Java 对象都可以关联一个 Monitor 对象,Monitor 也是 class,其。Monitor 被翻译为监视器或管程。Mark Word 结构:最后两位是。

2023-08-24 20:36:42 33 1

原创 单例模式的结构

​ 单例模式(Singletion Pattern)是Java中最简单的设计模式质疑.这种类型的实际模式属于创建型模式,它提供了一种创建对象的最佳方式.​ 这种模式设计到一个单一的类,该类负责创建自己的对象,同时确保只有单个对象被创建.这个类也要提供一种访问其唯一对象的方式,可以直接访问,不需要实例化该类的对象.

2023-08-23 16:19:30 31

原创 Redis键值设计

当字节数大于44字节时,会转为raw模式存储,在raw模式下,内存空间不是连续的,而是采用一个指针指向了另外一段内存空间,在这段空间里存储SDS内容,这样空间不连续,访问的时候性能也就会收到影响,还有可能产生内存碎片。scan 命令调用完后每次会返回2个元素,第一个是下一次迭代的光标,第一次光标会设置为0,当最后一次scan 返回的光标等于0时,表示整个scan遍历结束了,第二个返回的是List,一个匹配的key的数组。Key中的成员数过多:一个ZSET类型的Key,它的成员数量为10,000个。

2023-08-21 19:32:40 19 1

原创 续 redis

因为是记录命令,AOF文件会比RDB文件大的多。而且AOF会记录对同一个key的多次写操作,但只有最后一次写操作才有意义。通过执行bgrewriteaof命令,可以让AOF文件执行重写功能,用最少的命令达到相同效果。AOF全称为Append Only File(追加文件)。Redis处理的每一个写命令都会记录在AOF文件,可以看做是命令日志文件。Redis也会在触发阈值时自动去重写AOF文件。RDB和AOF各有自己的优缺点,如果对数据安全性要求较高,在实际开发中往往会。

2023-08-19 20:25:56 21

原创 ThreadLocal的简单理解

ThreadLocal从字面意义上理解是本地线程变量,也就是说,ThreadLocal中填充的是本地线程的变量,这个变量对于其他的线程是隔离的,不会被其他线程读取根据源码知道,ThreadLocal运行原理是在底层创建了一个ThrealLocalMap集合,并且将我们输入进的value值当作value,ThreadLocad当作key值对于每个线程内部有个ThreadLocal.ThreadLocalMap 变量,存取值的时候,也是从这个容器中来获取。

2023-08-18 19:51:46 19 1

原创 分布式缓存

- 基于Redis集群解决单机Redis存在的问题。

2023-08-16 20:00:23 31 1

原创 基于redis实现的用户签到功能

id % bitmap.size = 算出当前这个id对应应该落在bitmap的哪个索引上,然后将这个值从0变成1,然后当用户来查询数据时,此时已经没有了list,让用户用他查询的id去用相同的哈希算法, 算出来当前这个id应当落在bitmap的哪一位,然后判断这一位是0,还是1,如果是0则表明这一位上的数据一定不存在, 采用这种方式来处理,需要重点考虑一个事情,就是误差率,所谓的误差率就是指当发生哈希冲突的时候,产生的误差。第一种解决方案:遇到的问题是如果用户访问的是id不存在的数据,则此时就无法生效。

2023-08-15 20:04:24 64 1

空空如也

空空如也

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

TA关注的人

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