
java
文章平均质量分 77
java小白转大白
菜鸟小白,疯狂成长
展开
-
hashmap中put和putVal方法
文章目录前言一、HashMap的重要属性二、put和putVal方法三、数组下标的计算方式总结前言我想只要JAVA程序员,都躲不过HashMap这一关,面试官的HashMap夺命连环问经常把求职者虐的体无完肤。因此,本篇文章以JDK8为例,对HashMap的底层源码做一个解析,帮助大家更好的理解HashMap的底层原理。一、HashMap的重要属性我想大家都应该知道在JDK8中HashMap的数据结构是数组+链表+红黑树。原创 2024-03-25 15:12:27 · 906 阅读 · 0 评论 -
为什么不推荐使用redis的setnx进行分布式加锁
缺乏原子性:分布式锁的核心要求是原子性,即加锁和设置锁的过期时间应该是原子操作。然而,SETNX 命令只负责设置键的值,而不支持同时设置过期时间。这意味着你需要先调用 SETNX,然后再调用 EXPIRE 来设置锁的过期时间。这两个操作不是原子的,因此在它们之间可能发生一些导致不一致的情况,比如客户端在设置过期时间之前崩溃,导致锁永远不会被释放。锁释放的安全性问题:释放锁时,需要确保只有持有锁的客户端才能成功释放。原创 2024-03-28 19:32:34 · 2404 阅读 · 1 评论 -
扫码登录方案实现
如果用户选择确认登录,APP 端校验 id 状态为已查询,则将 id 和 APP 端 token 发送到后端,后端根据 id 将 token。在 WEB 端点击二维码登录生成一个唯一 id 存储到 Redis,并且 给这个 id 设置为未被查询状态 0,根据此 id 生成二维码。APP 端进行扫码,获取到这个 id,查看 id 状态是否正常(如果 正常则将 id 状态修改为已查询;后端接收到登录请求,发现此 id 已有 token 时,根据此 app 的 token 所对用的用户重新生成新的 web 端。原创 2024-03-27 16:40:43 · 425 阅读 · 0 评论 -
hashmap
将e.hash小于oldCap的数组元素,也就是低位的元素,通过loTail进行遍历,头节点 放入到loHead中, 同理,将e.hash大于oldCap的数组元素,也就是高位的元素,通 过HiTail进行遍历,头节点放入到HiHead中。由于数组扩容了两倍,但是e.hash没有改变,会导致下标大于oldCap的位置是空着的,所以需要将e.hash小于oldCap的数组元素放入到原来的下标j中,将e.hash大于oldCap的元素放入到新的下标j+oldCap中。原创 2024-03-25 14:16:40 · 614 阅读 · 2 评论 -
聊一下数据库事务(最近被高频面试)
要去完全认识数据库事务,得先了解什么是事务事务(Transaction)指一个操作,由多个步骤组成,要么全部成功,要么全部失败。举一个简单的例子:比如转账功能,A账户需要给B账户转账,需要进行下面两步:从 A 账户扣钱。往 B 账户加入等量的钱。因为是独立的两个操作,所以可能有一个成功,一个失败的情况。但是因为在这种场景下,不能存在从 A 账户扣钱成功,往 B 账户加入等量钱失败这种情况,要么同时成功,要么同时失败(一个失败需要回滚),即必须要保证事务。原创 2024-03-31 17:46:52 · 603 阅读 · 1 评论 -
list的for循环中调用增删操作所带来的的思考
首先我们来看这段代码//迭代器我们发现这次会报这个错误at javaat com那我们如果用for循环呢同样的报错at javaat com那如果是普通for循环呢i++) {运行正常那如果是迭代器删除呢//迭代器同样没有报错接下来我们从底层代码分析我们最后总结一下,其实就是迭代器并不知道你进行了删除操作,所以我期望的改变值不等于改变值,java认为此时是不安全的,就会快速失败。而用迭代器自己的方法,就会保证迭代器知道我们每次改变的次数。原创 2024-03-27 19:13:06 · 987 阅读 · 0 评论 -
java密码锁定逻辑
分享一下我在项目里写的密码锁定逻辑,目前在项目里的密码锁定逻辑是这样的,在五分钟内输错五次,就锁定三十分钟。很简单的一个小分享,用到了redis。原创 2024-03-31 20:46:21 · 464 阅读 · 1 评论 -
列表for循环之再思考-CopyOnWriteList
接收一个要搜索的元素 o,当前的数组 elements,搜索的起始索引 index,以及搜索范围的结束索引 fence。它遍历从 index 到 fence(不包括 fence)的数组元素,如果找到与 e 相等的元素,则返回该元素的索引;我们能够发现,这块代码并没有对modCount的改动,核心就是通过复制了一份新的数组,再进行赋值操作(此处跳过需要删除的元素),因此迭代器部分初始exceptModCount也是被赋值为modCount的0,迭代器对复制出来的删除元素并不感知,因此不会报错。原创 2024-03-29 14:55:49 · 268 阅读 · 1 评论 -
JVM的一些小记
cpu处理数据的时候,会先从一级缓存去取,如果没有就从二级缓存中找,在没有就从三级缓存,还没有,那么就从内存中读取,但是不会只单单读取需要处理的数据,而是会读取一个64字节的块,因为CPU认为处理完这个数据大概率也会处理他相邻的数据,而这个块就是cache line。原创 2024-03-26 12:00:12 · 1944 阅读 · 0 评论 -
hashmap jdk1.7头插法造成死循环的原因分析
好,现在线程1开始继续执行,上边已经说过,线程1在挂起之前已经取到了e节点(就是A节点),e.next就是B,只不过此时的B节点已经被线程2修改过了,B节点此时已经指向了A(即B节点的e.next不再是NULL,而是A节点)当然,数组扩展后会重新进行hash,节点A和B不一定还会挂在同一个链表上,我们为了分析问题,假设两个节点重新hash后,还在同一个链表上,就假设在3号位,这些都不重要。当再有线程3来扩容时,因为有环状链表,所以就会一直循环取节点,造成死循环。这时候线程1挂起,线程2继续执行。原创 2024-03-26 10:32:47 · 1482 阅读 · 0 评论 -
jvm命令
承接上一篇,这块是我最近记录的jvm命令相关的。原创 2024-03-26 13:49:23 · 592 阅读 · 0 评论 -
2020-08-29
Java数组转List的三种方式及对比前言:本文介绍Java中数组转为List三种情况的优劣对比,以及应用场景的对比,以及程序员常犯的类型转换错误原因解析。一.最常见方式(未必最佳)通过 Arrays.asList(strArray) 方式,将数组转换List后,不能对List增删,只能查改,否则抛异常。关键代码:List list = Arrays.asList(strArray);private void testArrayCastToListError() {String[] strAr原创 2020-08-29 11:16:05 · 117 阅读 · 0 评论 -
Java #{}和${}区别
Java #{}和${}区别Mybatis中使用#{}可以防止sql注入#{}: 表示一个占位符号,实现向PreparedStatement占位符中设置值(#{}表示一个占位符?),自动进行Java类型到JDBC类型的转换(因此#{}可以有效防止SQL注入).#{}可以接收简单类型或PO属性值,如果parameterType传输的是单个简单类型值,#{}花括号中可以是value或其它名称.:表示拼接SQL串,通过:表示拼接SQL串,通过{}可将parameterType内容拼接在SQL中而不进行JDB原创 2020-08-21 20:59:12 · 1754 阅读 · 0 评论