-
JVM堆内存分代管理,非连续空间:YoungGen(Eden、S0、S1)、OldGen和Metaspace;对象优先分配Eden,触发MinorGC后存活对象复制或晋升,大对象可直接入OldGen;字符串字面量存常量池,newString("abc")仅在堆建引用对象;AllocationFailure是GC正常触发提示,非OOM;逃逸分析可能使对象栈上分配。
-
toArray()返回Object[]是因泛型擦除与数组协变性限制;安全做法是传入类型化数组如newString[0],或用Stream.toArray(String[]::new)。
-
FreeMarker模板中直接使用isXxx()方法名会导致“期望boolean却得到method+sequence”错误;应优先访问对应JavaBean属性(如xxx),或显式调用方法(isXxx())并加括号,确保获取返回值而非方法引用。
-
选用ArrayList而非普通数组,因其支持动态扩容及add()、remove()等便捷方法;商品类需定义id、name、price、quantity并实现Serializable;购物车用ArrayList<Product>泛型声明,增删改查需按ID操作、合并数量、避免强转与并发问题。
-
本文介绍在SpringREST场景下,针对一个父请求包含10–50个动态子请求的场景,通过线程安全的并行HTTP调用(如CompletableFuture或并发集合)显著提升响应性能,并解决parallelStream()中无法修改非final变量的核心问题。
-
优先用if判断权限,因其可安全处理null;非空固定角色可用switch但需default;字符串比较用Objects.equals或equalsIgnoreCase;权限逻辑应分层,Controller做粗粒度校验,Service处理行级规则;推荐用enum替代String提升类型安全与可维护性。
-
字符串拼接有多种方式:简单场景用+,循环中推荐StringBuilder,线程安全选StringBuffer,集合拼接用String.join或Collectors.joining,格式化用String.format或.formatted,Stream场景用joining收集器。
-
Collection接口与原生数组操作对象完全不同:Collections只能操作Collection实现类,Arrays专为原生数组设计;排序行为、类型支持、线程安全及不可变包装等方面存在显著差异。
-
不用——但写代码、编译、调试仍需本地JDK;Docker镜像自带JDK仅解决运行时隔离,IDE和mvn等构建工具依赖本地JDK;省掉的是服务器JDK安装,非开发机。
-
封装的核心是接口与实现分离,而非仅用private修饰符;它要求外部仅通过稳定接口操作,无需知晓内部存储、计算或状态维护细节,如BankAccount的deposit()和getBalance()方法。
-
ReentrantLock提供比synchronized更灵活的线程同步控制,支持可中断、超时获取、公平锁及Condition协作,需显式加锁并确保finally中释放,适用于复杂并发场景。
-
CompletableFuture解决了传统Future无法链式处理、组合任务、非阻塞回调、异常统一处理等硬伤,支持thenApply/thenCompose/anyOf/allOf等编排能力,并提供handle/whenComplete/exceptionally等语义明确的回调机制。
-
接口是公开、抽象、可组合的行为契约,表达“能力”而非“身份”,支持多实现与向后兼容演进;abstractclass表达纵向类型继承,仅单继承。
-
Safepoint是JVM中线程可安全暂停的特定位置,用于保障GC可达性分析等STW操作的准确性,并支撑类重定义、偏向锁撤销、反优化及线程诊断等运行时服务,通过协作式轮询机制实现,避免强制中断。
-
Arrays工具类提供排序、查找、比较、填充和复制等操作,提升开发效率。1.sort()支持基本类型和对象数组排序,对象数组可结合Comparator实现降序;2.binarySearch()需在有序数组上执行,否则结果不可预测,查找失败返回负值表示插入点;3.equals()比较一维数组内容,deepEquals()用于多维数组深度比较;4.fill()可全量或范围填充数组;5.copyOf()和copyOfRange()简化数组复制。注意使用前提如排序状态和引用类型匹配,避免误用。