-
Java的垃圾回收通过标记-清除、复制、标记-整理算法实现自动内存管理,分代回收结合三者优势,提升性能。
-
静态工具类用于封装无状态的通用功能,如日期处理、字符串操作等,通过私有构造函数防止实例化,方法直接通过类名调用,提升复用性和可读性;应遵循命名清晰、参数校验、无副作用等原则,并按功能拆分工具类,避免过度集中,同时注意测试困难和共享变量的线程安全问题。
-
Arrays.asList()返回的List不支持增删操作,需包装为ArrayList;基本类型数组会因泛型擦除导致类型错误;Arrays.sort()对基本类型用不稳定快排、对象数组用稳定TimSort;Arrays.equals()逐元素比较值,多维数组需deepEquals();Arrays.fill()对引用类型仅复制同一对象引用。
-
OutOfMemoryError并非单纯物理内存不足,而是JVM在堆、元空间、直接内存或线程栈等特定区域无法分配连续空间且GC无效时抛出;需结合jstat/jmap/jstack及OS限制综合排查。
-
UUID.randomUUID()是最稳妥的生成方式,底层用SecureRandom实现UUIDv4,碰撞概率极低;禁用手动拼接、时间戳模拟或newUUID()构造;存储宜用BINARY(16)而非字符串;命名场景用nameUUIDFromBytes();测试应避免污染全局随机状态。
-
本文介绍如何在Java应用中高效检测文本字段是否包含来自商标/黑名单表的单个词汇或完整短语,涵盖数据库查询优化、流式匹配逻辑、边界场景处理及生产级注意事项。
-
Java密码校验须分四步:正则分项校验强度、SHA-256加盐哈希、MessageDigest.isEqual防时序攻击、优先用SpringSecurity的DelegatingPasswordEncoder。
-
Java数组的length是编译期确定的final字段而非方法,因数组为JVM内置类型,大小固定且存于对象头中;调用length()、对null数组访问或混淆List.size()均会报错。
-
复制算法提升Survivor区空间利用率的核心是高效回收与合理分配,通过控制对象存活率、优化复制节奏、动态调整区大小来减少碎片和避免提前晋升。
-
Map接口用于存储键值对,提供put、get、remove等方法进行增删改查;通过keySet、values、entrySet实现遍历操作。
-
代理模式是AOP的技术基础,AOP通过代理机制实现横切关注点的模块化。Java中代理分为静态代理和动态代理,后者包括JDK动态代理(基于接口)和CGLIB代理(基于继承)。SpringAOP利用这两种方式,在目标类有接口时用JDK代理,无接口时用CGLIB生成代理类。通过InvocationHandler或MethodInterceptor可在方法调用前后插入逻辑,如日志、事务等。AOP的核心是将重复代码封装为切面,并在运行时通过代理织入目标方法,实现对原有业务逻辑无侵入的增强。开发者无需修改原始类即可完
-
MaxGCPauseMillis是G1的软性停顿目标而非硬性超时,其效果依赖历史数据与内存分配模式;设过低会增频GC、降低吞吐,设过高则单次停顿延长;需配合G1NewSizePercent、G1MixedGCCountTarget等参数协同调优,并通过GC日志分析分布而非均值验证。
-
Java中对象赋值默认是引用传递,直接使用“=”会导致多个变量指向同一内存地址;要避免副作用,必须通过构造新实例实现深拷贝或值复制,而非简单赋值。
-
本文详解如何使用现代Java时间API(java.time)将形如"25/12/2021"的字符串安全、准确地解析为带纽约时区(America/New_York)的完整时间点,避免传统Date+SimpleDateFormat的时区陷阱。
-
Java数组怎么声明就初始化(静态初始化)静态初始化就是声明数组的同时给定元素值,编译器自动推断长度,适合已知全部初始数据的场景。常见错误是混用new和大括号,比如写成int[]arr=newint[]{1,2,3};看似静态,实则属于“动态初始化语法但用了静态写法”,虽能编译,但容易和纯静态混淆。正确静态写法只有两种:int[]arr={1,2,3};(必须和声明在同一语句)不能拆开:int[]arr;然后arr={1,2,3};→编译报错il