-
@Async默认不生效,因需显式启用@EnableAsync且必须通过Spring代理调用;常见失效原因包括未启用异步支持、本类内直接调用、方法非public、使用this调用等。
-
Future.get()必须带超时参数,否则会无限阻塞;cancel(true)仅对可中断任务有效;CompletableFuture回调需避免同步阻塞;异常需显式调用get()或handle()才能捕获。
-
答案:预防NullPointerException需从主动判空、使用Optional、参数校验和工具辅助入手。1.使用前判断对象是否为null,尤其针对外部传入数据;2.优先用常量调用equals避免空指针;3.利用Java8Optional类优雅处理可能为空的对象;4.通过Objects.requireNonNull进行方法参数校验;5.借助IDE警告和静态分析工具如SpotBugs提前发现隐患。养成良好编码习惯可有效避免程序因空指针异常而崩溃。
-
Collectors.partitioningBy用于内存中轻量级黑名单预筛,通过分组快速分离拦截与放行请求;需配合显式拦截动作(如抛异常、记日志),不替代网关或风控系统。
-
Stream.iterate()的终止条件在Java9+中通过三参数重载(seed,Predicate,UnaryOperator)显式指定,Predicate判断当前值是否继续;Java8中无此重载,只能用limit()预设次数或手动截断。
-
ChannelPipeline是Netty中每个Channel自动创建的双向事件处理器链,入站事件从head向tail传播,出站事件反向传播;必须在EventLoop线程内安全添加/移除handler,严格按职责顺序配置编解码器与业务处理器。
-
下界通配符(?superT)不能实现权限继承,因其仅为编译期类型约束工具,不承载权限语义或运行时校验逻辑;权限继承需依赖Authority层级建模、JWT预计算继承链、动态决策器等真实机制。
-
ConcurrentHashMap1.7通过Segment数组实现分段锁,每个Segment是独立的ReentrantLock+小型哈希表,put仅锁定对应Segment,get完全无锁;但存在哈希倾斜退化、size()阻塞等问题,故1.8改用CAS+synchronized锁单个Node并引入树化优化。
-
throw是实际抛出异常对象,throws是声明可能抛出的异常类型;throw后接new创建的异常实例,throws后接异常类名;一个方法可多处throw,但throws只在方法签名中声明一次。
-
类加载器间是委托链而非继承关系,通过构造参数传递父加载器引用实现双亲委派;自定义加载器默认父为AppClassLoader,Bootstrap无父且由JVM用C/C++实现。
-
应选Java17或21(LTS)版本,优先下载EclipseTemurin或BellSoftLiberica的OpenJDK安装包;Windows选.msi、macOS选.pkg、Linux注意确认JAVA_HOME路径;配置时JAVA_HOME须指向JDK根目录,PATH添加$JAVA_HOME/bin;验证需java-version与javac-version双命令一致;IDE需单独配置SDK。
-
Java标签必须紧跟冒号且仅用于for、while、do-while前,是语法锚点;命名同变量规则;带标签break仅向上跳转至同名标签语句,仅适用于多层循环提前退出。
-
Class对象由JVM类加载时自动创建,不可new;获取方式有String.class、obj.getClass()、Class.forName();反射调用需区分getMethod与getDeclaredMethod;Field操作性能差且易空指针;转型须校验类型防ClassCastException。
-
EnumMap的get/put是O(1)且无哈希开销,因其直接用枚举ordinal()作数组下标访问内部values数组,省去HashMap全套哈希计算与结构维护流程。
-
top找出Java进程PID后,为什么top-H显示的线程ID和jstack里的nid对不上因为top-H默认显示的是Linux线程的十进制TID(ThreadID),而jstack输出里nid=0x...是十六进制的nativethreadID。直接比对会漏掉真凶。用printf"%x\n"把top-H看到的十进制TID转成小写十六进制,再和jstack输出里的nid=0x7f8a对照注意:JDK8u60+默认