-
Record类的equals和hashCode是编译器按契约自动生成的底层行为:基于值语义逐字段比较、严格依赖字段声明顺序、由不可变性保障哈希稳定性,三者共同确保符合Object规范且不可绕过。
-
Unsafe.allocateMemory绕过GC需配对freeMemory,否则内存泄漏或崩溃;putX/getX无边界检查易越界;禁混用DirectByteBuffer地址;新项目应优先使用MemorySegment+VarHandles。
-
getClass()返回代理对象实际运行时类型(如$Proxy1),无法直接获取目标类;需通过Proxy.getInvocationHandler()获取处理器,再反射提取其内部目标对象getClass()才能得到原始业务类。
-
接口常量适用于多类共用、极少变更的基础配置和语义锚点,须严格遵循命名规范、分层定义位置,并通过接口名直接引用。
-
DatagramSocket无需connect()即可发包,发送目标由DatagramPacket携带,必须用含地址和端口的四参构造器;receive()需设超时避免阻塞,bind()前应调用setReuseAddress(true)解决端口占用。
-
优先选AVL树适用于高频读取、低频更新场景,如配置中心;红黑树更适配读写均衡或写多于读的动态场景,如实时交易系统,且工程实现与生态支持更优。
-
Map的key必须重写equals()和hashCode(),因哈希表靠hashCode()定位桶、equals()判断键等价;若不重写,默认地址比较会导致相同逻辑对象被误判为不同key。
-
高位泄漏指高优先级线程因上下文错置长期持有TraceContext/Span/MDC,导致内存增长、GC压力升高等问题;本质是ThreadLocal强引用锁死引发的带业务语义泄漏。
-
ConcurrentHashMap在JDK1.8后采用CAS+synchronized实现线程安全,以Node数组+链表/红黑树结构提升并发性能,通过synchronized锁单个桶节点实现细粒度控制,允许多线程在不同桶上并发写入,仅在哈希冲突时竞争,显著提高吞吐量;推荐使用putIfAbsent、computeIfAbsent、merge等原子方法避免显式同步,合理设置初始容量和并发等级以减少扩容开销,并注意复合操作需用内置方法保证原子性,防止竞态条件。
-
VarHandle本身不参与访问控制,真正决定能否访问私有字段的是MethodHandles.Lookup实例的权限等级;MethodHandles.lookup()限本类,publicLookup()仅限public字段,privateLookupIn()是唯一合法跨类访问私有字段的方式,且需满足模块读取、类加载器一致等三重校验。
-
Java中“匹配”指用正则表达式模式匹配字符串,主要通过Pattern和Matcher类实现。1.Pattern编译正则,Matcher执行匹配,如提取邮箱;2.Matcher提供matches()、find()、group()等方法进行全串或子串匹配;3.String类支持matches()、replaceAll()、split()等便捷操作;4.正则分组可捕获子表达式内容,通过group(n)获取;需注意转义、性能及贪婪匹配细节。
-
自定义锁卡死或抛异常的主因是未正确实现AQS契约:tryAcquire必须原子返回true/false,state需按语义精确使用,shouldParkAfterFailedAcquire不可出错,且不可在其中抛异常或阻塞。
-
FixedThreadPool适合CPU密集型任务,线程数固定且资源可控,但遇IO阻塞易导致队列堆积和拒绝异常;CachedThreadPool适合短平快异步任务,但高并发下易OOM;SingleThreadExecutor仅保证串行执行,不保证线程安全;ScheduledThreadPoolExecutor是唯一可靠的定时方案,需注意任务幂等性和延时策略选择。
-
JVM是否启动JIT编译取决于方法调用或循环回边计数是否达到动态调整的阈值;其通过方法调用计数器和回边计数器识别热点,达阈值后提交C1/C2编译,但实际编译还受分层编译、代码缓存、GC等影响。
-
Field.getType()返回字段声明时的原始类型(如List.class),不包含泛型信息,也不反映运行时实际对象类型;需用getGenericType()获取泛型参数,用value.getClass()获取运行时类型。