-
JavaSocket默认阻塞,易致线程膨胀;SocketChannel配合Selector实现非阻塞,需手动处理返回值。HttpClient重配置,OkHttp轻量异步。Netty是事件驱动框架,非简单NIO封装。WebMvc与WebFlux底层网络模型不同,不可仅靠返回类型切换。
-
只有有向无环图(DAG)才有拓扑排序,所谓“集合的拓扑排序”实为对顶点集合V按有向边关系进行的排序;需用邻接表或Map构建图并运行Kahn或DFS算法,因邻接表空间高效、支持非连续/字符串顶点名、便于动态更新;Kahn算法中须显式初始化所有顶点入度,用merge或get-default方式安全更新,结果长度小于顶点数即表明存在环。
-
在Java中处理JSON解析异常需使用try-catch捕获第三方库抛出的特定异常:Jackson抛JsonProcessingException,Gson抛JsonSyntaxException,org.json抛JSONException;应始终对不可信输入进行异常处理,记录错误日志并根据业务需求返回默认值或提示格式错误,避免程序中断。
-
Maven构建以pom.xml为核心,settings.xml仅影响依赖获取方式而非定义依赖;pom.xml必须正确定义groupId、artifactId、version、packaging及依赖范围、插件配置等,父子模块需正确设置relativePath或确保父POM已安装至本地仓库。
-
InputStream.read()返回-1表示流已到达末尾,而非错误;仅底层异常时抛IOException;循环读取须用while((b=in.read())!=-1)判断,read(byte[])返回实际字节数,可能为0或-1。
-
ForkJoinPool适用于分治任务,基于工作窃取算法提升并行性能。通过RecursiveTask实现任务拆分与合并,如并行求和示例所示:大任务拆为子任务,一个fork异步执行,另一个compute直接计算,最后join汇总结果。关键要点包括合理设置阈值、避免阻塞操作、优先使用公共池及及时关闭资源。适用于归并排序、树遍历等计算密集型场景,不适用共享状态频繁更新或强依赖任务。掌握分治逻辑与粒度控制可显著提升吞吐量。
-
位运算符直接操作二进制位,提升效率。①&用于判断奇偶:n&1==1为奇数;②^可交换数值:a=a^b;b=a^b;a=a^b;③n&(n-1)统计1的个数;④^遍历数组找出唯一单次元素;⑤>>保持符号,>>>高位补0;⑥仅适用于整数类型,移位勿超32或64位限制。
-
HashMap手动实现核心是哈希定位与链表处理:put先计算index=hash&(length-1),冲突则头插;get先比hash再调equals,避免无效比较;扩容必须rehash并翻倍长度,否则下标错乱。
-
OOP是用类、对象、封装、继承、多态映射现实世界的结构和行为逻辑;Java通过抽象实体、边界权限、分类关系与行为差异,还原人类认知方式。
-
join()不能保证子线程的绝对执行顺序,仅确保主线程等待其终止;子线程间调度由系统决定,需通过启动时序或同步机制控制串行逻辑。
-
必须调用Field.setAccessible(true)才能访问private字段,否则抛IllegalAccessException;JDK12+还会触发强封装警告,且需捕获SecurityException,final基本类型字段在JDK17+不可修改。
-
合理拆分职责、使用提前返回、StreamAPI和局部变量可提升Java方法的可读性与维护性,让代码逻辑更清晰。
-
确认JDK多版本共存需验证java-version与whichjava是否一致,排查PATH残留旧路径;macOS用/usr/libexec/java_home-V查看并切换,Linux用update-alternatives注册全工具链,IDE和构建工具须单独配置对应JDK。
-
List有序可重复,Set无序去重,Map存储键值对;遍历时需用Iterator删除元素;HashMap依赖hashCode和equals,自定义键需重写;根据场景选择集合类。
-
在SpringBoot应用中,若依赖的外部JAR包内含有@Component、@Configuration等Spring注解类,默认不会被自动扫描。本文详解如何安全扩展组件扫描范围,既不破坏@SpringBootApplication的默认行为,又能精准加载第三方库中的Spring组件。