-
IntelliJIDEA线程检查仅识别静态模式,如非线程安全集合迭代+修改、synchronized锁局部变量、Date未保护;需显式标注@Shared或跨方法传递才提示;不报ConcurrentModificationException、锁粒度不当或volatile缺失问题。
-
Java中线程分为用户线程和守护线程,主要区别在于JVM退出机制:1.用户线程会阻止JVM退出,只要存在用户线程运行,JVM就继续执行;2.守护线程不阻止JVM退出,当所有用户线程结束后,即使守护线程仍在运行,JVM也会终止;3.新线程默认为用户线程,可通过setDaemon(true)设为守护线程,但必须在start()前调用;4.主线程是用户线程,子线程继承父线程的daemon状态;5.典型场景:用户线程处理业务逻辑,守护线程用于日志监听、资源监控等后台服务任务。
-
Files.lines()流式读取大文件更简洁且默认UTF-8,但须try-with-resources防句柄泄漏;需处理编码探测、NUL截断、大小写匹配、滑动窗口上下文、正则预编译、行号控制及高亮安全替换。
-
extends是Java中声明单继承的唯一关键字,格式为class子类名extends父类名,父类不能是final或非public(跨包时),不可多继承,子类继承public/protected成员,构造器需显式调用super(参数)若父类无无参构造。
-
通过抽象类定义共通行为,如Animal的makeSound;利用接口实现多维能力,如Flyable;结合策略模式动态切换行为,提升灵活性。
-
优先用Introspector读POJO属性:它自动过滤静态/合成/桥接方法,兼容isXxx()/getXxx(),但要求类遵循JavaBean规范;getDeclaredField适合绕过封装,需手动处理访问控制、继承及模块限制,且必须判空readMethod并缓存PropertyDescriptor。
-
Java分批应优先用subList或GuavaLists.partition,避免Stream.collect硬凑;需注意视图修改风险、空值校验及并发安全。
-
CopyOnWriteArrayList写操作不阻塞读,因每次修改都新建数组复制内容,读操作持老数组引用且无锁;但写开销大、迭代器不可见新元素、多方法组合非原子。
-
桥接模式通过分离抽象与实现,使两者独立变化,适用于多维度扩展场景。如图形系统中形状与渲染方式、日志系统的输出目标、支付方式与渠道、跨平台GUI绘制等,均可用此模式避免类爆炸,提升灵活性。核心是识别独立变化的维度,用组合代替继承,动态切换实现,降低耦合。但需避免过度设计,仅在多维度独立演化时引入。
-
不能。finally块仅保证执行,不自动关闭资源;需手动在其中用try-catch分别关闭各资源并判空,避免异常中断清理;Java7+推荐try-with-resources,但老代码仍依赖正确编写的finally。
-
构造方法重载必须满足:同一类中方法名相同(即类名)、参数列表不同(数量、类型或顺序至少一者不同)、与访问修饰符和返回值无关;本质是通过签名差异实现编译期唯一绑定。
-
逻辑运算符&&和||支持短路特性,即一旦结果确定便不再执行后续条件;例如,当obj为null时,obj!=null&&obj.getValue()>10不会触发空指针异常,因前半为false后半被跳过;同理,isAdmin||hasPermission()中若isAdmin为true,则不调用hasPermission();而非短路运算符&和|会始终执行所有部分,适用于需强制副作用的场景,但常规判断中推荐使用短路形式以提升安全与效率。
-
什么时候该调大-XX:CompileThreshold默认值10000意味着方法被解释执行满一万次才触发C1编译,对高并发短生命周期服务(比如SpringBootWebAPI)来说太保守——热点方法还没来得及编译,请求潮就过去了,C2更是遥遥无期。实操建议:-测试环境可先试-XX:CompileThreshold=1500,观察PrintCompilation日志里方法编译延迟是否明显缩短-生产环境慎用低于3000的值,否则C1编译线程争抢CPU,反而拖慢吞吐
-
IllegalStateException表示对象状态不合法,如在关闭的流中读取数据;IllegalArgumentException表示参数值不合法,如传入负数作为年龄。前者关注对象状态,后者关注输入参数,合理使用可提升代码健壮性。
-
本文介绍在SpringBoot项目中基于Log4j2实现“每个类输出到专属日志文件”的完整方案,涵盖Logger初始化规范、log4j2.xml配置要点,并提供可运行示例与关键注意事项。