-
选型核心是看变量被并发修改的频率:冲突少用乐观锁,冲突高用悲观锁。乐观锁靠版本号校验、不阻塞读,适用于社交点赞等低冲突场景;悲观锁用SELECT...FORUPDATE提前加锁,适用于秒杀、转账等高冲突场景;需关注热点数据写密度而非整体QPS,灰度时监控失败率与等待时长,混合策略更常见。
-
关键在于JVM编译后签名:泛型擦除使List<String>和List<Integer>均变为List,导致同名同签名冲突;用javap-s验证descriptor是否重复;桥接方法可能与手动方法重叠;应改用语义化命名如parseStrings()避免冲突。
-
NumberFormat.setParseIntegerOnly(true)使parse()方法忽略小数点及之后内容,仅提取开头整数部分;如"123.45"→123、"-42.99"→-42,但".5"解析失败。
-
Java通过JDBC查询INT类型含NULL字段时,必须用Integer等包装类接收,不可用基本类型int,否则getInt()返回0无法区分真实0与NULL,且可能抛异常;应先调用wasNull()判断或改用getObject("col",Integer.class)。
-
启用-XX:+PrintGCDetails后,GC日志中直接反映晋升行为的关键字段是:tenuringthreshold(显示为newthreshold)、survivor容量与使用量、oldgen增量,以及PSYoungGen存活大小变化;其中newthreshold值动态体现实际晋升年龄门槛,oldgen增量与年轻代存活量差值可量化晋升字节数,Survivor区饱和时newthreshold陡降或归零即表明强制晋升启动。
-
学生类和课程类应作为独立实体设计,通过Enrollment关系类建模多对多关联;ID统一用String;选课需校验存在性、重复性、容量等;退课与查询应维护courseToStudents、studentToCourses等内存索引以实现O(1)操作。
-
Java方法表(vtable)是JVM内部自动构建的优化结构,用于加速invokevirtual的动态绑定;它按签名预排槽位,子类覆盖复用父类索引,不暴露给开发者,final方法和接口方法分别由内联和itable处理。
-
catch(Exceptione)会吞掉NullPointerException等运行时异常,导致排查困难、状态错乱;应按场景捕获具体异常,如IOException、SQLException,并在顶层兜底时记录完整堆栈。
-
Stream.dropWhile()是Java9引入的方法,用于跳过流开头连续满足谓词的元素,保留首个不满足条件的元素及后续所有元素,仅适用于有序串行流。
-
高性能重试器的关键在于不泄漏、不阻塞、不重复创建,需规避闭包陷阱、显式传递参数、隔离每次重试上下文,并通过策略定义、非阻塞调度和状态隔离三部分实现。
-
Java序列化不当会引发内存膨胀,主要因反序列化时隐式实例化、Gadget链执行、静态引用滞留及集合无界增长;应禁用默认反序列化、预检字节流长度与嵌套深度、避免序列化上下文对象,并采用Protobuf/FlatBuffers等轻量协议替代。
-
正则表达式核心功能包括文本匹配、子串提取、文本替换、文本分割及断言与定位控制。它通过模式规则实现精准文本处理,广泛应用于验证、抽取、清洗、切分和上下文限定等场景。
-
大数组跨步访问导致缓存失效的根本原因是破坏空间局部性,因CPU以64字节缓存行为单位加载数据,跨步使缓存行内有效数据占比低,引发频繁未命中;可通过分块(tiling)、结构体对齐与填充优化。
-
JavaSSL调试日志(-Djavax.net.debug=ssl:handshake)默认不直接标识TLS连接本身,而是以线程为单位输出;同一线程ID和线程名可能复用于多个TLS握手,因此需结合线程上下文、时间戳与握手关键事件(如ClientHello源地址、证书信息)交叉关联,才能准确定位各连接的日志归属。
-
Thread.setDefaultUncaughtExceptionHandler未生效的根本原因是设置时机过晚或仅对后续线程生效,且主线程异常不走该处理器;需在main开头设置,并单独为主线程、线程池、框架线程(如@Async)、UI线程分别配置handler。