- 博客(29)
- 收藏
- 关注
原创 HashMap为什么从java8的时候从头插变为尾插了
但是如果hash冲突变多了,这个链表就会越来越长,hashMap的时间复杂度也会越来越差,为了解决这个问题,在java8中HashMap使用了数组+链表/红黑树,当链表长度大于8且数组长度大于64的时候,链表就转换成了红黑树。首先在java7的时候,hashMap为了解决hash冲突,使用了链地址法,将具有相同hash值的元素,放在一个桶中,这个桶其实就是一个链表,在java7的时候是使用头插,将新元素直接插入到链表的头节点。使用尾插法可以保持插入顺序不变,这样转换成红黑树时,结构更稳定,性能更好。
2025-04-15 22:27:31
72
原创 如何理解MVCC?
是Multiversion Concurrency Control的缩写,翻译过来就是多版本并发控制,和数据锁一样,都是解决并发控制的方案。在数据库中,对数据的操作主要有2种,分别是读和写,而在并发场景下,会有以下三种情况:读-读并发读-写并发写-写并发我们都知道在没有写的情况下,读-读并发是没有问题的,而并发这种情况比较常用的就是通过加锁的方式实现。那么,读-写并发则可以通过MCVCC的机制解决。
2025-04-14 12:30:47
823
原创 Java中的static都能用来修饰什么?
在Java编程语言中,static关键字是非常重要的修饰符,可以用于多种不同的地方。可用来修饰变量、方法、代码块以及类。
2025-04-12 21:58:54
383
原创 RabbitMQ的死信队列和ttl
ttl即过期时间,rbbitmq可以对队列和消息设置过期时间,当消息到存活时间之后,还没有被消费,就会被自动清除例如:在网上购物,经常会遇到一个场景,当下单超过24小时还未付款,订单就自动取消或者申请退款之后,超过7天未处理就自动退款。
2025-04-09 22:14:47
520
原创 Redis持久化之AOF
AOF(Append Only File)持久化:以独立日志的方式记录每次写命令,重启时再重新执行AOF文件中的命令达到恢复数据的目的。AOF的主要作用解决了数据1.所有的写⼊命令会追加到 aof_buf(缓冲区)中。2.AOF 缓冲区根据对应的策略向硬盘做同步操作。3.随着 AOF ⽂件越来越⼤,需要定期对 AOF ⽂件进⾏重写,达到压缩的⽬的。4.当 Redis 服务器启动时,可以加载 AOF ⽂件进⾏数据恢复。3.命令写入:AOF 命令写⼊的内容直接是⽂本协议格式。
2025-04-07 21:18:26
922
原创 如何保证RabbitMQ消息的可靠传输?
在这个图中,消息可能丢失的场景是1,2,31.在生产者将消息发送给RabbitMQ的时候,消息到底有没有正确的到达服务器呢,RabbitMQ提供了两种解决方案:a. 通过事务机制实现(比较消耗性能,此处不展开)b. 通过(publisher confirm)机制实现。
2025-04-06 16:53:30
787
原创 Class<?> 和Class<T >有什么区别
类型的对象,但它们的使用方式和作用略有不同。不能直接用于创建该类型的实例(因为。作为类型参数,用于创建实例等操作。在 Java 中都表示。代表不确定的类型)。,代表某个确定的类型。,但不限定具体类型。
2025-04-05 15:56:58
323
原创 try中return A,catch中return B,finally中return C,最终返回值是什么?
这个代码得到的结果是2,try-catch-finally的执行顺序是try->finally或者try-catch-finally,然后在执行每一个代码块的过程中,如果遇到return那么就会把当前的结果暂存,然后再执行后面的代码块,然后再把之前暂存的结果返回回去。如果finally块中有一个return语句,它将覆盖try块和catch块中的任何return语句。所以在这种情况下,无论try和catch块的执行情况如何,finally块中的return C;最终的返回值将会是C!
2025-04-03 09:55:32
161
原创 Redis中set数据类型的内部编码及使用场景
集合类型的内部编码有两种:intset(整数集合):hashtable(哈希表):1)当元素个数较少并且都为整数时,内部编码为intset:2)当元素超过512个,内部编码变为hashtable:3)当存在元素不是整数时,内部编码为hashtable:
2025-04-02 13:14:04
384
原创 ClassNotFoundException和NoClassDefFoundError的区别是什么?
ClassNotFoundException是受检异常,他通常在运行时,在类加载阶段尝试加载类的过程中,找不到类的定义时触发。通常是由Class.forName()或类加载器loadClass或者findSystemClass时,在类路径中没有找到指定名称的类时,会抛出该异常。是一个错误(error),它表示运行时尝试加载一个类的定义时,虽然找到了类文件,但在加载、解析或链接类的过程中发生了问题。也就是说这个类在编译时存在,运行时丢失了,就会导致这个异常。如以下情况,我们定义A类和B类,
2025-04-02 11:34:00
159
原创 CAP理论是什么,为什么不能同时满足?
在分布式系统中,系统间的网络不能100%保证健康,服务又必须对外提供服务,因此Partiton tolerance不可避免。那就只能在C和A中选择一个,也就是CP和AP架构。一个分布式系统最多只能同时满足一致性(Consistency)、可用性(Availability)和分区容错性(Partiton tolerance)这三相中的两项。尽管网络结点之间会丢弃(或延迟)任意数量的消息,系统仍然能够继续运行。每个请求都会收到(非错误的)响应,但不能保证响应包含最新的写入数据。
2025-04-01 22:49:27
196
原创 springAOP
AOP是Aspect Oriented Programming(面向切面编程),切面是指某一特定问题,所以AOP也可以理解为面向特定方法编程。比如我们在用户登录时设置登录校验拦截器,就是对“登录校验”这一类问题的统一处理,所以拦截器是AOP的一种应用,而AOP是一种思想,拦截器就是AOP思想的一种实现。而Spring框架也实现了这种思想,提供了拦截器技术的相关接口。同样的,统一数据返回格式和统一异常处理,也是AOP思想的一种实现。
2025-04-01 22:39:30
862
原创 总结 HashTable, HashMap, ConcurrentHashMap 之间的区别
三者区别,主要从线程安全,性能,底层实现来展开在HashTable的put和get方法里直接加synchronized来控制同步,如果多线程访问同一个HashTable就会直接冲突,size属性也是通过synchronized来控制同步的,比较慢。高并发场景下性能比较差,一旦触发扩容,就由该线程完成整个扩容过程,过程中会涉及大量的元素拷贝,效率非常低。HashMap本身是无锁的,单线程下性能最优。线程不安全的,在多线程操作下可能导致数据不一致或死循环HashMap在Java 7时期时使用 数组 +链表 Ja
2025-03-08 14:14:17
238
原创 总结死锁的成因, 和解决方案.
死锁的成因死锁的成因死锁产生的四个必要条件(同时满足):互斥使用,资源被一个线程使用时,别的线程不能使用不可抢占,资源请求者不能强制从资源占领者手中强行抢走,只能等占有者主动释放请求和保持:当资源请求者在请求资源的同时保持对原有资源的占有循环等待:存在一个等待队列,p1占有p2的资源,p2占有p3的资源,p3占有p1的资源,形成一个等待环路解决方案从上面死锁形成的四种条件来看,破环循环等待是最容易也是最可控的办法破环循环等待最常用的一种办法是锁排序首先来看一下多线程循环等待的代码。
2025-03-06 21:19:48
147
原创 JVM知识点
由于JVM的多线程是通过线程轮流切换并分配处理器执⾏时间的⽅式来实现,因此在任何⼀个确定的 时刻,⼀个处理器(多核处理器则指的是⼀个内核)都只会执⾏⼀条线程中的指令。因此为了切换线程后 能恢复到正确的执⾏位置,每条线程都需要独⽴的程序计数器,各条线程之间计数器互不影响,独⽴ 存储。我们就把类似这类区域称之为"线程私有"的内存。3.本地方法栈(线程私有)本地⽅法栈和虚拟机栈类似,只不过 Java 虚拟机栈是给 JVM 使⽤的,⽽本地⽅法栈是给本地⽅法使⽤的。4.程序计数器(线程私有)
2025-02-21 23:49:45
685
原创 加密算法(java实现)
是指把任意⻓度的输⼊消息数据转化为固定⻓度的输出数据的⼀种密码算法. 摘要算法是不可逆的, 也就是⽆法解密. 通常⽤来检验数据的完整性的重要技术, 即对数据进⾏哈希计算然后⽐较摘要值, 判断是否⼀致. 常⻅的摘要算法有:MD5,SHA系列(SHA1, SHA2等), CRC(CRC8,加密思路:采用一个密码拼接一个随机字符来进行加密,这个随机字符我们称之为“盐”。
2025-02-20 22:39:35
253
原创 排序(包含算法基本原理及实现,性能分析)
稳定性:假定在待排序的记录序列中,存在多个具有相同的关键字的记录,若经过排序,这些记录的相对次序保持 不变,即在原序列中,r[i]=r[j],且r[i]在r[j]之前,而在排序后的序列中,r[i]仍在r[j]之前,则称这种排序算法是稳 定的;希尔排序法的基本思想是:先选定一个整数,把待排序文件中所有记录分成多个组, 所有距离为的记录分在同一组内,并对每一组内的记录进行排序。1.1 排序的概念 :所谓排序,就是使一串记录,按照其中的某个或某些关键字的大小,递增或递减的排列起来的操作。1.排序的概念及引用。
2025-02-19 22:59:46
115
原创 JWT令牌技术
JWT全称:JSON Web Token官网:https://jwt.io/JSON Web Token(JWT)是一个开放的行业标准(RFC 7519),用于客户端和服务器之间传递安全可靠的信息。其本质是一个token,是一种紧凑的URL安全方法。
2025-02-19 22:53:22
306
原创 HTTPS加密
由于http协议内容都是按照文本的方式明文传输,这导致在传输过程中出现一些被篡改的情况,所以有了https协议。https也是一个应用层协议,是在http协议的基础上引入一个加密层。
2024-12-04 10:11:43
1409
原创 多线程(通俗易懂,一篇就够了)
while(!isQuit) {System.out.println("线程工作中");try {System.out.println("线程工作完毕");});t.start();System.out.println("设置isQuit 为true");//thread类内部,有一个现成的标志位,可以用来判定当前的循环是否要结束while(!System.out.println("线程工作中");try {break;});t.start();try {
2024-11-09 15:15:02
2735
原创 ArrayList(使用及扩容机制)
和Vector不同,ArrayList不是线程安全的,在单线程下可以使用,在多线程中可以选择Vector或者CopyOnWriteArratList。.ArrayList实现了RandomAccess接口,表明ArrayList支持随机访问。,在集合框架中,arraylist是一个类,它实现了List接口。如果用户所需大小超过预估1.5倍大小,则按照用户所需大小扩容。1.检测是否真正需要扩容,如果是调用grow准备扩容。真正扩容之前检测是否能扩容成功,防止太大导致扩容失败。初步预估按照1.5倍大小扩容。
2024-10-30 11:18:20
148
原创 判断链表是否回文(字节跳动面试题)
与奇数节点不同的是,在判断完head.val == slow.val 后,不可以直接让head往后走,slow往前走。通俗点说slow和cur只改变了奇数节点的指向,head 和slow不会相等,它们只会刚好错过。首先判断head.val ==slow.val ,如果不相等,直接false。1.先假设是奇数节点,利用快慢指针,让fast走两步,slow走一步。2.接下来要对链表进行反转,定义一个cur,cur 在slow.next,curN在cur.next.slow =slow.next之前。
2024-08-30 16:35:44
357
1
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人