自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(187)
  • 问答 (2)
  • 收藏
  • 关注

原创 十大排序——11.十大排序的比较汇总及Java中自带的排序算法

1. 从左向右依次对比相邻元素,将较大值交换到右边;2. 每一轮循环可将最大值交换到最左边3. 重复1.2两个步骤,直至完成整个数组。选择一个元素赋值给中间元素temp,默认选择左边第一个元素,这样左边第一个元素的位置就空出来了;先从最右边的元素开始依次跟temp比较大小,大于等于temp元素的原地不动,遇到小于temp元素的则终止循环,把该元素赋值到左侧空出来的位置,同时左侧索引值自增,这是该元素原来的位置就空出;然后左侧元素开始依次跟temp比较大小,

2024-04-16 23:45:16 1466

原创 十大排序——10.基数排序

基数排序(Radix sort)是一种非比较型整数排序算法它的原理是将整数按位数切割成不同的数字,然后按每个位数分别比较。基数排序的方式可以采用LSD(Least significant digital)或MSD(Most significant digital),LSD的排序方式由键值的最右边开始,而MSD则相反,由键值的最左边开始。MSD:先从高位开始进行排序,在每个关键字上,可采用计数排序LSD:先从低位开始进行排序,在每个关键字上,可采用桶排序基数排序也是非比较的排序算法,

2024-04-16 22:35:42 297

原创 十大排序——9.桶排序

桶排序和计数排序一样,都不是基于比较进行排序的。下面通过一个例子来理解一下桶排序吧。首先,给你一个无序数组[ 20,18,28,66,25,31,67,30 ],然后,我们对其进行一个划分,比如十位数为1的放一起排,十位数为2的放一起排等等。结果就是我创造了10个桶,每个桶里面都放着十位数相同的那些数,然后,我在这些桶里再实现这些数据的有序性,然后,我再依次将这些数据取出来,这样就保证了数据的有序性。下面看一下介绍:桶排序(Bucket sort)或所谓的箱排序,是一个排序算法,工作的原理是。

2024-04-16 22:14:51 329

原创 十大排序——8.计数排序

前面我们介绍的7中排序算法都是基于比较进行排序的,而计数排序不是基于比较进行排序的一种算法。下面,我们来看一个例子。首先,这里有一个无序数组[ 5,1,1,3,0 ],然后我们找到这个数组中的最大元素,即5,然后创建一个新数组,新数组的长度为5+1=6,即创建一个长度为6的数组。然后,我们用新数组的索引对应原数组的值,即原数组中 1 就对应新数组中索引1,数值 2 就对应新数组中索引2,这个很好理解,并且我们也能很清楚的明白为什么新数组长度为原数组中最大值+1了。之后,

2024-04-16 21:09:59 652

原创 十大排序——7.希尔排序

希尔排序是插入排序的一种优化,可以理解为是一种分组的插入排序。简单来说,就是分组实现插入,每组元素的间隙称为gap,一开始给你一个无序数组,然后我们以gap为间隙对这个数组进行分组,然后在每组内对数据进行排序,这就实现了每组的数据有序性。然后,我们减小gap的值,然后再分组,再对每组内的数据进行排序,直到gap为1完成排序。希尔排序是对插入排序的优化,可以让元素跟快的交换到最终位置。如下图所示,一开始是无序数组,8个元素,然后我们分为4组,gap值为4,序号1的图;

2024-04-16 17:39:24 423

原创 十大排序——6.插入排序

插入排序的要点如下所示:首先将数组分为两部分[ 0 ... low-1 ],[ low ... arr.length-1 ],然后,我们假设左边[ 0 ... low-1 ]是已排好序的部分右边[ low ... arr.length-1 ]是未排序的部分,然后每次从未排序的部分取出low位置的元素,插入到已排序区域。

2024-04-16 15:50:24 762

原创 十大排序——5.选择排序

选择排序( Selection sort)是一种简单直观的排序算法。它的工作原理是每一趟从待排序的数据元素中选出最小(或最大)的一个元素,顺序放在已排好序的数列的最后,直到全部待排序的数据元素排完。选择排序算法通过选择和交换首先从原始数组中选择最小的1个数据,将其和位于第1个位置的数据交换。接着从剩下的n-1个数据中选择次小的1个元素,将其和第2个位置的数据交换然后,这样不断重复,直到最后两个数据完成交换。最后,便完成了对原始数组的从小到大的排序。

2024-04-16 11:21:56 871

原创 数据结构与算法——23.哈希冲突及其解决方法

首先,我们来了解一下哈希表与哈希冲突。哈希表也叫散列表,底层是由数组+链表实现的,是一种实现关联数组和抽象数据类型的数据结构,这种结构可以将关键码映射到给定值。简单来说哈希表(key-value)之间存在一个映射关系,是键值对的关系,一个键对应一个值。当两个不同的数经过哈希函数计算后得到了同一个结果,即他们会被映射到哈希表的同一个位置时(就是对应数组的同一个索引),即称为发生了哈希冲突。简单来说就是哈希函数算出来的值有重复的了。这篇文章介绍了哈希表,哈希冲突和解决哈希冲突的四种方法。

2024-04-15 23:32:40 456

原创 数据结构与算法——22.哈希算法

什么是哈希算法?哈希算法有哪些?hash算法是一种将任意长度的数据通过一个算法,变成固定长度数据的过程,这个固定长度的数据就是hash值。hash算法可以将任意大小的数据压缩到固定大小的值。常见的hash算法有MD5、SHA1、SHA256、SHA512、CRC32等。其中,MD5和SHA系列算法是最常用的hash算法。这些算法在计算hash值时,都考虑了原始数据的每一个字节,一旦改动原始数据的任何一个字节,所得到的hash值都会有明显的不同。因此,hash算法被广泛应用于数据完整性校验和加密等方面。

2024-04-15 20:24:19 1090

原创 数据结构与算法——21.哈希表

下面来看一下哈希表目录1.什么是哈希表1.1前言1.2哈希表的介绍2.哈希表的实现在学习什么是哈希表之前,我们先来看下面在这一种情况。我这里有一堆数据,我给每个数据上一个编号,假设就是从0-10,然后,我准备一个表格,就是一个一维数组。现在,我数据有了,表格有了,下面,我在数据的编号和表格索引之间建立一个关系。假设把编号0的数据放到数组索引0的位置,把编号1的数据放到数组索引1的位置,以此类推的进行存储。

2024-04-15 17:05:32 385

原创 数据结构与算法——20.B-树

在介绍B树之前,我们回顾一下我们学的树。首先是二叉树,这个不用多说,然后为了查找的效率,我们提出了搜索二叉树(或者称为二叉搜索树),就是节点类加个key值,然后左边小右边大的那个。然后为了避免极端情况的出现,就是二叉搜索树节点集中在一侧的情况,我们提出了平衡二叉树,就是带自旋的,可以左旋或者右旋的,高度差小于1的那种,平衡二叉树里面有AVL树和红黑树两种实现方式,注意,平衡二叉树是在二叉搜索树的基础上提出的,所以平衡二叉树也叫平衡二叉搜索树。下面介绍一下B树。

2024-04-14 01:09:25 1438 1

原创 并发编程——8.阶段小结

后面,我们重点的讲解了并发编程中的锁,用锁来保证线程安全,我们讲了乐观锁与悲观锁,在乐观锁中我们讲了CAS算法、ABA问题,然后我们讲了自旋锁与互斥锁,讲了消费者与生产者模式(这部分内容属于拓宽的),然后中的讲了 synchronized锁升级机制,讲了可重入锁,讲了ReentrantLock同步互斥锁,讲了公平锁和非公平锁,讲了共享锁和排他锁,讲了synchronized与Lock的区别。然后,我们简单的讲了一下线程的底层原理(源码层级的),画了一张图,这部分内容最后是掌握一下,面试时说出来很装逼的。

2024-04-11 17:01:26 414

原创 并发编程——7.Java的“锁”事

前面,我们介绍了一些保证线程安全的手段,比如将共享资源设置为只读,比如将共享变量变为局部变量的数据,比如用ThreadLocal线程变量,比如用volatile来解决可见性和有序性的问题,再比如我们使用原子类来解决数值的一些问题,再比如使用synchronized关键字,但是synchronized会将并行改为串行,吞吐量大的时候不适合使用,之前我们可以用上面的这些手段。

2024-04-11 11:59:30 676

原创 并发编程——6.线程的安全

要想知道什么是线程安全,就要知道什么是线程不安全多线程下并发同时对共享数据进行读写,造成数据混乱的情况有一份商品,数量为10个,现在有并发的五个线程进行购买操作,首先每个线程读取商品数量即10,然后每个线程执行购买操作即商品数量减一,然后五个线程将操作完成的数据写进数据库即商品数量变为9,这明显是错误的,这就是线程不安全的情况。线程安全就是为了避免线程不安全的情况出现。当多线程并发访问临界资源时,如果破坏其原子性、可见性、有序性,可能会造成数据不一致。

2024-04-09 23:28:12 860

原创 并发编程——5.JMM、可见性和有序性及volatile的底层实现原理

首先,我们来看一下JMM模型。这是一张多核CPU的并发缓存架构图。我们的数据存在主内存RAM中,由于CPU的运算速度非常快,而CPU从主内存中读取数据的速度比较慢(与前者的速度是差几个量级的),所以为了适配这二者的速度差异,我们在CPU中开辟了一块缓存区,空间不大,里面放的是CPU中使用频率较高的数据,CPU从缓存区中读取数据的速度就比从主内存中读取数据的速度要快的多,这样就便于我们CPU的运行。我们的JMM模型就与上面的多核CPU并发缓存架构类似。Java多线程内存模型(简称JMM)跟cpu缓存模型。

2024-04-09 00:41:34 604

原创 并发编程——4.线程池

首先,我们要清楚这样的一个问题,我们为什么要用线程池?某线上商城做秒杀活动,1秒内有10万个请求打来,我们的服务器能在1秒内创建10万个线程吗?显然是不合理的。其次,我们使用线程时会伴随着线程的创建和消耗,当线程数量很多时,这会占用机器的资源,所以这也不合理。为了解决上面提到的问题,所以我们使用了线程池。如果并发的线程数量很多,并且每个线程都是执行一个时间很短的任务就结束了,这样频繁创建线程就会大大降低系统的效率,因为频繁创建线程和销毁线程需要时间。

2024-03-31 00:21:14 790

原创 并发编程——3.细说线程

这篇文章我们来详细的说一下并发编程中的线程及其相关的内容。

2023-12-25 23:55:01 841

原创 并发编程——2.基础概念及其它相关的概述

这篇文章我们讲了线程,进程,协程,也讲了并发,并行,串行。介绍了JUC,上下文切换,时间片等相关概念,都是很基础很简单的内容,这是后面学习并发编程的基础,要熟练。

2023-10-19 22:49:39 327

原创 并发编程——1.java内存图及相关内容

然后main方法调用m1方法,m1方法入栈,m1方法调用m2方法,m2方法入栈,m2方法调用m3方法,m3方法入栈,m3方法中创建person类的实例x1,所以java在堆内存中创建出实例对象,然后m3方法执行实例x1的m2方法,所以m3方法中的实例x1的m2方法入栈,而该实例的m2方法又调用该类的m1方法,所以该实例的m1方法入栈,等m1执行结束后,x1的m1方法出栈,然后x1的m2出栈,然后Test1的m3出栈,然后Test1的m2出栈,然后Test1的m1出栈,然后回到main方法中再依次往下执行。

2023-10-13 22:54:51 826

原创 数据结构与算法——19.红黑树

首先,我们来大致了解一下什么是红黑树红黑树是一种自平衡的二叉查找树,是一种高效的查找树。红黑树具有良好的效率,它可在O(logN) 时间内完成查找、增加、删除等操作。因此,红黑树在业界应用很广泛,比如 Java 中的 TreeMap,JDK 1.8 中的 HashMap。有一说一,这红黑树确实比前面的几种树要难一点,主要是它的属性太多,限制太多。

2023-10-03 18:04:43 1005

原创 数据结构与算法——18.avl树(平衡二叉搜索树)

我们前面讲了二叉搜索树,它是有一个key值,然后比父节点key值大的在左边,小的在右边。这样设计是为了便于查找。但是有一种极端的情况,就是所有的结点都在一边,那查找的时间复杂度和在链表的查找时间复杂度就一样了。那有没有解决方法呢?有!平衡二叉树它且具有以下性质:它是一棵空树或它的左右两个子树的高度差的绝对值不超过1,并且左右两个子树都是一棵平衡二叉树,avl树是平衡二叉树的一种。这个方案很好的解决了二叉查找树退化成链表的问题,把插入,查找,删除的时间复杂度最好情况和最坏情况都维持在O(logN)。

2023-10-02 00:19:51 200

原创 数据结构与算法——17.二叉搜索树

我们前面学到的数据结构,比如:动态数组、链表、队列、栈、堆,这些数据结构存储完数据后,我们要去查找某个数据,它的时间复杂度是O(n),因为这些数据结构的底层实现都是数组或者链表,都是线性的。我们前面有学过二分查找,它的最优时间复杂度为O(lngn)。下面,我们来学习另外一种便于查找的数据结构——二叉搜索树。又被称为二叉查找树。

2023-09-29 00:46:25 174

原创 数据结构与算法——16.二叉树

(Tree)是计算机数据存储的一种结构,因为存储类型和现实生活中的树类似所以被称为树。树的源头被称为根,树其余分叉点被称为节点,而树这种数据结构的起始分叉点被称为根节点。树衍生的尽头就是叶,在树这种数据结构中把叶称之为叶节点。树中每一节点的起源点被称为父节点,衍生出去的点被称为子节点。没有父节点的就是根节点,没有子节点的就是叶节点,而同一父节点的就是兄弟节点高度,是从下往上看,用来表示从根节点到最顶端叶节点所需要遍历的节点数 (包括叶节点)。深度与高度相反,是从上往下看,用来表示。

2023-09-24 01:18:32 248 1

原创 十大排序——2.归并排序

归并排序主要是运用了归并的思想。下面具体的来讲一下归并排序的整个流程和思想。首先,给你一个无序的数组,要求你对它进行归并排序。归并排序首先需要将这个数组拆分成一个个的元素,怎么拆?折半拆。你知道数组的首个元素的索引,知道其最后一个元素的索引,所以你就知道其中间元素的索引,这样就将数组一分二了,然后对前半部分来说,首元素的索引没变,尾元素的索引变为了中间索引,对于后半部分来说,首元素的索引变为中间元素的索引加1,尾元素的索引没变。然后前半部分又分为了两部分,后半部分又分为了两部分,就这样一直递归下去。

2023-09-23 00:31:02 152

原创 十大排序——4.堆排序

堆排序主要就是运用了堆的特性,对于堆,堆元素的下潜操作一顶要熟悉。前面我们讲了堆,现在我们来看一下队排序。

2023-09-22 20:16:57 287

原创 数据结构与算法——15.堆

计算机科学中,堆是一种基于树的数据结构,通常用完全二叉树实现。在大顶堆中,任意节点C与它的父节点P符合P.value>=C.value在大顶堆中,任意节点C与它的父节点P符合P.value0时节点 i 的左子节点为 2i+1,右子节点为 2i+2,当然它们得

2023-09-22 19:54:58 65

原创 数据结构与算法——14.栈

计算机科学中,stack是一种线性的数据结构,只能在其一端添加数据和移除数据。习惯来说,这一端称之为栈顶,另一端不能操作数据的称之为栈底,就如同生活中的一摞书。栈是线性的,只能在一端进行操作,分为栈顶和栈底两部分,包括入栈和出栈操作。栈其实也很简单。就是很简单入栈,出栈等操作。栈是单端口操作的数据结构,入栈和出栈都只在一个端口。栈可以用链表和数组来实现。栈的特点就是先入后出。暂时就这么多吧。

2023-09-21 21:58:02 207 1

原创 数据结构与算法——13.队列的拓展

首先来看一张图,来大致了解一下他们的区别。即两端都可以删除和添加的队列,并且满足队列FIFO的特点。总的来说,队列不难,关键就是抓住链表和数组的特点,掌握链表和数组的相关操作就行。

2023-09-21 21:57:46 106

原创 JVM——11.JVM小结

注意,这是JVM的内存结构,是计算机在内存中划一块空间给JVM,然后JVM对其进行划分的。知道了JVM的内存结构后,你还要知道JVM是怎样分配内存的。java是面向对象的,所以你还要知道对象在内存中的布局,知道jvm是如何访问对象的。之后你要了解类的文件结构,知道类是怎样一步一步的被加载运行的。JVM,即java虚拟机,是java代码运行时的环境。我们从底层往上层来说,分别是硬件部分,操作系统,JVM,jre,JDK,java代码。总的来说,jvm不算难,但是靠近底层,要有扎实的计算机底层知识做铺垫。

2023-09-21 12:55:18 281

原创 JVM——7.类加载与类加载器

前面我们讲了Class文件存储格式的具体细节,在Class文件中描述的各类信息,最终都需要加载到虚拟机中之后才能被运行和使用。而虚拟机如何加载这些Class文件,Class文件中的信息进入到虚拟机后会发生什么变化,这些都是本篇将要讲解的内容。Java虚拟机把描述类的数据从Class文件加载到内存,并对数据进行校验、转换解析和初始化,最 终形成可以被虚拟机直接使用的Java类型,这个过程被称作虚拟机的类加载机制。与那些在编译时需要进行连接的语言不同,

2023-09-21 00:14:21 282

原创 JVM——10.对象的内存布局

前面有一篇文章我们讲了JVM中类的结构,那里讲的是一个java类,被编译成二进制字节码后,它的结构是什么样的,或者说按照jvm的标准,一个.class文件中类的结构是什么样的。而这里我们要讲的是根据类在堆中创建出来的对象,它在堆中是如何布局,即它在堆中的结构是怎样的。一个是微观的,类层次的,一个是宏观的,对象层次的。这个对象的更底层源码,肯定也是按照java类的结构布局的。这篇文章,我们来了解一下对象在内存中的布局是什么样的。对象的内存布局:一个对象的内容可以分为三大部分,如果是数组,还需记录数组的长度。

2023-09-19 00:23:28 204

原创 JVM——9.对象的访问定位方式

创建对象是为了使用该对象,Java程序会通过栈上的reference数据来操作堆上的具体对象。由于reference类型在《Java虚拟机规范》里面只规定了它是一个指向对象的引用,并没有定义这个引用应该通过什么方式去定位、访问到堆中对象的具体位置,所以对象访问方式也是由虚拟机实现而定的,主流的访问方式主要有使用句柄 和 直接指针两种。

2023-09-19 00:12:37 263

原创 JVM——8.内存分配方式

我们前面在GC那篇文章中写了JVM的内存分配策略,讲述了对象优先在Eden区进行分配等等几条策略,而这里又写JVM的内存分配方式,二者有什么区别吗?区别就是:内存分配策略只是说我们应该怎么分配,相当于在分配应该遵循哪些准则;而本篇所写的内存分配方式则是讲对象在内存中具体怎么分配的,相当于是分配算法。相当于一个是战略一个是战术,一个是值方向,一个是教你怎么做。这就是二者的区别。

2023-09-19 00:06:31 429

原创 JVM——6.字节码指令

Java虚拟机的指令由一个字节长度的、代表着某种特定操作含义的数字(称为操作码) 以及跟随其后的零至多个代表此操作所需的参数(称为操作数)构成。由于Java虚拟机采用面向操作数栈而不是面向寄存器的架构,所以大多数指令都不包含操作数,只有一个操作码,指令参数都存放在操作数栈中。字节码指令集可算是一种具有鲜明特点、优势和劣势均很突出的指令集架构,由于限制了Java虚 拟机操作码的长度为一个字节(即0~255),这意味着指令集的操作码总数不能够超过256条;

2023-09-18 23:47:10 315

原创 JVM——5.类文件结构

这篇文章我们来讲一下jvm的类文件结构。

2023-09-18 20:06:08 346

原创 JVM——4.垃圾回收

垃圾回收,简称GC。在前面的文章中,我们讲述了JVM的内存分配,其中有一块区域叫堆,它是用来存放创建出来的对象的。我们一个程序在运行的过程中需要创建许多对象,而我们的JVM的内存空间是有限的,那么就必然会回收一下创建出来了,但是没有用到或者说后面不会再用到的对象,这就是jvm堆的垃圾回收概念。如何判断对象可以回收;垃圾回收算法;JVM的垃圾回收器;内存分配与垃圾回收策略;垃圾回收调优。其中每方面又包含许多小的方面的内容。下面,我们一起来看一下具体的内容。如果说收集算法是内存回收的方法论,

2023-09-18 16:21:54 306

原创 JVM——3.StringTable字符串常量池

这篇文章我们主要讲解了StringTable。下面总结一下。StringTable,即字符串常量池,是存储字符串对象用的,在堆中。一个字符串,在被编译后,是不会创建对象的,仅仅只会在常量池中存储一个符号,只有当运行到这行代码的时候,才会在字符串常量池中创建对象,这就是字符串的懒加载,也是延迟加载。然后在字符串常量池中,也可以避免创建重复的对象。即如果StringTable中已经有了该对象,那么如果再有引用需要创建相同值的对象的时候,该引用会直接指向这个对象,就避免了重复创建。

2023-09-17 00:35:08 79

原创 JVM——2.JVM的内存结构

其实由上一篇文章就可以知道,JVM的内存结构如下图所示:Java虚拟机在执行Java程序的过程中会把它所管理的内存划分为若干个不同的数据区域。这些区域有各自的用途,以及创建和销毁的时间,有的区域随着虚拟机进程的启动而一直存在,有些区域则是依赖用户线程的启动和结束而建立和销毁。根据《Java虚拟机规范》的规定,Java虚拟机所管理的内存的划分如上图所示(这是根据《java虚拟机规范》划分的,在学习高并发的时候,我们可以将上图简化一下,这样便于学习)先进后出。

2023-09-17 00:34:55 168

原创 JVM——1.JVM概述

JVM,全称:Java Virtual Machine ,即Java虚拟机,是Java程序的运行环境,更确切的说,是Java二进制字节码的运行环境。我们的第一个Java的hello world程序是在记事本上编写的,然后用javac命令,将其编译为.class文件,然后再用java命令来运行它。

2023-09-15 10:59:53 493

原创 数据结构与算法——12.队列

计算机科学中,queue是以顺序的方式维护的一组数据集合,在一端添加数据,从另一端移除数据。习惯来说,添加的一端称为尾,移除的一端称为头,就如同生活中的排队买商品。队列是顺序存储的线性数据集合,一头插入,一头删除,先进先出总的来说,队列是很简单的一种数据结构。入队、出队、判断是否为空、判断是否满了等操作,除此之外还有扩容操作。队列的实现主要有用链表实现和用数组实现。其中用链表来实现不用考虑扩容问题,用数组实现要考虑扩容问题。其中,队列常考的就是可扩容的泛型队列的实现。

2023-09-15 09:46:40 48

空空如也

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

TA关注的人

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