-
使用BigDecimal可避免浮点数精度问题,推荐用String构造、指定除法精度和舍入模式,通过compareTo比较,确保高精度计算准确。
-
不加volatile的DCL会因指令重排序导致其他线程看到未初始化完成的实例,引发NullPointerException;volatile禁止重排序并保证可见性,是JDK5+下DCL正确性的关键。
-
String不可变性导致常见陷阱:所有修改方法均返回新对象,原字符串不变;需注意null安全、索引边界、==与equals区别、replace系列是否支持正则等。
-
Java用户注册登录核心是密码安全、会话管理、输入校验三环节落地:密码须用BCrypt加密存储与校验;Session需显式设HttpOnly、Secure及超时;接口必做邮箱、密码强度、限流及统一错误提示。
-
JAXP够用但有局限:作为规范接口层,其默认配置保守,不校验DTD、不防护外部实体、不支持流式写入,小数据量解析可行,安全与性能场景需补充配置或换用SAX/StAX等方案。
-
ClassCastException发生在运行时,当编译通过但实际对象类型与目标类型不兼容时;例如Parentp=newChildA()后执行(ChildB)p会抛出该异常。
-
依赖注入是控制反转的具体实现形式,控制反转是更高层级的设计思想:前者通过构造函数、属性或方法注入依赖,后者将对象生命周期与依赖关系的控制权移交外部容器统一管理。
-
preHandle适合鉴权和参数预处理,postHandle仅在Controller成功执行后调用且不处理异常,afterCompletion无论成败均触发并可捕获异常;路径匹配需用PathPattern风格如/api/**;读取请求体须用ContentCachingRequestWrapper;拦截器必须由Spring容器管理而非new创建。
-
Map接口用于存储键值对,提供put、get、remove等方法进行增删改查;通过keySet、values、entrySet实现遍历操作。
-
Future.get(long,TimeUnit)超时仅终止等待而非任务本身,因任务线程阻塞时不响应中断;cancel(true)是否生效取决于任务是否检查并处理中断信号。
-
Java中Lambda表达式可捕获外部变量实现闭包,但局部变量需为有效final,而实例与静态变量可自由访问,保障线程安全与简洁性。
-
Netty主从Reactor架构通过EventLoop串行化替代线程池实现线程安全,bossGroup仅需1线程负责accept,workerGroup默认CPU×2负责IO处理,Channel绑定固定EventLoop保障无锁。
-
分布式限流算法的选择需根据业务需求和系统特性进行权衡。1.令牌桶允许突发流量,适合短暂高并发场景,通过Redis+Lua实现令牌生成与消耗的原子操作;2.漏桶以恒定速率处理请求,输出平滑但不适用于突发流量,可通过Redis队列模拟实现;3.计数器分为固定窗口和滑动窗口,后者更精确但实现复杂,适合对限流精度要求高的场景;选择时需考虑一致性、性能开销、容错性、突发流量容忍度及实现复杂度;使用Redis时需防范单点故障、网络延迟、Lua脚本复杂度过高等问题,并通过压测评估吞吐量、延迟和资源消耗,结合监控确保限流
-
最轻量Java控制台通讯录用ArrayList<Contact>存数据、Scanner交互,Contact需重写equals/hashCode,输入统一用nextLine().trim()防空格和换行残留,搜索用toLowerCase().contains()支持模糊匹配,退出不保存数据。
-
Java异常处理通过Throwable体系实现,分为Exception和Error;Exception又分检查与非检查异常,前者需显式处理,后者如RuntimeException可不处理。异常由throw抛出,沿调用栈传播,由try-catch捕获,finally确保资源释放,或使用try-with-resources自动管理;JVM负责查找处理器、构建堆栈轨迹,未捕获则终止线程。