-
Java集合对null支持差异显著:ArrayList/LinkedList允许任意位置存null;HashMap/LinkedHashMap允许一个null键和多个null值;TreeMap/TreeSet完全禁止null;ConcurrentHashMap拒绝null键值,CopyOnWriteArrayList允许add(null)。
-
Java9+模块系统默认启用强封装,反射访问JDK内部API(如sun.misc.Unsafe)会抛InaccessibleObjectException;需用--add-opens或模块opens声明授权,或改用VarHandle等官方替代方案。
-
接口默认方法允许在不修改实现类的情况下扩展接口功能,Java8引入该特性以解决接口升级导致的兼容性问题;通过default关键字定义具有默认实现的方法,使旧实现类无需改动即可编译运行。例如,集合框架新增的stream()方法即为默认方法,使所有集合类自动支持流操作。同时,多个接口中的同名默认方法会引发冲突,需在实现类中显式重写并指定调用来源,避免菱形问题。默认方法减少了对抽象类的依赖,增强了API演进能力,是Java支持函数式编程和接口演化的重要改进。
-
继承表达“is-a”关系,如Dog是Animal;误用会导致语义错误和扩展困难;子类构造时父类先初始化;private成员不参与继承;Java只支持单继承,应结合组合与接口使用。
-
魔数须为4字节固定int型(如0x12345678)以区分非法连接,版本字段占1字节便于平滑升级;长度字段紧随其后且定长4字节,表示消息体字节数并校验上限;消息体首选Protobuf,避免嵌套过深,不加应用层分隔符。
-
Phaser更适合动态增减线程数或多轮多阶段同步场景,支持运行时注册/注销参与者,且每阶段可灵活控制参与方;而CountDownLatch不可重置、CyclicBarrier要求固定线程数。
-
静态变量为空通常因类未初始化,而非代码错误;需依据JVM规范确认5种主动引用场景(new、静态方法、非final静态字段、反射、子类初始化)是否触发<clinit>执行。
-
自定义注解配合反射可实现类似Spring的@Autowired效果:先定义@Retention(RUNTIME)和@Target(FIELD)的@AutoWired注解,再通过Injector类用反射遍历字段、设为可访问、获取注解并按类型注入模拟值,最后手动调用inject()完成注入。
-
阈值是串行与并行开销的平衡点,非固定常量,应依数据规模和核数估算(如THRESHOLD≈总元素数÷(核数×4)),并通过实测调优,避开硬编码、阻塞操作及状态共享等陷阱。
-
Java中数字签名核心是遵循非对称加密规范,选用SHA256withRSA等标准算法,正确加载PKCS#8私钥,对UTF-8编码的确定性字节报文调用update()和sign()生成DER签名,并确保验签端算法、密钥、数据字节完全一致。
-
Vector是线程安全的动态数组,通过synchronized方法保证同步,适合低并发场景,但性能较低,扩容可自定义,遍历时仍需注意并发修改问题。
-
卡片式布局不改变XSS防御逻辑,关键在于后端通用模板统一处理用户输入;反射仅用于遍历String字段并自动转义,不能替代过滤逻辑,真正防护依赖转义函数、Wrapper/AOP入参清洗及CSP等多重机制。
-
高效数组循环移位有三法:索引映射法((i+k)%n)、三步翻转法(原地无额外内存)、切片拼接法(简洁易调试);需结合帧结构、符号扩展、向量化及避免隐式拷贝等实战细节。
-
StringTokenizer通过传入含所有分隔符的字符串,将每个字符视为独立分隔符,适合解析混用分隔符的遗留文本;默认跳过空字段,需保留时应改用split;遍历时应先获取countTokens再循环以避免竞态。
-
最可靠的方式是通过类的ProtectionDomain获取CodeSource再提取getLocation(),因其由JVM加载时明确记录来源,语义严谨稳定;Class.getResource("/")易受classloader、fatjar或模块化影响而返回null或不准确。