语言基础
这里简要总结一些编程语言相关的知识点和特性,主要是Java和Go
JavaHashMap
转红黑树的条件:最长链表长度到达TREEIFY_THRESHOLD=8且容量到达MIN_TREEIFY_CAPACITY=64;红黑树退化链表的阈值为UNTREEIFY_THRESHOLD=6,存在冗余,防止反复触发
modCount 变量的核心作用是记录集合结构被修改的次数,从而实现快速失败(Fail-Fast)机制。每当对集合执行增加、删除、清空或其他改变映射数量的操作时,modCount 就会自增。而在通过 Iterator(迭代器)遍历集合时,迭代器内部会存储一个 expectedModCount 变量,其初始值等于创建迭代器那一刻的 modCount。在遍历过程中,迭代器每次调用 next() 或 remove() 都会检查 modCount 与 expectedModCount 是否依然相等。如果两者不一致,说明在遍历期间有其他线程或代码修改了集合的结构,此时程序会立即抛出 ConcurrentModificationException 异常。
.put方法
Go切片协程
claude code入手
本文试图通过claude code来稍微理解skill, agent这些概念
留着等待填坑,opus4.6太贵了,现在codex+gpt用的非常舒服
算法题记录
记录一些有价值的算法题,难度不会很高,可以拿来复健,例如熟悉编程语言的语法特性,在没有IDE的情况下能略写代码。
p394_字符串解码
字符串的相关操作
p347_前K个高频元素
PriorityQueue的自定义排序
动态规划题型整理
动态规划好难!题单:https://leetcode.cn/discuss/post/3581838/fen-xiang-gun-ti-dan-dong-tai-gui-hua-ru-007o/
1. 入门DP1.1. 爬楼梯70. 爬楼梯123456789101112class Solution { public int climbStairs(int n) { // dp[i]表示爬了i阶楼梯,初始在第0阶,要爬到第n阶,实际上是个n+1长度的 int[] dp = new int[n + 1]; dp[0] = 1; dp[1] = 1; for (int i = 2; i <= n; i++) { dp[i] = dp[i - 2] + dp[i - 1]; } return dp[n]; }}
746. 使用最小花费爬楼梯3693. 爬楼梯 II 377. 组合总和 Ⅳ题目:给 ...
算法题小整理
本文准备把常见的算法题中,不同的题型进行分类整理,相信将相同类型的思路放在一起能够起到事半功倍的效果。本分类很大程度参考了灵神的题单和题解,感谢灵神!
遍历和哈希表
两数之和
梦开始的地方,利用哈希表将2次遍历简化为1次。我们采用枚举右,寻找左的方法,将当前遍历到的 j 作为两数中的一个,去哈希表中寻找左边的另一个数 target - j,如果能找到就是一个解;然后将自身添加到哈希表中,等待后续右边的数来找自己。
12345678910111213class Solution { public int[] twoSum(int[] nums, int target) { Map<Integer, Integer> idx = new HashMap<>(); // 创建一个空哈希表 for (int j = 0; ; j++) { // 枚举 j int x = nums[j]; // 在左边找 nums[i],满足 nums[i]+x=target ...
力扣周赛记录
双周赛-174题一和题二都很简单直接秒了,可惜我昨天在看斯诺克,边看边做,就没打算做最后一道困难题了,其实挺简单的。以后尽量双周赛都参加一下,锻炼一下我的辣鸡算法能力。
题三:100918. 交替按位异或分割的数目题意:给一个数列数组,把他划分为若干个子数列,每个数列的异或和在target1和target2之间轮转。
之前对异或不够熟悉。异或是位运算,相同为0,不同为1,从而有:
自己异或自己为零,即:a ^ a = 0
异或的逆运算是自己,因此:若a ^ b = c则a = c ^ b,即abc任意两个进行异或都等于第三个。
这个题用前缀异或和(类似前缀和)的特性,设置2个dp数组分别是dp1和dp2,表示:dp1[sum](或dp2[sum])表示分割前缀异或和为sum的序列,分割成满足target1和target2交错,且最后一组的异或值为target1(或target2)的序列组的方法数;
这样之后,当遍历到输入参数nums的下标i时,此时dp1[sum]和dp2[sum]便表示:在下标i之前,分割前缀异或和为sum、且以target1或target2结尾的方法数。因此状态 ...
Java垃圾回收
复习一下:垃圾回收主要发生在 JVM 堆,也就是堆内存。堆内存和方法区共同组成线程共享区域,其中 方法区 主要存放 类的元数据,堆 主要存放 对象实例。方法区在 JDK 1.8 之后对应的是元空间(Metaspace),它位于本地内存中,不再直接受传统 JVM 堆大小的限制,但依然会受到机器总内存的约束。
类和对象的创建过程?线程私有区域有哪些?分别有什么用?
JVM 堆主要存放对象。从分代视角来看,堆通常分为新生代和老年代;如果放到 JDK 1.8 之前的语境里,还会提到永久代,这里暂时不展开。新生代内部又会继续拆成 Eden 区和两个 Survivor 区(通常记作 S0、S1 或 From、To)。
分代回收机制_3代之所以要做分代,是因为不同对象的生命周期差别很大。大多数对象“朝生夕死”,少量对象会长期存活,因此把它们放在不同区域、采用不同算法,回收效率会更高。
Minor GC / Young GC:当 Eden 区放不下新创建的对象时触发,主要负责新生代回收。Minor GC 一般采用标记-复制算法,因为新生代里大部分对象都活不久,适合直接把少量存活对象复制 ...
Java 并发与多线程
乐观锁和悲观锁悲观锁悲观锁的核心思想是:先假设冲突一定会发生,因此在访问共享资源前先把资源“锁住”。它更适合写操作频繁、冲突概率高的场景,可以避免大量重试带来的性能损耗。
synchronizedsynchronized 是 Java 内置的监视器锁,使用方式主要有三种。
修饰实例方法:锁的是当前对象实例,同一时刻同一个对象只能有一个线程执行该同步实例方法。
1public synchronized void decrement() {}
修饰静态方法:锁的是当前类对应的 Class 对象,同一时刻只能有一个线程执行该类的同步静态方法。
1public static synchronized void incrementStatic() {}
修饰代码块:锁的粒度更细,可以显式指定锁对象,通常比直接锁整个方法更灵活。
1234567891011121314151617181920class BlockCounter { private int count = 0; private final Object l ...
Spring相关
什么是 Spring 和 SpringBootSpring 是什么Spring Framework 是很多模块的集合,使用这些模块可以很方便地协助我们进行开发;核心功能是 IoC 和 AOP。下图是 Spring 中各个模块之间的依赖关系。需要大概知道一些模块是干嘛的。
Core Container:基础模块,包含spring-core、spring-beans等
Data Access/Integration:数据访问模块,包含spring-jdbc、spring-orm等
Spring Web:网络部分,包含spring-webmvc、spring-websocket等等
Spring BootSpringBoot是用来快速开发Spring应用的一个脚手架,其设计目的是用来简化新 Spring 应用的初始搭建以及开发过程;
SpringBoot提供了很多内置的Starter(⼀系列依赖关系的集合)结合自动配置,对主流框架如 Redis MySQL无需配置或开箱即用;
SpringBoot简化了开发,采用JavaConfig的方式可以使用零xml的方式进行开发,配置即 ...
JVM内存区域
总览谈 JVM 内存区域时,最好先区分两个视角:
JVM 规范视角:关注的是运行时数据区有哪些逻辑区域,包括程序计数器、虚拟机栈、本地方法栈、堆、方法区。
HotSpot 实现视角:关注这些逻辑区域在具体虚拟机里是如何落地的。比如 JDK 8 之后,HotSpot 使用 元空间(Metaspace) 来实现方法区;元空间位于 本地内存,而不是 Java 堆中。
因此,平时常说的“JVM 内存”,通常指的是 JVM 运行时会使用到的内存区域;但如果继续深挖,就要分清楚哪些是 规范定义的逻辑区域,哪些是 HotSpot 的具体实现。
可以先用一张表把关系理顺:
区域
线程私有 / 共享
是否属于 JVM 规范中的运行时数据区
说明
程序计数器
线程私有
是
记录当前线程下一条将执行的字节码指令地址
Java 虚拟机栈
线程私有
是
保存 Java 方法调用对应的栈帧
本地方法栈
线程私有
是
为 Native 方法服务
堆
线程共享
是
存放对象实例的主要区域,也是 GC 的核心区域
方法区
线程共享
是
存放类元信息、运行时常量池等
元空间 ...

