自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

学习愚公的博客

喜欢博主的关注一下,不喜欢的再看看。٩( •̀㉨•́ )و get!

  • 博客(37)
  • 收藏
  • 关注

原创 Java抽象类和接口的区别

【代码】Java抽象类和接口的区别。

2024-01-29 11:36:17 371

原创 Java强软弱虚四大引用

在Java中,弱引用(WeakReference)是一种特殊的引用类型,它代表的对象可被垃圾回收器在任何时候回收,即使该对象仍然有弱引用存在。如果一个对象仅持有虚引用,那么它就和没有任何引用一样,在任何时候都可能被垃圾回收器回收,它不能单独使用也不能通过它访问对象,虚引用必须和引用队列(ReferenceQueue)联合使用。(除非等于null)弱引用的典型使用场景是在缓存或者映射关系中,当主要持有对象的强引用消失后,即使还有其他地方通过弱引用关联到这个对象,也依然会被垃圾回收器视为无用对象并进行回收。

2024-01-20 23:53:43 985

原创 【设计并实现一个满足 LRU (最近最少使用) 缓存约束的数据结构】

LRU是Least Recently Used的缩写,意为最近最少使用。它是一种缓存淘汰策略,用于在缓存满时确定要被替换的数据块。LRU算法认为,最近被访问的数据在将来被访问的概率更高,因此它会优先淘汰最近最少被使用的数据块,以给新的数据块腾出空间。先来3个元素进入该队列此时来了新的元素,因为此时队列中每个元素的使用的次数都相同(都是1),所以会按照LFU的策略淘汰(即淘汰掉最老的那个)此时又来了新的元素,而且是队列是已经存在的,就会将该元素调整为最新的位置。

2024-01-20 21:51:22 610

原创 【生产者消费者模型的 Java 实现】

题目:一个初始值为零的变量,多个线程对其交替操作,分别加1减1线程操作资源类判断,干活,通知防止虚假唤醒机制,即:多线程的判断需要用 while,不能使用 if(jdk 要求的,保证线程不会出错)

2024-01-12 20:48:43 429

原创 【JVM的相关参数和调优】

在混合模式下,虚拟机会根据代码的热度来判断是否将其编译成机器代码。因此,混合模式可以充分利用即时编译的性能优势,同时又能适应代码的动态性。这种模式下,Java程序的代码会被即时编译器翻译成机器指令,并保存下来以备下次执行使用。这样,在后续执行时,程序的执行速度会比解释执行模式下更快,因为代码已经被编译成机器代码。在解释执行模式下,Java程序的代码将逐行被解释器翻译成机器指令并执行。这种模式通常会导致程序执行速度较慢,但它可以在不同的平台上运行代码,因为不需要事先将代码编译成机器代码。

2024-01-12 20:12:40 1452

原创 【JUC 阻塞队列中常用的四组方法】

普通人,脾气温和,讲道理,不合适就返回一个特殊值。(施主如果听不懂大乘佛法,贫僧也是略懂一些拳脚)富二代,脾气暴躁,稍微不合心意,就会抛出异常(你不说,我都不知道我这么🐂逼呢)。老实人,一直等待,直到她回心转意(燕子,没有你我怎么活啊~~~)土豪,就是任性(给你机会你也不中用啊)相当于一个普通的队列。

2024-01-03 20:04:39 381

原创 【JUC的四大同步辅助类】

CountDownLatch 和 CyclicBarrier 在最初就固定了线程的数量,而且中途不可改变,当完成指定的任务后,就不能再次使用,Phaser 就解决了该问题。:考场中有多个同学考试,每个同学写完试卷后,将试卷交给老师即可离开,老师需要收齐所有人的试卷后才能离开。Semaphore 主要用于两个目的,一个是用于多个共享资源的互斥使用,另一个用于并发线程数的控制。

2024-01-03 19:13:49 459

原创 【Java 中锁的种类】

monitorexit指令:将锁计数器减1,,当锁计数器为0,释放锁。

2023-12-27 22:35:20 1078

原创 【Java集合类不安全示例】

使用线程安全的容器,如:ConcurrentHashMap。多线程并发争抢修改导致。多线程并发争抢修改导致。多线程并发争抢修改导致。

2023-12-27 20:57:59 1988

原创 【Executors和ThreadPoolExecutor】

"Executors"和"ThreadPoolExecutor"都是Java中的并发工具类,都是用来创建和管理线程池的。"Executors"是一个工厂类,它提供了创建线程池的静态方法,包括newFixedThreadPool、newCachedThreadPool、newSingleThreadExecutor、newScheduledThreadPool等,这些方法可以创建不同类型的线程池。

2023-12-26 15:08:51 1043

原创 【Spring的事务的隔离级别和事物的传播行为】

SERIALIZABLE:序列化,最高的隔离级别,完全服从ACID的隔离级别。所有的事务依次逐个执行,这样事务之间就完全不可能产生干扰,也就是说,该级别可以防止脏读、不可重复读以及幻读。但是这将严重影响程序的性能。通常情况下也不会用到该级别。

2023-12-26 14:00:02 865

原创 【Java 四大函数式接口和自定义函数式接口】

FunctionalInterface// 仅需在接口上加上该注解// 该方法是 public abstract// 内部只能有一个抽象方法class T{// }// };我们只需要关心结果,不关心过程,以及谁来实现。每个调用者都可以编写自己的实现过程,来达到自己的目的。

2023-12-24 22:23:05 348

原创 【AVL自平衡的二叉搜索树模板——面试高频问题之一】

AVL是一种自平衡的二叉搜索树,它以其发明者Adelson-Velsky和Landis的名字命名。AVL树是一种高度平衡的二叉搜索树,它的特点是任意节点的左子树和右子树的高度差不超过1。AVL树的平衡性是通过在插入或删除节点时进行旋转操作来维持的。旋转操作可以分为左旋和右旋两种类型,通过调整节点的位置来保持树的平衡性。当插入或删除节点导致树的平衡被破坏时,AVL树会自动进行旋转操作,使得树重新达到平衡状态。由于AVL树的平衡性,它在最坏情况下的搜索、插入和删除操作的时间复杂度都是O(log n)

2023-08-15 14:14:45 99

原创 【十大常用排序算法模板】

以下是模板的链接🔗。

2023-08-14 13:13:48 83

原创 【快速排序模板(三分快排)】

一般的快速排序,分成两部分,但是对于数据量过大过多的测试用例,会出现超时,所以笔者提供了另一种快速排序的形式,三分快排(本质都是相通的,都是快排思想)三分快速排序(Quick Sort)是一种常用的排序算法,它基于分治的思想,通过将待排序序列分成三个子序列,分别对子序列进行排序,最终将整个序列排序。选择一个基准元素(pivot),可以是待排序序列中的任意一个元素(根据算法导论的建议,我们采用随机数组中的元素)。将待排序序列分成三个子序列,一个子序列中的元素都小于基准元素,一个子序列中的元素都。

2023-08-13 20:37:25 121

原创 【归并排序模板】

归并排序(Merge Sort)是一种基于分治思想的排序算法,它将待排序序列分成两个子序列,分别对子序列进行排序,然后将两个有序的子序列合并成一个有序的序列。将待排序序列分成两个子序列,直到每个子序列只有一个元素。对每个子序列进行排序,可以使用递归调用归并排序。将两个有序的子序列合并成一个有序的序列,得到最终的排序结果。归并排序的时间复杂度为O(nlogn),其中n是待排序序列的长度。归并排序是一种稳定的排序算法,它的空间复杂度为O(n),需要额外的空间来存储临时的子序列。

2023-08-13 20:25:57 59

原创 【选择排序模板】

选择排序(Selection Sort)是一种简单直观的排序算法,它每次从待排序序列中选择最小(或最大)的元素,放到已排序序列的末尾(或开头),直到所有元素都被排序。在待排序序列中,找到最小(或最大)的元素。将最小(或最大)的元素与待排序序列的第一个元素交换位置,将该元素视为已排序部分的末尾(或开头)。在剩余的待排序序列中,重复步骤1和步骤2,直到所有元素都被排序。选择排序的时间复杂度为O(n^2),其中n是待排序序列的长度。

2023-08-13 20:18:02 95

原创 【桶排序模板】

桶排序(Bucket Sort)是一种排序算法,它将待排序的元素分到不同的桶中,对每个桶中的元素进行排序,然后按照桶的顺序将元素依次取出,得到有序的结果。创建一个固定数量的桶,并确定每个桶的范围。桶的数量可以根据待排序序列的特点进行选择(不易过大,也不宜过小),范围可以根据待排序序列的最大值和最小值确定。遍历待排序序列,将每个元素放入对应的桶中。对每个桶中的元素进行排序。可以使用其他排序算法,如插入排序、快速排序等。按照桶的顺序,依次将每个桶中的元素取出,得到有序的结果。

2023-08-13 20:14:05 96 1

原创 【计数排序模板】

计数排序(Counting Sort)是一种线性时间复杂度的排序算法,适用于待排序序列的取值范围较小的情况。计数排序的核心思想是统计每个元素出现的次数,然后根据统计结果将元素放回到正确的位置上。统计每个元素出现的次数:遍历待排序序列,统计每个元素出现的次数,并存储在一个辅助数组中。计算每个元素的累计次数:对于辅助数组,计算每个元素的累计次数,即前面所有元素出现的总次数。

2023-08-13 20:05:57 63 1

原创 【插入排序模板】

插入排序(Insertion Sort)是一种简单直观的排序算法,它将待排序的序列分为已排序和未排序两部分,每次从未排序部分取出一个元素,插入到已排序部分的正确位置,直到所有元素都被插入到正确的位置为止。从第二个元素开始,将其视为已排序部分。取出下一个元素,在已排序部分从后往前进行比较。如果已排序部分的元素大于取出的元素,则将该元素后移一位,继续比较前一个元素。重复步骤3,直到找到已排序部分的元素小于或等于取出的元素的位置。将取出的元素插入到找到的位置。

2023-08-13 19:59:36 75 1

原创 【堆排序模板】

堆排序(Heap Sort)是一种基于二叉堆数据结构的排序算法。它利用堆的性质进行排序,具体来说是利用最大堆(或最小堆)来进行升序(或降序)排序。构建最大堆(或最小堆):将待排序的序列构建成一个最大堆(或最小堆)。最大堆的性质是父节点的值大于等于其子节点的值,最小堆的性质是父节点的值小于等于其子节点的值。交换堆顶元素和最后一个元素:将堆顶元素(即最大值或最小值)与堆中最后一个元素交换位置。重新调整堆:将剩余的元素重新调整为最大堆(或最小堆)。重复步骤2和步骤3,直到堆中的元素只剩下一个。

2023-08-13 19:55:38 116 1

原创 【冒泡排序模板】

冒泡排序(Bubble Sort)是一种简单的排序算法,它重复地比较相邻的两个元素,并交换它们的位置,直到整个序列排序完成。从序列的第一个元素开始,依次比较相邻的两个元素。如果前一个元素大于后一个元素,则交换它们的位置。继续向后比较相邻的元素,重复步骤2,直到最后一个元素。一轮比较完成后,最大的元素会被交换到序列的最后一个位置。重复步骤1至步骤4,每次比较的元素数量减少一个,直到所有元素都排序完成。冒泡排序的核心思想是通过相邻元素的比较和交换,将最大的元素逐渐“冒泡”到序列的末尾。

2023-08-13 19:49:36 151 1

原创 【希尔排序模板】

减少插入排序的比较和交换次数。希尔排序的时间复杂度取决于增量序列的选择,最坏情况下为O(n^2),但在平均情况下可以达到O(n log n)的性能。

2023-08-13 19:45:06 57 1

原创 【基数排序模板】

基数排序(Radix Sort)是一种非比较排序算法,它根据元素的每个位上的值进行排序。基数排序的核心思想是将待排序的元素按照低位到高位的顺序依次进行排序,直到最高位排序完成为止。首先,确定待排序元素的最大值和最小值,然后将负数处理为非负数,以确定需要进行多少轮排序。从最低位开始,按照每个位上的值,将待排序元素分配到对应的桶中。按照桶的顺序,将元素依次取出,形成新的待排序序列。重复步骤2和步骤3,直到最高位排序完成。最后,得到的序列就是有序的结果。基数排序的时间复杂度为。

2023-08-13 18:41:44 64 1

原创 【Java中的阻塞队列(BlockingDeque)的介绍和使用——以及如何模拟实现一个阻塞队列】

什么是阻塞队列?阻塞队列是一种特殊类型的队列,它在插入或删除元素时会发生状态阻塞。当队列满时,尝试插入新元素的线程将等待直到队列中有空间可用。同样地,当队列为空时,尝试删除元素的线程将等待,直到队列中有可用元素。也就是说明,它是一个队列,具有先入先出的性质,但是不同于普通的队列,队列中若没有元素,此时如果出队列,也不会报错,而是会一直阻塞等待入队列执行,然后才出队列。阻塞队列是多线程编程中非常重要的一种数据结构,它可以很好地协调不同线程之间的工作,防止数据竞争和资源浪费。Java中的。

2023-08-10 21:28:38 493 1

原创 【单例模式-饿汉模式和懒汉模式】

什么是设计模式?设计模式是面向对象编程中的一种解决问题的方案或方法,它提供了一种在特定情况下进行软件设计的最佳实践,能够提高软件在可维护性、可重用性、可扩展性、可读性和可靠性等方面的质量和效率。设计模式是经过实践验证的,被广泛应用的在面向对象编程中的解决方案。创建型模式:用于对象的创建,包括单例模式工厂模式、抽象工厂模式、建造者模式和原型模式等。结构型模式:用于对象和类之间的组织关系,包括适配器模式、装饰器模式、代理模式、外观模式、桥接模式、组合模式和享元模式等。

2023-07-31 23:00:49 308

原创 【六大锁策略-各种锁的对比-Java中的Synchronized锁和ReentrantLock锁的特点分析-以及加锁的合适时机】

轻量级锁适用于竞争不激烈的情况,而重量级锁适用于竞争激烈的情况。在实际开发中,我们需要根据具体场景选择合适的锁机制,以达到最佳的性能

2023-07-28 23:10:49 516

原创 【多线程带来的的风险-线程安全的问题的简单实例-线程不安全的原因】

什么是线程安全?简单来说,如果多线程环境下代码运行的结果是符合我们预期的,即在单线程环境应该的结果,则说这个程序是线程安全的。但是在多线程的环境下,我们很难预知线程的调度方法,这就像A和B两个施工队,同时在山的两头开始挖隧道,理想状态下我们希望他们能够在中间相遇,但是也极有可能他们没有相遇,各自挖了一条隧道。提示:以下是本篇文章正文内容,下面案例可供参考。

2023-07-26 22:37:24 171

原创 【Java中的Thread线程的简单方法介绍和使用详细分析】

提示:若对Thread没有基本的了解,可以先阅读以下文章,同时部分的方法已经在如下两篇文章中介绍过了,本文不再重复介绍!!【Java中Tread和Runnable创建新的线程的使用方法】【Java中的Thread线程的七种属性的使用和分析】提示:以下是本篇文章正文内容,下面案例可供参考除了以上常用的方法,还有许多的方法在前言中的文章已经详细介绍和使用,如若该文中没有找到你需要的,请跳转到前言的链接。

2023-07-25 22:46:00 249

原创 【Java中的Thread线程的七种属性的使用和分析】

后台线程指的是在程序运行期间在后台执行的线程,它不会影响到程序的前台运行。换言之,后台线程不会阻止程序的终止,即使应用程序关闭或主线程终止,后台线程也会继续运行。前台线程指的是在程序运行期间在前台执行的线程,它会占用程序的主要资源,如果前台线程阻塞,整个程序都会被阻塞。

2023-07-20 22:42:41 173

原创 【Java中Tread和Runnable创建新的线程的使用方法】

什么是线程?线程(Thread)是操作系统能够进行运算调度的最小单位,它被包含在进程中,是进程中的实际执行单位。与进程不同的是,同一进程中的线程共享相同的内存空间,可以访问进程中的共享数据,线程的切换开销比进程小,因此线程通常比进程更高效。线程也被称为轻量级进程。线程可以并发执行,一个进程中可以包含多个并发执行的线程,每个线程可以独立地执行不同的任务。在多核处理器的情况下,多个线程可以被分配到不同的核心上同时执行,从而提高处理器的利用率和程序执行的效率。创建线程的不同方式。

2023-07-20 17:25:55 98

原创 选择排序(selectSort)

每一次从待排序的数据元素中选出最小(或最大)的一个元素,存放在序列的起始位置,直到全部待排序的数据元素排完

2023-01-16 21:22:28 149

原创 希尔排序(shellSort)

希尔排序是希尔(Donald Shell)于1959年提出的一种排序算法。希尔排序也是一种插入排序,它是简单插入排序经过改进之后的一个更高效的版本,也称为缩小增量排序。让我们先看简单插入排序存在的一个问题一共进行了6次。可以看出,每个数都移动了一次,效率非常的慢!!结论: 当需要插入的数是较小的数时,后移的次数明显增多,对效率有影响。

2023-01-16 20:57:06 61

原创 (直接)插入排序

元素集合越接近有序,直接插入排序算法的时间效率越高时间复杂度:O(N^2)空间复杂度:O(1),它是一种稳定的排序算法稳定性:稳定。

2023-01-16 19:40:49 45

原创 【Java中的equal方法_解析与==的区别_如何重写(override)该方法】

== 实际上是一个关系运算符==两侧是基本数据类型时,判断值是否相等。==两侧是引用数据类型时,判断地址是否相等equals方法的使用简单介绍equals 是Object类中的方法,只能判断引用类型。在jdk1.8的文档中的介绍(可忽略不看)jdk的源码可以看出,它也仅仅是运用 == 比较两者是否指向同一个地址,也就是说若该类中没有重写equals,equals就等同于 ==让我们先看看jdk中,对Integer,String,Double 中对equals的重写IntegerDoubleSt

2022-12-08 13:02:30 133

原创 【Java中的构造器(构造方法)_基本语法_详细解读】

基本特征:修饰符 方法名(形参列表){方法体;}首先,让我们来看下面的一段代码那么此时,我们就有了一种需求前面我们在创建人类的对象时,是先把一个对象创建好后,再给他的年龄和姓名属性赋值,如果现在我要求,在创建人类的对象时,就直接指定这个对象的年龄和姓名,该怎么做?这时就可以使用构造方法。输出结果:可以看出来,构造方法被调用了两次我们将上述Person类中的构造的方法,单独拉出来分析分析结果:既然构造方法与普通的方法如此类似,那它是否拥有类似的性质呢?重载比如:我们可以再给Person类定义一个构造

2022-12-05 04:00:00 4617 1

原创 【冒泡循环的两种形式】

【代码】【冒泡循环的两种形式】

2022-10-20 22:54:16 977 8

空空如也

空空如也

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

TA关注的人

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