- 博客(9)
- 收藏
- 关注
原创 图的遍历(dfs bfs详解Java版)
,完全类似树的层次遍历 —— 先访问起始顶点这一层,再依次访问其所有邻接点(第一层),接着按顺序访问邻接点的邻接点(第二层),直到遍历完所有与起始顶点连通的顶点。了解图的基本概念后,我们需要掌握图的核心操作——顶点遍历(即按一定规则访问图中所有顶点,且每个顶点仅访问一次),下面首先介绍最常用的遍历方式:深度优先遍历(DFS)。:若图为非连通图,一次 BFS 只能遍历起始顶点所在的 “连通分量”(即与起始顶点连通的所有顶点)。中所有元素均为 1,才算完成图中所有顶点的遍历。广度优先遍历的核心是 “
2025-10-25 12:50:11
842
原创 Java刷题路线
Java基本语法与数据类型:面向对象编程:异常处理:Java内存管理:常用Java库:输入输出(I/O):基础多线程:基础设计模式: 数组与链表:栈与队列:Map与Set:集合框架的遍历与操作:泛型与集合:Java内存模型(JMM):线程的创建与管理:同步机制:并发工具类:线程池:并发问题与解决方案:原子操作与CAS:并发设计模式:JVM内存结构:垃圾回收机制:类加载机制:JVM性能调优:JVM字节码:内存泄漏与优化:SQL基本语法:数据库设计与范式:索引优化:事务与隔离级别:查询优化:存储引擎:数据库备份
2025-10-17 22:57:47
631
原创 Windows&Linux终端常用命令
替代 netstat 的高效工具,功能更全、速度更快,常用 ss -tuln 查看监听端口, ss -an 查看所有连接。作用:追踪数据包从本地到目标主机的 完整路由路径,显示每一跳的 IP 和延迟,定位网络卡顿/中断的节点。:显示所有监听中的TCP(-t)、UDP(-u)端口,以数字形式(-n)展示,不解析主机名。作用:查看/修改本地 路由表,管理数据包的转发路径(多用于复杂网络环境,如多网关场景)。:显示所有(-a)网络连接(包括已建立和监听),数字形式(-n)输出。
2025-10-15 10:08:57
2091
原创 HTTP状态码分类
4xx(客户端错误状态码):请求存在错误,服务器无法处理。5xx(服务器错误状态码):服务器处理请求时出错。1xx(信息性状态码):请求已接收,需继续处理。3xx(重定向状态码):需进一步操作完成请求。2xx(成功状态码):请求已成功处理。
2025-10-13 22:29:20
748
原创 Java集合热门面试题大全
在 Java 集合中,二者因底层结构不同,性能与适用场景差异显著,核心选择逻辑可概括为“查多用 ArrayList,改多(中间)用 LinkedList”。 一、底层实现(差异根源) 二、核心优缺点 1. ArrayList2. LinkedList 三、适用场景 优先选 ArrayList 优先选 LinkedList四、核心差异表在Java集合框架中,HashMap是使用频率极高的键值对存储容器。理解其底层实现原理,尤其是JDK1.7和JDK1.8之间的差异,对我们掌握Java编程和应
2025-10-12 22:45:48
1984
原创 JDK 1.8 对 HashMap 除了红黑树还进行哪些改动?
1.8 优化后将 key 的哈希码的高 16 位和低 16 位进行异或,使哈希码分布更均匀,不容易冲突,这是 JDK 开发者在速度、实用性、哈希质量间做的权衡。默认负载因子为 0.75,即当已存储元素数量超过当前容量的 75% 时,触发扩容操作。扩容时需将所有元素重新分配到新哈希桶中,该过程称为rehashing,即每个元素的存储位置会根据新容量重新计算并移动到新数组中。例如,初始容量为 16,负载因子 0.75,扩容阈值为 16 × 0.75 = 12 ,存入第 13 个元素时触发扩容。
2025-10-08 16:34:56
794
原创 为什么 JDK 1.8 对 HashMap 进行了红黑树的改动?
简单翻译下就是在默认阈值是 0.75 的情况下,冲突节点长度为 8 的概率为 0.0000006,也就概率比较小(毕竟红黑树耗内存,且链表长度短点时遍历的还是很快的)。举个例子,一个节点反复添加,从 8 变成 9,链表变红黑树,又删了,从 9 变成 8,又从红黑树变链表,再添加,又从链表变红黑树?这就是基于时间和空间的平衡了,红黑树占用内存大,所以节点少就不用红黑树,如果万一真的冲突很多,就用红黑树,选个参数为 8 的大小,就是为了平衡时间和空间的问题。所以余一点,毕竟树化和反树化都是有开销的。
2025-10-08 10:00:30
1819
原创 Java 中 ConcurrentHashMap 1.7 和 1.8 之间有哪些区别?
原理是通过 key 的 hash 得到 Segment 数组下标,给该 Segment 上锁,再通过 key 的 hash 得到 Segment 里 HashEntry 数组下标,这步和 HashMap 一致,即引入了 Segments 数组。思想是粒度更细化,不分段,给 Node 数组每个节点分别上锁,并发度更高。JDK 1.8:直接计算返回结果,采用类似 LongAdder 的思想,累加不基于单个成员变量,而是搞一个数组,每个线程在自己对应下标处累加,最后统一数组数据得到最终值,是分而治之的思想。
2025-10-07 12:44:21
850
原创 Java 中 HashMap 的原理?
在 put 操作时,如果两个键的 hashCode() 相同,但 equals() 返回 false ,则这两个键会被视为不同的键,存储在同一个桶的不同位置。此时 A.next = null,因为线程 1 的 newTable 是新建的,此时上面还没有数据,所以 A.next 为 null,且被放到数组上,e 变成 B。在 JDK1.7 及之前链表的插入采用的是头插法,即每当发生哈希冲突时,新的节点总是插入到链表的头部,老节点依次向后移动,形成新的链表结构。// e为B,e.next为A。
2025-10-06 09:45:09
584
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅