-
Formatter类是Java中用于格式化输出的核心工具,位于java.util包中,支持类似C语言printf的格式化语法,可精确控制数字、日期、字符串等输出形式。通过创建Formatter实例并结合StringBuilder等输出目标,调用format()方法实现格式化写入,常用转换符包括%s、%d、%f、%c、%t和%n,支持小数位数控制、对齐方式(如%10s右对齐、%-10s左对齐)、填充补零(如%08d)等技巧,适用于日志记录与报表生成;实际开发中常使用System.out.printf或Str
-
try-finally用于确保关键操作(如资源清理)无论是否发生异常都执行,finally在try退出时无条件运行,但System.exit()或JVM强制终止时除外;推荐优先使用try-with-resources。
-
Record类型仅提供编译期类型约束,无运行时分量访问能力;需配合泛型函数getProp<T,KextendskeyofT>(obj:T,key:K):T[K]实现安全取值,结合asconst或schema校验保障类型精度。
-
为什么不用wait/notify直接写生产者消费者队列?因为裸用wait/notify极易死锁或虚假唤醒,且无法保证线程安全的入队/出队原子性。比如没加synchronized块就调用wait(),会抛IllegalMonitorStateException;而只在if里判断队列空/满,不改用while,就会漏掉唤醒后条件已失效的情况。实操建议:所有共享状态(如队列、计数器)必须被同一把锁保护,推荐用synchronized修饰方法或代码块,锁对象最好是队列本身(this
-
接口中定义的常量默认为publicstaticfinal,可直接通过接口名访问,如Constants.APP_NAME;建议避免类实现常量接口,优先使用工具类封装常量。
-
YoungGC不扫描整个老年代,因为G1为每个Region维护独立RSet,仅记录“谁引用了我”;执行YoungGC时,JVM只扫描Eden/Survivor对应RSet中的脏卡,避免全量老年代遍历,使停顿时间与堆总大小解耦。
-
<p>Quartz的CronExpression是Java生态中解析Cron并计算下次触发时间最稳定可靠的方案,支持秒字段、L/W/#等扩展语法,需显式传入TimeZone,每次调用应新建实例以保证线程安全。</p>
-
Java中括号匹配与中缀转后缀均依赖栈的LIFO特性:括号匹配通过入栈左括号、遇右括号校验并弹出实现;ShuntingYard算法依运算符优先级控制入栈/弹出,生成后缀表达式;后缀求值则用栈执行数字入栈、运算符弹双操作数计算。
-
FileChannel.lock()提供操作系统级建议性锁,需所有进程主动配合才生效;支持全文件/范围加锁、共享/独占模式及阻塞/非阻塞方式,必须显式release且遵循“先锁后操作、finally释放”原则。
-
SynchronousQueue是零容量同步通道,不存储元素,put与take必须配对阻塞完成“手递手”交付,无缓冲、无复制、无中间状态,仅在生产者与消费者线程间直接传递引用。
-
super用于子类访问父类成员,包括调用父类构造器、方法和属性。1.子类构造器中通过super()调用父类构造器,必须位于首行;2.重写方法时用super.方法名()调用父类原方法;3.子类中通过super.属性名访问父类同名属性。
-
必须先创建TreeMap等NavigableMap实现,再用Collections.unmodifiableNavigableMap()包装并丢弃原始引用,才能获得完全只读且支持subMap、headMap等范围导航的视图。
-
BitSet比boolean[]省内存因用1bit存布尔值,而boolean[]按字节对齐致空间放大8倍;适合稀疏布尔标记,但get/set略慢、不支持泛型;底层为long[],扩容翻倍,初始化建议预设大小;遍历用nextSetBit()高效跳零;跨系统需注意字节序与padding。
-
super用于访问被隐藏的父类实例变量或调用被重写的父类方法;子类同名字段时必须用super.变量名访问父类变量;重写方法中需复用父逻辑时必须用super.方法名();构造器中用super()调用父类构造器且须为第一行。
-
Map.replace(K,V)仅在键存在时替换值,不插入新键值对;replace(K,V,V)需键存在且旧值引用相等才替换,常用于乐观更新,但注意null、不可变Map及类型约束问题。