-
线程间通信的核心是协调执行顺序和共享数据,主要通过共享内存与同步机制实现。常用方式包括:使用wait()、notify()在synchronized中实现基础通信,适用于生产者-消费者模型;ReentrantLock配合Condition提供更精准的等待唤醒控制;BlockingQueue封装了线程安全与阻塞操作,简化生产者-消费者场景开发;此外还可选用CountDownLatch、CyclicBarrier等工具满足特定需求。选择依据为:简单场景用wait/notify,复杂控制用ReentrantLo
-
常见原因是用户输入非数字内容(如“95分”或直接回车)而程序用nextInt()强行读取,导致InputMismatchException;应改用nextLine()读整行并用Integer.parseInt()转换,配合try-catch处理,并注意消费换行符。
-
Java接口异常统一返回格式的核心是通过全局异常处理器将未捕获异常转为标准JSON(code/msg/data),区分业务与系统异常,隐藏堆栈,结合自定义异常类、统一响应体及合理HTTP状态码映射,确保异常可追溯、可控、语义清晰。
-
MaxTenuringThreshold仅是晋升年龄上限,JVM会根据Survivor空间使用情况动态下调真实阈值;若Survivor溢出,年龄为1的对象也可能直接晋升老年代。
-
首先下载JDK17并安装到指定路径,然后设置JAVA_HOME环境变量并将其bin目录添加到PATH中,最后通过java-version和javac-version验证安装成功。
-
应统一JDK版本:检查JAVA_HOME和PATH优先级,确保java和javac指向同一JDK;IDE需单独配置SDK和JRE;Homebrew用户用/usr/libexec/java_home或brewlink切换;CI/Docker中显式指定JDK路径或镜像版本。
-
super是子类访问父类成员的唯一安全通道,用于无歧义调用父类构造器、方法或字段;必须首行调用super()或super(参数),且仅限非static上下文,不可跨级访问祖父类。
-
Arrays.binarySearch返回负值时插入点计算为-(result+1),因需区分查找成功(非负索引)与失败(负值编码),并唯一确定插入位置;插入点即首个≥目标元素的索引,若全小于目标则为数组长度。
-
重写equals()时必须同步重写hashCode(),且两者依据的字段严格一致;否则HashMap、HashSet等集合行为异常。推荐用Objects.hash()生成hashCode,避免手工计算。
-
ArrayList默认容量为0(JDK12+)或10(早期),size()始终为0直到add();add()末尾追加高效,set()需索引<size(),remove()移除元素导致O(n)移动;遍历时修改会抛ConcurrentModificationException。
-
orTimeout不会中断正在运行的异步任务,仅返回TimeoutException的新CompletableFuture,原任务继续执行;需配合可中断Callable、显式cancel(true)及响应中断的线程池才能实现真正熔断。
-
编译器是否拦截是唯一判断标准:受检异常不处理则编译失败,运行时异常编译通过、运行才抛;关键看继承链是否经过RuntimeException,而非类名或发生时机。
-
继承问题源于误将其当作代码复用首选而非is-a关系建模工具,如Stack继承Vector破坏封装;应优先组合、慎用protected、避免构造器中调用可重写方法。
-
向下转型前必须用instanceof判断,因编译器无法确定父类引用实际指向的子类,直接强转可能触发ClassCastException;Java14+支持instanceof模式匹配(如if(objinstanceofDogdog))简化安全转换。
-
PriorityBlockingQueue不能直接用作任务队列,因其不支持重复元素的稳定排序,且默认不处理Comparable为null的情况,易抛NullPointerException或导致优先级失效;业务多维排序需显式传入健壮Comparator并外置排序逻辑,避免任务类耦合compareTo实现。