自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 Java浅拷贝和深拷贝

在Java中,对象的复制可以分为浅拷贝(Shallow Copy)和深拷贝(Deep Copy)。这两种拷贝方式的主要区别在于对对象内部的引用类型的处理上。

2024-10-17 17:33:33 760

原创 Redis学习笔记:数据结构

Redis对象包含字符串对象、列表对象、哈希对象、集合对象和有序集合对象这五种类型的对象,针对不同的使用场景,为对象设置多种不同的数据结构实现,从而优化对象在不同场景下的使用效率。

2024-10-17 17:32:07 1052

原创 Redis学习笔记:字典

字典,又称为符号表(symbol table)、关联数组(associative array)或映射(map),是一种用于保存键值对(key-value pair)的抽象数据结构。字典在Redis中的应用相当广泛,比如Redis的数据库就是使用字典来作为底层实现的,对数据库的增、删、查、改操作也是构建在对字典的操作之上的。除了用来表示数据库之外,字典还是哈希键的底层实现之一。

2024-10-16 16:31:17 1382

原创 Redis学习笔记:跳跃表

跳跃表(skiplist)是一种有序数据结构。相比于普通的链表访问元素需要一步一步的向后查找,它通过在每个节点中维持多个指向其他节点的指针,从而达到快速访问节点的目的。跳跃表支持平均O(logN)、最坏O(N)复杂度的节点查找。Redis使用跳跃表作为有序集合键的底层实现之一。

2024-10-16 16:29:45 397

原创 Redis学习笔记:整数集合

整数集合(intset)是集合键的底层实现之一,当一个集合只包含整数值元素,并且这个集合的元素数量不多时,Redis就会使用整数集合作为集合键的底层实现。它可以保存类型为int16_t、int32_t或者int64_t的整数值,并且保证集合中不会出现重复元素。

2024-10-15 10:04:17 338

原创 Redis学习笔记:压缩列表

压缩列表(ziplist)本质上就是一个字节数组,是Redis为了节约内存而设计的一种线性数据结构,可以包含多个元素,每个元素可以是一个字节数组或一个整数。压缩列表是列表键和哈希键的底层实现之一。当一个列表键只包含少量列表项,并且每个列表项要么就是小整数值,要么就是长度比较短的字符串,那么Redis就会使用压缩列表来做列表键的底层实现。

2024-10-15 10:01:58 345

原创 Redis学习笔记:链表

链表提供了高效的节点重排能力,以及顺序性的节点访问方式,并且可以通过增删节点来灵活地调整链表的长度。链表在Redis中的应用非常广泛,比如列表键的底层实现之一就是链表。还有发布与订阅、慢查询、监视器等。

2024-10-14 09:30:24 283

原创 Redis学习笔记:简单动态字符串

C语言传统的字符串是使用字符数组表示的,Redis没有直接使用C语言传统的字符串表示,而是构建了一种名为简单动态字符串(simple dynamic string,SDS)的抽象类型,并将SDS作为Redis的默认字符串。

2024-10-14 09:10:22 1296

原创 倒计数器CountDownLatch

CountDownLatch是Java并发编程中一个非常实用的同步工具类,它位于java.util.concurrent包下,是JDK 1.5以后加入的。CountDownLatch通过一个计数器来控制多个线程的执行顺序,允许一个或多个线程等待其他线程完成操作后再继续执行。

2024-09-26 12:24:48 927

原创 Java线程池详解

本文详细探讨了线程池在并发编程领域的应用,介绍了ThreadPoolExecutor的核心组件、工作原理,线程池的构造、拒绝策略、任务队列、线程池的监控、线程池工厂等相关内容,并讨论了线程池对系统性能和线程管理的优势。

2024-09-26 09:18:08 1918

原创 信号量Semaphore

Semaphore(信号量)是一种用于控制对共享资源的访问数量的同步机制。它维护了一个计数器,该计数器表示可用资源的数量。当线程需要访问某个资源时,它会尝试从信号量中获取一个许可(permit)。如果信号量的计数器大于0,则允许线程继续执行,并将计数器减1。如果计数器为0,则线程将被阻塞,直到其他线程释放许可(即将计数器加1)为止。信号量通常用于限制可以同时访问某个特定资源(如数据库连接、文件句柄或线程池中的线程)的线程数量。

2024-09-25 10:24:41 405

原创 ReadWriteLock读写锁

ReadWriteLock是Java并发包中的一个接口,它定义了两种锁:读锁(Read Lock)和写锁(Write Lock),真正的实现类是ReentrantReadWriteLock。读锁允许多个线程同时读取共享资源,而写锁则要求独占资源,即当一个线程持有写锁时,其他线程不能获取读锁或写锁。

2024-09-25 09:03:35 504

原创 BigDecimal的使用

BigDecimal主要用于对超过16位有效位的数进行精确的运算。在商业计算、金融计算等需要高精度数值处理的场景中,BigDecimal显得尤为重要。但是BigDecimal是一个对象,不能直接使用传统的+、-、*、/等算术运算符进行数学运算,而必须调用其相对应的方法。本文是对BigDecimal的简单介绍。

2024-09-24 16:28:10 1349

原创 重入锁ReentrantLock详解

ReentrantLock是Java并发包中提供的一种功能强大、使用灵活的可重入锁。它支持公平锁和非公平锁、显式锁控制、尝试非阻塞地获取锁、支持超时尝试获取锁、支持中断以及条件变量等特性。

2024-09-24 08:41:16 1458

原创 ConcurrentHashMap的使用

ConcurrentHashMap是Java 并发包(java.util.concurrent)中提供的一个线程安全且高效的哈希表实现,用于在并发环境中存储键值对,它允许在多个线程之间安全地共享和修改数据,使得开发者无需显式同步代码就能在并发环境下安全使用。与同样是线程安全的哈希表HashTable相比,ConcurrentHashMap具有更高的并发效率。总之ConcurrentHashMap是一个高性能的Java并发容器,是多线程下常用的map容器,其使用方法基本可以参考HashMap。

2024-09-23 15:04:14 669

原创 Java线程的创建与使用

线程是‌操作系统能够进行运算调度的最小单位,是进程中的实际运作单位‌。一个进程可以包含多个线程,每个线程是进程中一个单一顺序的控制流,并行执行不同的任务。

2024-09-23 08:56:39 1355

原创 Java集合框架

集合是Java中提供的一种容器,可以用来存储多个数据,根据不同存储方式形成的体系结构,就叫做集合框架体系。Java集合是一种特别有用的工具类,可以用于存储数量不等的多个对象,并可以实现常用的数据结构,如栈、队列、链表、哈希表等。

2024-09-21 15:36:39 602

原创 SQL中的WITH AS语法

SQL中的WITH AS语法是一种强大的工具,WITH AS可以简化复杂查询的编写,提高查询的可读性和维护性,WITH AS 语句允许用户定义一个临时的结果集,这个结果集被称为公共表表达式(Common Table Expression,简称CTE)。这个临时的结果集在查询执行期间存在,并且可以在同一个查询中被多次引用,就像一个临时表一样。这种语法的使用可以使得复杂的查询变得简单,同时也可以提高查询效率。

2024-09-21 14:20:34 3109

原创 Java优先级队列PriorityQueue

优先级队列PriorityQueue是队列接口Queue的一种实现,能够以O(logn)的时间复杂度实现元素的插入和删除。PriorityQueue不是一个标准的队列,因为它保存元素的顺序不是按照元素入队的顺序,而一个是按元素的大小重新排序的,这已经违反了队列先进先出(FIFO)的基本规则。PriorityQueue是一种具有特殊用途的数据结构,它总能保持队首元素是队列中最大的,这个特性使得PriorityQueue在需要基于优先级处理任务的场景下非常有用,比如在调度算法、事件驱动编程、优先级排序等应用中。

2024-09-20 15:17:51 1090

原创 数据结构:堆

堆(heap)是一类特殊的数据结构。堆通常是一个可以被看做一棵树的数组对象。常见的堆为二叉堆,因为其逻辑上由一颗完全二叉树组成,又称完全二叉堆。其维护的堆序性,总能保持堆顶元素是最大(或最小)元素。二叉堆是最高效的优先队列实现方式。

2024-09-20 14:05:56 1493

原创 Java双端队列ArrayDeque

双端队列ArrayDeque是Java集合框架中的一种数据结构,它实现了Deque接口,因此支持在两端进行添加和移除元素。通过名称也能看出,ArrayDeque是基于数组实现的,ArrayDeque内部使用一个可动态调整大小的环形数组来存储元素。当ArrayDeque中的元素数量超过当前数组容量时,会自动进行扩容,以确保有足够的空间存放新元素,但Java没有实现自动缩容。

2024-09-19 15:32:26 699

原创 遍历集合时删除元素

我们在遍历集合的同时往里面插入元素或删除元素,可能有潜在的风险,若处理不当则可能抛出异常,或者得到一个错误的结果,当使用forEach或增强for循环遍历时,集合内部有Fail-Fast机制用于检测这种错误的做法。

2024-09-19 09:25:12 453

原创 【Java集合】TreeMap

TreeMap实现了SortedMap接口,能够把它保存的记录根据键排序,默认是按键值的升序排序, 也可以指定排序的比较器,当用Iterator遍历TreeMap时,得到的记录是排过序的。 如果需要一个按键排序的map,建议使用TreeMap。 在使用 TreeMap 时,key 必须实现 Comparable 接口或者在构造 TreeMap 传入自定义的 Comparator,否则会抛java.lang.ClassCastException 类型的异常。

2024-09-18 14:32:26 749

原创 【Java集合】HashSet

HashSet实现了Set接口,该集合只能保存不重复的元素,元素保存的顺序并不按照存入时的顺序,HashSet经常用于元素去重,或者是检查数据集中是否有重复元素。

2024-09-18 12:26:08 465

原创 【Java集合】HashSet

HashSet实现了Set接口,该集合只能保存不重复的元素,元素保存的顺序并不按照存入时的顺序,HashSet经常用于元素去重,或者是检查数据集中是否有重复元素。

2024-09-17 11:32:24 688

原创 【Java集合】LinkedList

LinkedList是用链表结构存储数据的,很适合数据的动态插入和删除,随机访问速度比较慢。另外,他还提供了 List 接口中没有定义的方法,专门用于操作表头和表尾元素,可以当作堆栈、队列和双向队列使用。

2024-09-17 09:46:01 633

原创 【Java集合】ArrayList

ArrayList是最常用的List实现类,内部是通过数组实现的,它允许对元素进行快速随机访问。直接使用数组的缺点是数组一旦初始化就无法改变大小,而很多时候我们创建数组时并不知道将要往里面存多少数据,而动态数组就很好的解决了这个问题。

2024-09-16 09:38:48 539

原创 【Java集合】HashMap

哈希表又叫散列表,或者映射、字典都是指哈希表,哈希表是通过关键码映射到数组的某个位置来访问的数据结构,实现这个映射的函数就是哈希函数,哈希表结合了数组和链表的优点,查找和插入操作的时间复杂度都是O(1)。

2024-09-16 09:24:17 1473

原创 什么是 CAS

CAS(Compare And Swap/Set)比较并交换,CAS 算法的过程是这样:它包含 3 个参数V,E,N。V 表示要更新的变量(内存值),E 表示预期值(旧的),N 表示新值。当且仅当 V 值等于 E 值时,才会将 V 的值设为 N,如果 V 值和 E 值不同,则说明已经有其他线程做了更新,则当 前线程什么都不做。最后,CAS 返回当前 V 的真实值。

2024-03-17 23:13:14 425

原创 JAVA 四中引用类型

弱引用需要用WeakReference类来实现,它比软引用的生存期更短,对于只有弱引用的对象来说,只要垃圾回收机制一运行,不管JVM的内存空间是否足够,总会回收该对象占用的内存。软引用需要用SoftReference类来实现,对于只有软引用的对象来说,当系统内存足够时它不会被回收,当系统内存空间不足时它会被回收。:在Java中最常见的就是强引用,把一个对象赋给一个引用变量,这个引用变量就是一个强引用。当一个对象被强引用变量引用时,它处于可达状态,它是不会被垃圾回收机制回收的,即。

2024-03-13 19:36:30 419

原创 自定义注解实现excel导出

将数据导出为excel文件是项目中经常遇到的需求,用EasyExcel实现导出虽然很简单,但每次都要写一堆重复的代码,如设置response对象,新建ExcelWriter、WriteSheet,writer.finish()等,感觉很难受,于是就想定义一个注解快速实现导出功能。

2024-03-13 14:29:08 903

原创 easyexcel 导出报“Can not close IO”异常

总结:Can not close IO异常的原因有很多,如果碰到本地正常,生产报错的情况可以看看生产上是不是有网关之类的具有超时机制的东西。

2024-03-11 14:34:20 5410

原创 mybatis in中超过1000个值解决办法(超简单)

众所周知sql中条件in的值是不能超过1000个的,而mybatis可以使用动态sql拼接的方式绕开这个限制,下面介绍一个超简单的例子。

2024-03-11 14:21:56 3860

原创 Java线程的创建方式

【代码】Java线程的创建方式。

2023-12-27 22:42:35 427

原创 java.lang.NullPointerException隐藏的陷阱

NullPointerException是Java开发中最常见的异常,它产生的原因很简单,即:当我们尝试访问一个null对象的方法或属性时就会抛出空指针异常,一个对象可能来自于用户输入的值,其它方法或接口的返回值、数据库查询的数据等等,这些不确定的对象中很可能就藏着一个null。

2023-12-27 17:46:40 511

原创 java.lang.StackOverflowError异常

java.lang.StackOverflowError Java栈溢出异常:原因:java方法栈的内存耗尽了就会抛出StackOverflowError,多半是程序里有无限递归调用导致的。

2023-12-14 09:45:25 515

原创 Java快速排序

​快速排序(Quicksort)是应用最为广泛的排序算法,与归并排序一样,快速排序也是分治思想的典型例子,它的基本思想是:在序列中任选一个切分元素a,利用a将序列分为两部分,使a左边的元素都不大于a,a右边的元素都不小于a,再采用递归的方式分别对左右两部分重复上述操作,当所有的子序列的长度都缩小为1时排序就完成了。​

2023-12-13 19:37:43 988 1

原创 Java归并排序

归并排序(Merge Sort)是应用分治思想的一个典型例子。把一个待排序序列拆分为两个子序列,分别对两个子序列排序,子序列排序时也采用相同的方法,直至拆分后的两个子序列都是有序的,即长度为1的序列天然有序,这时停止拆分,将两个有序的子序列归并为一个更大的有序序列,与之前拆分时的路径相反,不断的归并有序子序列,最终归并为一个序列。这种将两个有序序列归并为一个有序序列的操作称为二路归并。

2023-12-11 10:45:47 3763 1

原创 Java希尔排序

希尔排序(Shell Sort)是插入排序的一种改进版本,它的思想是把序列下标按一个增量进行分组,分别对每组使用直接插入排序算法排序,而后减小增量的值,再次进行分组和使用直接插入排序算法排序,沿用这个套路直至增量减小为1,这时整个序列被分为一组,算法变成了直接插入排序。时间复杂度O(n^1.5)。

2023-12-07 09:05:35 1187

原创 Java插入排序

插入排序(Insertion Sort),插入排序的基本思想是从未排序的序列中取一个元素,插入已排序序列的合适位置,使其继续保持有序,重复这个动作直至未排序的序列为空。

2023-12-01 18:56:19 429 1

空空如也

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

TA关注的人

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