-
抽象类不能直接实例化,普通类可以;抽象类定义通用结构并强制子类实现抽象方法,普通类封装具体功能;模板方法模式利用该特性将算法骨架放在抽象类中,可变步骤延迟至子类实现。
-
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即可查看文档。
-
Kotlin虽无“构造函数前初始化”的语法糖,但通过属性直接赋值和init块可实现等效行为:属性在主构造函数执行后、init块前完成初始化,语义上与Java的字段初始化时机一致。
-
密码强度校验应优先使用逻辑判断而非纯正则,因正则难以实现动态得分与多类字符组合判断;推荐拆解为长度、大小写、数字、符号、重复等可加权的原子规则,并封装为可测试、可扩展的服务。
-
SubmissionPublisher默认构造不满足生产级背压需求,因其使用共享无界ForkJoinPool、默认缓冲区为MAX_INT(等效无界),导致延迟不可控、背压信号失效、GC压力大及OOM风险。
-
ConcurrentHashMap本身不提供原子性大小限制操作,直接检查size后put会导致竞态条件;需借助外部同步机制(如ReentrantLock)或使用支持容量策略的缓存库(如Caffeine)来实现线程安全的“仅当未达上限时插入”逻辑。