加载中

Java

文章分类

浏览该分类下的所有文章

237 篇文章 20

什么是桥接方法?

桥接方法是 JDK 1.5 为实现泛型向前兼容而由编译器自动生成的合成方法,在字节码中标记为 ACC_BRIDGE 与 ACC_SYNTHETIC。它在以下情况下出现:①实现了带类型参数的接口或抽象类,编译后会生成返回 Object 或 Object 参数的桥接实现;②子类覆盖父类方法且返回类型向上转型(协变返回),编译器生成返回 Object 的桥接方法。参数类型、访问修饰符或 static 方法的改变均不会产生桥接方法。桥接方法的作用是弥补泛型擦除后方法签名不匹配的问题,保证在运行时通过父类或接口引用调用时仍能正确分派到子类的实际实现,从而实现向后兼容并避免类型错误。

什么是类型擦除?

Java 泛型在编译阶段会被擦除,进入 JVM 后所有类型参数都消失,未限定的泛型被替换为 Object,限定的则替换为其上限(如 CharSequence)。因此不同泛型实例在运行时属于同一类,字段的实际类型也是 Object 或上限类型。由于类型擦除,编译时的类型安全可以通过反射绕过,例如使用反射调用 ArrayList 的 add(Object) 方法即可向 Integer 列表中加入字符串。整体说明了 Java 泛型的“伪泛型”本质及其在运行时的表现。

什么是PECS?

PECS(Producer Extends, Consumer Super)是 Java 泛型中处理协变和逆变的准则。使用 `? extends T` 表示只能读取 T 或其子类的元素,写入被禁止;`? super T` 则只能写入 T 或其子类,读取只能得到 Object。文章通过 `List<? extends Fruit>` 与 `List<? super Fruit>` 的代码示例,说明了两者在赋值、添加和取值时的编译限制,并对比了 Kotlin 中的 `out`(只读)和 `in`(只写)变型。还提及数组的协变特性以及 Kotlin 的泛型实化(`inline` + `reified`)能够在运行时保留类型信息。最后总结:读取用 `extends`,写入用 `super`,若需兼顾读写则不使用通配符。

什么是类型通配符?

类型通配符用于表示不同泛型 List 的父类,分为三类:①无界通配符 `<?>`,表示元素类型未知的 List,可匹配任何类型,但不能向其中写入元素;②上界通配符 `<? extends Type>`,如 `List<? extends Number>`,表示元素类型为指定类型或其子类,只能读取,不能写入;③下界通配符 `<? super Type>`,如 `List<? super Number>`,表示元素类型为指定类型或其父类,只能写入,读取时只能得到 Object。示例代码演示了这三种通配符在声明 List 时的合法写法及不合法的情况,帮助理解其约束与使用场景。

Redis持久化、主从与哨兵架构

Redis提供RDB快照和AOF日志两种持久化方式,RDB通过save/bgsave生成二进制快照,bgsave采用写时复制不阻塞;AOF记录每条写命令,可配置fsync策略并支持后台重写;Redis 4.0引入混合持久化,将RDB快照与增量AOF合并加速重启。生产环境常同时开启RDB和AOF,恢复时优先AOF。备份可通过定时复制RDB/AOF并多机保存。主从复制采用PSYNC实现全量或增量同步,支持断点续传,从节点可设为只读。文中还示例了Jedis连接池、Pipeline批量发送及Lua脚本实现原子操作。

JVM垃圾收集器G1&ZGC

G1是服务器用的Region分代收集器,采用复制算法并按回收价值优先选择Region,实现可预期停顿(‑XX:MaxGCPauseMillis),支持大堆、Humongous区及多参数调优,适用于8GB以上、停顿≤500ms的场景。ZGC是JDK11的单代并发标记‑整理收集器,基于不同大小Region、颜色指针和读屏障,实现堆大小无关、10 ms以下低延迟,支持TB级堆并感知NUMA。

Nacos 注册中心的心跳机制

微服务启动后,内置的 Nacos 客户端每 5 秒向 Nacos 服务器的 /nacos/v1/ns/instance/beat 接口发送一次心跳包,携带实例名称、IP、端口、集群、权重等信息。Nacos Server 的 naming 模块收到心跳后,若实例不存在则注册并存入实例 Map;若已存在则更新心跳时间、标记为健康并推送状态变更,随后返回心跳间隔。服务器每 20 秒扫描实例 Map,删除长时间未收到心跳的非健康实例,以实现对无效实例的剔除。

JVM内存模型深度剖析与优化

本文系统阐述了JVM整体结构和内存模型,解析了Minor GC中对象复制与引用更新机制,详细介绍了常用JVM参数(-Xms、-Xmx、-Xmn、-Xss、MetaspaceSize等)的含义与调优方法,并通过StackOverflowError示例说明栈大小对线程数的影响。最后给出高并发订单系统的内存调优原则:尽量让对象在新生代分配回收,避免频繁老年代GC,并预留充足堆空间。

List去除重复数据的五种方式

文章介绍了在Java中对ArrayList去重的五种实现方式:①利用LinkedHashSet既去重又保序;②借助Java 8 Stream的distinct()配合collect;③使用HashSet特性手动保序;④遍历列表并通过contains判断避免重复;⑤最原始的双层for循环删除重复元素。每种方法均附有示例代码和运行结果,帮助读者根据需求选择合适方案。