-
ScheduledExecutorService是Java中推荐的定时任务工具,相比Timer更灵活且线程安全。通过Executors创建单线程或固定线程池,支持schedule、scheduleAtFixedRate和scheduleWithFixedDelay三种调度方式,适用于不同场景。使用时需自定义线程工厂便于监控,任务中应捕获异常防止线程终止,并在适当时候调用shutdown()关闭服务,避免资源泄漏。Spring中建议在@PreDestroy中关闭。合理使用可提升程序稳定性与性能。
-
Java不手动释放内存是因为依赖GC自动管理堆和元空间内存,避免循环引用、野指针等问题;GC不处理栈、直接内存等区域,System.gc()仅是建议且通常被忽略。
-
Java实名认证需前端收集信息、后端校验、调用权威接口(如阿里云实人认证)、保存结果;须校验身份证号格式与姓名合法性,但必须通过权威接口验证人证一致;数据库应独立记录每次认证全过程,加密存储敏感信息,并严格遵循《个人信息保护法》。
-
企业级任务流引擎核心是将业务逻辑拆解为可复用、可配置、可监控的原子节点,并通过有向图编排执行;需自主设计节点抽象、上下文传递、状态管理与异常恢复机制,定义统一Node/Context/NodeResult接口,支持ServiceNode、HttpNode、ScriptNode、DecisionNode、WaitNode等多类型节点及动态路由,流程定义与运行时隔离,强调幂等性、可观测性与运维支撑。
-
不可变对象指创建后状态永远无法修改的对象;String是典型例子,其concat等操作返回新实例;实现需final类、final私有字段、无修改方法、不暴露可变内部;注意避免继承破坏、可变引用未深拷贝、getter返回内部引用;适用多线程共享、Map键、函数式调用等场景。
-
Java中==对基本类型比较值,对对象比较引用地址;对象内容比较应使用equals(),且重写equals()时必须重写hashCode()以保证哈希集合的正确性。
-
ArrayDeque的head指向队首元素,tail指向下一个要插入位置,二者在固定数组中通过模运算(位运算优化)循环移动;扩容按需扩至最小2的幂,禁止null元素以确保peek返回null即为空。
-
迭代器适用于遍历中删除元素及多种集合类型,支持fail-fast但代码冗长;2.增强for循环语法简洁适合只读场景,但无法删元素或获取索引;3.普通for循环适用于需索引操作的数组或ArrayList,可灵活控制但易出错且不适用于无索引集合。
-
静态代码块只在类加载时执行一次,用于类级别初始化;实例代码块每次new对象时执行,用于对象初始化;二者执行顺序固定且不可混淆。
-
死锁是多线程互相持有对方所需锁而全部阻塞的现象,需同时满足互斥、占有并等待、不可剥夺、循环等待四个条件;典型代码中两线程以不同顺序获取lockA和lockB导致闭环等待。
-
Java中ArrayList.clone()只做浅拷贝,新列表与原列表共享元素引用,修改副本中的自定义对象会影响原列表;修复需手动深拷贝或序列化方案。
-
可变参数允许方法接收不定数量的同类型参数,简化多参数处理。语法为类型后加...,如int...numbers,内部按数组处理,可遍历或获取长度。必须位于参数列表末尾,每个方法最多一个,不可与其他同类型...并存。可传零个参数(得空数组)或null(需防空指针)。建议配合数组重载提升性能,适用于日志、格式化等场景,避免频繁调用以免创建过多数组影响效率。
-
Java微服务需要Consul进行服务发现,是因为它解决了服务地址硬编码的问题,实现动态注册与自动维护服务列表。通过SpringCloudConsul集成,首先引入相关依赖,其次在主类添加@EnableDiscoveryClient注解,最后配置Consul服务器地址及服务元数据信息,即可实现服务启动时自动注册、健康检查及服务间动态发现,极大提升微服务架构的灵活性与健壮性。此外,Consul还提供健康检查深度集成、KV存储支持动态配置、多数据中心部署等能力。实际应用中需应对网络延迟、实例ID唯一性、ACL
-
数组长度固定、支持基本类型且无泛型,操作受限但性能高;集合长度可变、仅存对象并支持泛型,提供丰富API但有额外开销。
-
Java编译器将捕获变量的lambda表达式编译为带额外参数的静态方法,其调用由invokedynamic指令在运行时动态绑定,通过LambdaMetafactory完成闭包的“部分应用”封装,对调用方完全透明。