-
NoClassDefFoundError表示编译时类存在但运行时无法加载,主因是类路径缺失目标类、依赖JAR未打包、模块隔离或静态初始化失败;需结合报错类名、classpath实际内容及堆栈根因(如ExceptionInInitializerError)综合排查。
-
SpringGraphQL默认仅暴露/graphql单一端点,无法通过spring.graphql.enabled=false类似配置全局禁用;实际应结合Web安全配置拦截请求,并可选禁用内省(introspection)以增强生产环境安全性。
-
List.of()和Map.of()创建的集合不能add/remove,因为它们返回JVM内置不可变实现类(如ListN、MapN),所有修改操作均直接抛UnsupportedOperationException;不支持null、有参数数量限制(List.of最多10个)、Map.of重复key在Java14+编译期报错;适用于配置项、映射表等只读场景,但不防元素内部可变。
-
CountDownLatch通过计数器实现线程同步,初始化为1时调用countDown可唤醒所有await线程,常用于模拟高并发场景。
-
抽象类不能直接实例化,普通类可以;抽象类定义通用结构并强制子类实现抽象方法,普通类封装具体功能;模板方法模式利用该特性将算法骨架放在抽象类中,可变步骤延迟至子类实现。
-
RandomAccessFile不支持文件空洞技术,seek后write会真实分配磁盘空间并填充零字节;多线程下载需每个线程独占实例、校验206响应、持久化offset并校验分片完整性。
-
继承可能破坏封装,因子类依赖父类实现细节,导致脆弱基类问题;组合通过包含对象实例而非继承,增强封装性与灵活性,推荐优先使用。
-
32位与64位Java的核心区别在于指针长度和内存寻址能力:32位使用4字节指针、最大堆约4GB(Windows下仅1.5–1.8GB),64位使用8字节指针、理论支持18EB内存,实际可配数十GB堆;确认方式包括查看安装路径(x86目录为32位)和java-version输出(含64-Bit标识为64位);JAVA_HOME只能指向一个JDK,但32位与64位应用可共存,需注意Eclipse等工具通过-vm参数指定JDK、Python调用Java时JVM位数须与Python一致;选择依据为:堆需求>2G
-
在Quarkus中使用@InjectMock时,被测类的所有方法默认被空实现覆盖,导致内部方法调用无法触发真实逻辑;需显式配置thenCallRealMethod()才能实现对类内方法(如get())的可控模拟。
-
不能。finally块仅保证执行,不自动关闭资源;需手动在其中用try-catch分别关闭各资源并判空,避免异常中断清理;Java7+推荐try-with-resources,但老代码仍依赖正确编写的finally。
-
多态传递参数通过父类引用调用子类重写方法实现,提升代码扩展性。使用继承或接口定义统一契约,子类提供具体实现,方法接收父类或接口类型参数,运行时动态绑定实际对象,执行对应逻辑。结合集合可批量处理不同子类型,新增类型无需修改原有代码,符合开闭原则。注意只能调用父类声明的方法,避免频繁类型转换,保持设计简洁。
-
本文介绍一种基于进程间持久化通信的方案:让Python脚本长期运行并复用已加载的模块(如TensorFlow、spaCy),Java通过标准输入/输出与其持续交互,从而规避每次调用都重新导入重型库带来的性能损耗。
-
Java多线程面试重在实战经验而非背诵;wait()必须在synchronized块中调用,否则抛IllegalMonitorStateException;ConcurrentHashMapJDK8用CAS+单桶锁替代分段锁;线程池拒绝策略中CallerRunsPolicy更防雪崩;ThreadLocal内存泄漏因key弱引用而value强引用未及时清理。
-
Java多态由继承、方法重写和父类引用指向子类对象三者自然达成,仅对实例方法重写生效,编译时看声明类型,运行时按实际类型动态绑定。
-
Java项目集成Swagger推荐使用SpringDocOpenAPI(Swagger3),需引入springdoc-openapi-starter-webmvc-ui依赖,配置扫描包和UI路径,通过@Tag、@Operation等注解管理接口分组与描述,启动后访问/swagger-ui即可查看文档。