-
CompressedClassSpace是JVM中专用于存储压缩Klass指针的固定大小内存区域(默认1G),与Metaspace分离;其OOM表明该区域耗尽,常见于动态代理频繁、类加载器泄漏场景。
-
浮点数比较必须用带精度的断言,裸写==几乎总是错的,因IEEE754二进制表示存在固有精度损失(如0.1+0.2≠0.3),且编译器优化、平台差异等会放大偏差;iOS应使用XCTAssertEqualWithAccuracy,Pytest用pytest.approx,JUnit需借助AssertJ等第三方库;误差值须为正、匹配数值量级,避免整数隐式转换、单位混淆或未mock随机源。
-
groupingBy嵌套summarizingInt不能直接两层因后者返回IntSummaryStatistics而非Collector;正确做法是外层groupingBy分组、内层summarizingInt统计,结果为Map<String,IntSummaryStatistics>。
-
new出来的对象不一定在堆上,因逃逸分析可判定其是否逃逸:未逃逸时JVM可栈上分配或标量替换;方法逃逸或线程逃逸则必须堆分配。
-
必须通过反射获取theUnsafe字段并setAccessible(true),JDK9+还需--add-opens参数;allocateMemory返回的地址需手动管理生命周期,重复free或越界访问将导致JVM崩溃。
-
Java9起接口可用private方法抽取多个default方法共用逻辑,既复用代码又不暴露给实现类;它专用于接口内部封装校验、日志、格式化等重复行为,仅限本接口内default或static方法调用,不可被实现类访问或反射调用。
-
推荐组合优于继承,因其更契合业务可变性与可控性:组合明确区分“拥有什么功能”和“是什么类型”,避免继承的脆弱基类、单继承限制、语义失真及封装泄露问题,支持运行时切换、易测试与高内聚。
-
基本数据类型比较用==和!=,浮点数需考虑精度误差,推荐使用容差范围判断相等;大小比较可借助包装类的compareTo方法,但注意自动装箱影响性能,高频操作应优先使用原始类型和直接运算符。
-
观察者模式通过被观察者状态变化时自动通知所有依赖的观察者实现一对多更新,常用于事件处理、GUI交互与数据同步;核心为Subject维护Observer列表并触发update方法,Java中可通过自定义接口或过时的Observable类实现,适用于解耦事件源与处理逻辑,需注意性能与内存泄漏问题。
-
@Override注解用于标识子类重写父类方法,要求方法名、参数列表、返回类型(含协变)一致,访问权限不更严格,且父类方法不可为final、static或private;它仅在编译期校验重写合法性,提升可读性与错误发现效率。
-
应遍历NetworkInterface.getNetworkInterfaces()获取真实网卡名,按isUp()、非loopback、有MAC地址筛选;getHardwareAddress()为null时需检查权限或系统限制;获取IPv4地址时应过滤本地、链路本地、回环及APIPA地址;Windows中文名乱码需用GBK重解码。
-
局部类通过编译器生成私有字段并构造时传入值或引用,将effectivelyfinal变量“搬家”到堆上与实例绑定共存亡;修改其指向对象内部状态可绕过final限制。
-
页面接口经常需要同时查询用户、订单、优惠等多个服务。本文按完整工作流拆解 Java CompletableFuture 如何做并行调用、独立超时、异常兜底、统一 DTO 合并和最终检查。
-
Java中的运算符包括算术、关系、逻辑等类型:算术运算符如+、-、*、/、%用于数学计算;关系运算符如==、!=、>、<等返回布尔值;逻辑运算符&&、||、!用于组合条件判断。
-
Java复合赋值运算符隐含窄化类型转换,如shorts=1;s+=1;合法而s=s+1;报错;连续赋值a=b=c仅适用于已声明变量且右结合;==比较引用或原始值,对象应使用.equals();循环中String+=导致O(n²)性能问题。