一、 什么是索引?索引是一个排序的列表,在这个列表中存储着索引的值和包含这个值的数据所在行的物理地址,可以大大加快查询的速度,使用索引后可以不用扫描全表来定位某行的数据,而是先通过索引表找到该行数据对应的物理地址然后访问相应的数据。索引的作用类似于书的目录,可以根据目录中的页码快速找到所需的内容。
. 索引概述(了解)当数据保存在磁盘类存储介质上时,它是作为数据块存放。这些数据块是被当作一个整体来访问的,这样可以保证操作的原子性。硬盘数据块存储结构类似于链表,都包含数据部分,以及一个指向下一个节点(或数据块)的指针,不需要连续存储。
记录集只能在某个关键字段上进行排序,所以如果需要在一个无序字段上进行搜索,就要执行一个线性搜索(Linear Search)的过程,平均需要访问 N; 的数据块,N 是表示所占据的数据块数目。如果这个字段是一个非主键字段(也就是说,不包含唯一的访问入口), 那么需要在 N 个数据块上搜索整个表格空间。
但是对于一个有序字段,可以运用二分查找(BinarySearch),这样只需要访问 log(N)的数据块。这就是为什么数据表使用索引后性能 ...
前言据我看到的面试题有:判断垃圾回收的算法有什么,以及是什么原理,垃圾收集算法有什么,常见的垃圾回收器有什么,什么是STW等,所以这篇博客基于GC给大家介绍,如果有其他面试题可以在评论区发言,博客可修改内容,可添加。
一、判断垃圾回收的算法先提前说两个算法,分别是:
引用标记算法
可达性分析算法
.引用标记算法引用标记算法是在Java对象头(Java对象头在介绍多线程的时候有详细的解释,直达链接:Java多线程:三、多线程锁、java锁的实现)中开辟空间,记录被引用的次数(Reference Count),如果A变量被其他对象引用时计数器+,引用A变量的其他变量被删除则-,如果计数器为时,则判断A变量需要被回收。
举个例子:
String str = "我不想上早八";
此时,在Java虚拟机栈(以下简称栈)开辟一个内存空间记录str,此时堆中的字符串常量池的“我不想上早八”,被引用的次数就是(Reference CountD;),此时我做修改操作:
String str = "其实我想上早七";
此时,在栈中 ...
一、JDK .. 加锁机制ConcurrentHashMap 在 JDK . 中,提供了一种粒度更细的加锁机制,这种机制叫分段锁「Lock Striping」。整个哈希表被分为多个段,每个段都独立锁定。读取操作不需要锁,写入操作仅锁定相关的段。这减小了锁冲突的几率,从而提高了并发性能。
这种机制的优点:在并发环境下将实现更高的吞吐量,而在单线程环境下只损失非常小的性能。
可以这样理解分段锁,就是将数据分段,对每一段数据分配一把锁。当一个线程占用锁访问其中一个段数据的时候,其他段的数据也能被其他线程访问。
有些方法需要跨段,比如 size()、isEmpty()、containsValue(),它们可能需要锁定整个表而不仅仅是某个段,这需要按顺序锁定所有段,操作完后,再按顺序释放所有段的锁。如下图:
. jdk.之前的结构ConcurrentHashMap 是由 Segment 数组结构和 HashEntry 数组+链表构成的。Segment 是一种可重入的锁 ReentrantLock,HashEntry 则用于存储键值对数据。
一个 ConcurrentHas ...
前言大部分内容由网上搜索,有直接复制粘贴的内容,本篇博客整理我查找的内容,且加入我个人的理解和个人需要了解的知识进行搜索得到的内容,有错误请在评论区留言
一、首先介绍一下锁操作系统层面的锁: 操作系统通过锁机制来管理进程(或线程)对共享资源的访问,以防止数据竞争和保证数据一致性。 常见的操作系统锁包括互斥锁(Mutex)、读写锁(Read-Write Lock)、自旋锁(Spinlock)等,它们用于控制对临界区(Critical Section)的访问。
这里介绍一下“临界区”的概念。所谓“临界区”,指的是某一块代码区域,它同一时刻只能由一个线程执行。
Java多线程的锁: Java中的锁是Java编程语言中用于实现多线程同步和互斥的机制。 Java提供了多种类型的锁,如synchronized关键字、ReentrantLock类、ReadWriteLock等,用于控制多线程对共享资源的并发访问。
首先需要明确的一点是:Java 多线程的锁都是基于对象的,Java 中的每一个对象都可以作为一个锁。在上一节最后一点讲synchronized的时候有提到,synchronized可 ...
文章包括八股的JMM模型、volatile关键字、synchronized关键字、重排序等内容,来,试试看~
Java开发未读
Java多线程:(一)线程池全文干货了解线程池,知道java面试中线程的内容会问什么
为什么计算机中采用补码的方式进行数据存储和计算?为什么在Java中有时候小数会存在精度丢失的情况?本文简单介绍补码和精度丢失的问题
哇塞~终于费劲心思把这个博客建好了哇塞~终于费劲心思把这个博客建好了,我要写一篇博客记录这个过程以及如何实现的。
本博客基于hexo搭建起来,起因也是我专业的朋友给我推送了这个视频,晚上睡不着觉突然又刷到了,于是第二天就开始马上着手准备~
.hexo众所周知搭建一个博客的有hexo,以及其他我不用的框架,使用博客框架搭建起来非常快,而不是需要真的说去写一个前后端来实现,对非计算机专业的同学要求也不是那么高(如果你需要实现主题样式那就很高了),所以hexo真的是十分的nice啊~
不过需要去另外会用git,安装nodeJS,直接给它拿下
当初按照下来的步骤很简单,不过在git上确实有问题,有时候git bash命令下载失败,有时候npm命令查找不到,单单装hexo下来就费劲了很多脑子~
仔细一想nodeJs我已经用nvm做版本管理了,才记得把hexo生成的文件夹扔到nvm下才生效,又花费了一点时间
ok,咱也是直接拿下
.主题样式接下来访问本地hexo成功以后就是选择主题了,hexo官方截止年月日有个主题,每隔一段时间都会有开发者将自己的主题扔上去
最 ...
一、函数式接口只有一个抽象方法的接口就成为函数式接口。同时,引入了一个新的注解:@FunctionalInterface。可以把他它放在一个接口前,表示这个接口是一个函数式接口。这个注解是非必须的,只要接口只包含一个方法的接口,虚拟机会自动判断,不过最好在接口上使用注解 @FunctionalInterface 进行声明。在接口中添加了 @FunctionalInterface 的接口,只允许有一个抽象方法,否则编译器也会报错。
举例几个Java常用的函数式接口:predicate断言型接口、consumer消费者接口、supplier提供者接口、Function接口等。
记好一句话:函数式接口可以接收匿名内部类和lambda表达式
记好一句话:函数式接口可以接收匿名内部类和lambda表达式
记好一句话:函数式接口可以接收匿名内部类和lambda表达式
全文重点:
俗话说,new一个接口就要new他的实现类对象,但是假设我不存在函数时接口的实现类对象,那么一般就使用匿名内部类的形式创建对象。创建出来的匿名内部类需要实现函数式接口中全部(其实就一个)的抽象方法。既然是匿名内部类的抽象方 ...