自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 Java集合框架-Collection-queue

从名字可以看出ArrayDeque底层通过数组实现,为了满足可以同时在数组两端插入或删除元素的需求,该数组还必须是循环的,即循环数组(circular array),也就是说数组的任何一点都可能被看作起点或者终点。ArrayDeque是非线程安全的(not thread-safe),当多个线程同时使用的时候,需要程序员手动同步;另外,该容器不允许放入null元素。上图中我们看到,head指向首端第一个有效元素,tail指向尾端第一个可以插入元素的空位。因为是循环数组,所以head不一定总等于0,tail。

2024-04-28 22:06:09 890

原创 Java集合框架-Collection-Set-HashSet&TreeSet&LinkedHashSet简介

HashSet 是 Java 中的一个集合类,它实现了 Set 接口,用于存储不重复的元素。它基于HashMap实现(对HashMap的一个简单封装),底层数据结构是HashTable,并继承了 HashMap 的一些方法。需要注意的是,HashSet 中的元素是无序的,并且不允许重复。TreeSet 也是 Java 中的一个集合类,它同样实现了 Set 接口,并继承了SortedSet接口。TreeSet 基于TreeMap实现,底层数据结构是红黑树,可以对元素进行排序。

2024-04-26 22:19:59 802 3

原创 Java集合框架-Collection-List-vector(遗留类)

Vector类是单列集合List接口的一个实现类。与ArrayList类似,Vector也实现了一个可以动态修改的数组,两者最本质的区别在于——Vector类是支持线程同步的,因此它线程安全,支持多线程;而ArrayList是线程不同步的,线程不安全。Vector底层也是由一个Object类型的数组来实现的 (注意Vector维护的elementData数组没有用transient关键字修饰)

2024-04-25 18:34:47 623 2

原创 Redis底层数据结构之ZSkipList

ZSkipList是一种有序数据结构,支持平均 O(logN) 复杂度的查找、插入和删除操作。优点:高效的范围查询。使用场景: 存储有序集合数据,例如 Sorted Set 类型。

2024-04-24 17:39:49 1671

原创 Redis底层数据结构之IntSet

IntSet是一个存储整数值的集合,内部使用有序、无重复的数组保存数据。优点:节省内存空间。高效的查找、插入和删除操作。使用场景: 在集合键只包含整数值且数量较少时使用。

2024-04-24 16:30:55 802

原创 Redis底层数据结构之Dict

Redis 的 Dict 是一个高效的键值对映射数据结构,采用双哈希表实现以支持无锁的渐进式 Rehash,确保扩容或缩容时的高效性能。它通过哈希表节点以链表形式解决哈希冲突,允许快速的查找、插入和删除操作,是实现 Redis 各种数据类型和高级功能的基础架构之一。

2024-04-23 23:00:39 1790

原创 Redis底层数据结构之quicklist

QuickList是由多个 ziplist 组成的双向链表,每个 ziplist 存储一定数量的元素。优点:结合了 ziplist 和双向链表的优点,既节省空间,又提升了修改操作的性能。使用场景: 在列表键元素较多或包含较大元素时使用。ziplist补充(ziplist缺点-链式扩容&级联更新)当一个entry被插入的时候,我们需要设置下一个entry中的prevlen字段为新插入entry的长度。

2024-04-22 11:59:51 780

原创 redis底层数据结构之ziplist

一种连续内存空间存储的顺序数据结构,每个元素可以是字符串或整数。优点:节省内存空间。适用于存储小规模的列表或有序集合。缺点:修改操作可能引发连锁更新,影响性能。使用场景: 在列表键元素较少或元素都是小整数时使用。

2024-04-21 19:45:44 920 1

原创 Redis底层数据结构之SDS

Redis 中的 SDS(Simple Dynamic String,简单动态字符串)是 Redis 用于存储字符串值的底层实现,是对 C 语言传统字符串(以 null 结尾的字符数组)的改良,内部结构类似于 C 语言的字符数组,但额外存储了字符串长度和分配空间大小,避免了 C 字符串的缺陷。SDS用于解决 C 字符串的一些限制和安全性问题, 具有动态扩容的特点. 其实现位于src/sds.h与src/sds.c中。

2024-04-21 19:38:06 790 2

原创 Java多线程&并发八股问题总结

线程安全是多线程编程中的一个概念,指某个方法、类、组件或程序能够在多线程环境下被多个线程安全地调用,而不会导致数据被损坏或出现不一致的状态。以下是线程安全特性的一些主要方面:数据一致性:确保共享数据在并发修改的情况下保持正确的状态。原子性:操作要么完全执行,要么完全不执行,不能出现执行了一半的情况。可见性:一个线程对共享数据的修改能够被其他线程及时看到。有序性:确保程序执行的有序性,避免指令重排导致的问题。例如,一个线程安全的计数器类,能够保证在多个线程对其进行递增操作时,得到正确的计数。

2024-04-20 19:56:07 651

原创 JVM垃圾收集机制

因为方法区主要存放永久代对象,而永久代对象的回收率比新生代低很多,因此在方法区上进行回收性价比不高。两个对象出现循环引用的情况下,此时引用计数器永远不为 0,导致无法对它们进行回收。针对 HotSpot VM 的实现,它里面的 GC 按照回收区域又分为两大类:部分收集(Partial GC),整堆收集(Full GC)现在的商业虚拟机采用分代收集算法,它根据对象存活周期将内存划分为几块,不同块采用适当的收集算法。通过 GC Roots 作为起始点进行搜索,能够到达到的对象都是存活的,不可达的对象可被回收。

2024-04-19 12:57:01 1521

原创 Java多线程&并发

线程池的工作原理是预先创建一些线程放入一个池子(也就是队列)中,这些线程都是处于休眠状态,也就是空闲状态。包提供了一组原子操作类,用于在多线程环境下对变量进行原子操作,保证了操作的线程安全性,并且提供了一种高效、简单的方式来实现线程安全的变量更新操作。关键字用于确保多个线程之间对变量的可见性,禁止指令重排序,适用于一些状态标志位等需要共享的场景,但并不保证对变量的复合操作的原子性。然而,在一些高并发情况下,是Java中的一个关键字,用于声明变量,确保多个线程之间对变量的可见性,即当一个线程修改了被。

2024-04-18 20:13:30 746 1

原创 Redis数据结构

Redis Streams特别适合处理业务场景足够简单,对于数据丢失不敏感,而且消息积压概率比较小的情况,(需要高吞吐量、低延迟和可靠性的应用场景?此外,通过将数据持久化和实现消费群组的概念,它还提供了一种有效的方式来平衡消息的生产和消费,保证了数据处理的可靠性和效率。我们可以在不定义消费组的情况下进行Stream消息的独立消费,当Stream没有新消息时,甚至可以阻塞等待。,可以将Stream当成普通的消息队列(list)来使用。stream借鉴了Kafka的设计,是一个新的强大的支持多播的可持久化的。

2024-04-18 16:13:08 1134 1

原创 Redis概述

Redis是一款内存高速缓存数据库。Redis全称为:Remote Dictionary Server(远程数据服务),使用C语言编写,Redis是一个key-value存储系统(键值存储系统),支持丰富的数据类型,如:String、list、set、zset、hash。Redis是一种支持key-value等多种数据结构的存储系统。可用于缓存,事件发布或订阅,高速队列等场景。支持网络,提供字符串,哈希,列表,队列,集合结构直接存取,基于内存,可持久化。

2024-04-17 22:08:34 870

原创 JVM-内存模型(运行时数据区)

包括编译器可知的各种 Java 虚拟机。

2024-04-15 22:22:13 1233 1

原创 Java集合框架-Collection-List-LinkedList源码

LinkedList底层通过双向链表(Deque)实现。LinkedList同时实现了List接口和Deque接口,也就是说它既可以看作一个顺序容器,又可以看作一个队列(Queue),同时又可以看作一个栈(Stack)。这样看来,LinkedList简直就是个全能冠军。当你需要使用栈或者队列时,可以考虑使用LinkedList,一方面是因为Java官方已经声明不建议使用Stack类,更遗憾的是,Java里根本没有一个叫做Queue的类(它是个接口名字)。关于栈或队列,现在的首选是ArrayDeque。

2024-04-14 22:21:08 785 1

原创 java集合框架-Collection-List-ArrayList源码分析

ArrayList实现了List接口,是顺序容器,即元素存放的数据与放进去的顺序相同,允许放入null元素,底层通过数组实现。除该类未实现同步外,其余跟Vector大致相同。每个ArrayList都有一个容量(capacity),表示底层数组的实际大小,容器内存储元素的个数不能多于当前容量。当向容器中添加元素时,如果容量不足,容器会自动增大底层数组的大小。前面已经提过,Java泛型只是编译器提供的语法糖,所以这里的数组是一个Object数组,以便能够容纳任何类型的对象。

2024-04-13 11:58:38 667

原创 Java基础(个人总结+八股问题整理)

基本类型:分为四类八种整型:byte(1字节)、short(2字节)、int(4字节)、long(8字节)浮点型:float(4字节)、double(8字节)字符型:char(2字节,表示单个字符)布尔型:boolean(表示真假值)基本数据类型都有其对应包装类基本类型都有对应的包装类型,基本类型与其对应的包装类型之间的赋值使用自动装箱与拆箱完成。// 装箱int y = x;// 拆箱枚举类型引用类型String数组、集合类、接口。

2024-04-12 22:01:21 872

原创 JVM-类加载机制

Java允许开发者通过继承类的方式自定义类加载器。开发者可以重写方法来实现自己的加载逻辑。

2024-04-11 20:55:05 927

原创 Java基础-面向对象(重点关注继承)

格式:[访问修饰符] [修饰符] class 自定义类名 [extends 父类] [implement 接口1,接口2…]{ }

2024-04-10 15:58:03 1119

原创 关键字final和static

使用final关键字可以让程序运行得更安全,因为它可以避免无意的赋值或继承导致的错误。同时,final 变量经常与不可变类搭配使用,以创建线程安全的常量。两者(static 和 final)也经常一起使用,例如在定义静态常量的时候,static final 一起使用能够创建全局常量。静态成员是类的一部分,而不是单个实例的一部分。:一旦给final变量赋值后,就不能更改它的值。final 关键字用于声明一个实体(变量、方法或类)是最终的,不能被修改。:被声明为final的类不能被继承。

2024-04-09 11:35:49 759 1

原创 object类通用方法(equals、hashcode、toString、clone)的讲解

Object类通用方法(equals、hashcode、toString、clone)的讲解

2024-04-09 11:12:13 1163 1

空空如也

空空如也

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

TA关注的人

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