- 博客(5)
- 收藏
- 关注
原创 Redis面试题(穿透,击穿,雪崩)
2.布隆过滤器(底层是二进制0,根据hash得到值,把0修改为1),缺点:可能存在误判的情况,当数组长度越大误判率越小,当数组长度越小,误判率越大。去查询一个不存在的数据,MySQL查询不到该数据,也不会写入Redis中,就会导致每次请求都查询数据库,查询次数过多导致宕机。给某一个key设置了过期时间,当key过期的时候,恰好在同一时间段,有大量用户去访问这个key,这些并发就会瞬间把数据库压垮。2.给key设置逻辑过期,返回过期key,高可用,性能优,不能保证数据绝对一致性。
2024-03-21 22:57:32 100 1
原创 HashTable和ConcurrentHashMap的区别
HashTable和ConcurrentHashMap都是线程安全的,HashTable效率较慢,默认初始容量为11,扩容2倍+1,ConcurrentHashMap,jak8存储结构采用的是数组+链表+红黑树,锁的粒度较大,在每个链表头都有锁,当多个线程操作同一个链表头会进行加锁操作,多个线程操作不同链表头不影响。
2024-03-21 22:42:49 77
原创 HashMap的实现原理(JDK1.8和1.8之前的区别)
JDK1.8之前采用头插法,采用的是数组+链表,在多线程的环境下可能造成死循环,当 HashMap 进行扩容时,会将原来的 Entry 数组长度扩大为原来的两倍,并重新计算每个元素在新数组中的位置。JDK1.8采用的是尾插法,采用的是数组+链表|红黑树,扩容情况:当数组长度*0.75负载因子,达到预定值扩容2倍,当数组长度大于等于64,并且链表长度大于8,就会将链表转化为红黑树,链表长度小于等于6退化为链表。HashMap是懒惰创建数组的,首次使用创建数组,初始值为0,put数据默认初始容量为16。
2024-03-19 21:10:01 298
原创 ArrayList和LinkenLis的区别
2. ArrayList增删数组需要挪动,底层是数组,节省内存,查询速度较快,尾部增删效率较快,不需要考虑数组的挪动;LinkenList不支持下标查询,增删需要遍历数组,双向链表,需要存储数据和二个指针更占用内存,增删不一定快,因为LinkenList不是连续性存储,需要根据链表遍历数据性能相对不是很好,头尾增删快,中间数据较慢,会先进行查询操作;1. ArrayList是动态数组,查询速度较快,数据存储是连续性的,根据下标查询;LinkenList是双向链表,内存存储不是连续性的,指针指向;
2024-03-19 20:55:02 230
原创 ArrayList底层实现原理
3. ArrayList在进行扩容的时候是原来容量的1.5倍,每次扩容都需要拷贝数组,计算数组的容量,如果当前数组已使用长度+1后的大于当前的数组长度,则调用grow方法扩容(原来的1.5倍)2. ArrayList惰性加载,初始值为0,当第一次添加数据的时候才会初始化容量为10。1. ArrayList底层是由动态的数组实现的。
2024-03-19 20:36:45 361
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人