-
JDK是运行和开发Java应用的必备环境,必须正确配置JAVA_HOME指向JDK根目录且PATH包含%JAVA_HOME%\bin(Windows)或$JAVA_HOME/bin(Linux/macOS),否则会出现命令未找到或类加载失败;验证需执行java-version、javac-version和echo命令确认版本与路径一致。
-
Java反射调用私有方法需先调用setAccessible(true),再invoke();读写私有字段同理,且需注意类型匹配、final字段限制及模块化访问控制。
-
NonfairSync.lock()先CAS抢锁是为提升性能,减少线程挂起开销;FairSync则通过hasQueuedPredecessors()强制排队,确保公平性但增加volatile读开销。
-
首先安装Git并配置用户信息,再在IDE中集成。具体为:下载安装Git,设置用户名邮箱,配置.gitignore排除编译文件,在IntelliJIDEA中启用Git插件并指定路径,最后初始化仓库提交代码。
-
静态代码块在类加载时执行且仅一次,父类先于子类执行;主动引用触发初始化,被动引用不触发;异常导致类加载失败且不可重试;需避免I/O、循环依赖及跨ClassLoader问题。
-
要准确查看G1的Region类型实时分布,必须启用-XX:+PrintRegionStats,它在每次GC暂停结束时输出全堆Region物理计数快照,如“eden:256,survivors:16,old:240,humongous:16”,真实反映各类型Region数量;而GC日志中的[Eden:128M->0B(128M)]仅显示逻辑容量变化,无法体现Region物理类型的动态流转。
-
Java反射不能监听对象创建,Instrumentation需通过字节码增强在<init>方法中插入监控逻辑,覆盖new、反射、DI等所有创建路径。
-
ArrayList<Product>比数组更灵活,能自动伸缩并配合泛型约束类型;Product需重写equals()和hashCode()、添加唯一id字段;高频查询应补HashMap索引;增删改操作须封装校验逻辑、考虑线程安全;JSON序列化LocalDateTime需注册JavaTimeModule;持久化推荐Jackson写JSON而非手写CSV或二进制;数据量大时应升级为嵌入式数据库。
-
CountDownLatch仅适用于单JVM内多组件协同初始化,如SpringBoot应用中数据库、缓存等模块启动后统一开放接口;不适用于跨JVM的分布式场景,此时需用ZooKeeper、Redisson或注册中心等分布式协调机制。
-
<p>可用AOP切面在方法异常时自动捕获、分类并统计,需精准拦截目标包方法,用execution表达式限定范围,如execution(publiccom.example.biz.service...*(..)),结合@AfterThrowing提取异常类型、时间、类方法名等维度,异步聚合至ConcurrentHashMap并提供HTTP接口查看TopN排行,定时快照存Redis,通知内try-catch保障主流程,设内存上限防OOM,支持配置开关动态启停。</p>
-
用CallbackFilter配合setCallbacks()可实现不同方法走不同Callback实例;accept()返回值必须严格对应callbacks数组索引,否则会误入错误回调,建议兜底日志、下标常量化并避免反射与IO。
-
根本原因是浮点数在二进制中无法精确表示十进制小数(如0.1),累加时持续发生对阶与舍入误差,导致实际值偏离理论值;用==直接比较必然失效,应改用带容差的误差判断。
-
Java提供三种注释:单行注释//用于简要说明,多行注释/.../用于多行或禁用代码,文档注释/*.../生成API文档,合理使用可提升代码可读性与维护性。
-
只有有向无环图(DAG)才有拓扑排序,所谓“集合的拓扑排序”实为对顶点集合V按有向边关系进行的排序;需用邻接表或Map构建图并运行Kahn或DFS算法,因邻接表空间高效、支持非连续/字符串顶点名、便于动态更新;Kahn算法中须显式初始化所有顶点入度,用merge或get-default方式安全更新,结果长度小于顶点数即表明存在环。
-
嵌套循环变量命名应优先体现业务语义而非节省字符;i/j/k仅适用于简单场景,多层业务逻辑需用order/item/sku等具名变量,并保持层级区分、避免缩写与复用,性能不受变量名长度影响。