加载中

Java

文章分类

浏览该分类下的所有文章

237 篇文章 20

什么是桥接方法?

桥接方法是 JDK 1.5 引入泛型后,为保持新旧字节码兼容而由编译器自动生成的合成方法,字节码中标记为 ACC_BRIDGE 与 ACC_SYNTHETIC,可通过 Method.isBridge() 判断。产生情形主要有两种:①实现带泛型的接口(如 Consumer<T>、Supplier<T>、Function<T,R>),编译后会生成返回 Object 或接受 Object 的桥接方法;②在子类覆盖父类方法并升级返回类型(协变返回),编译器同样生成桥接方法。参数类型、访问修饰符的改变以及静态方法均不会产生桥接方法。桥接方法的作用是弥补泛型擦除后方法签名的差异,保证运行时多态行为与编译期类型检查的一致性,从而实现向前兼容。

什么是类型擦除?

Java 泛型在编译后会被类型擦除,运行时所有泛型信息都转为普通类型。未限定的类型参数被擦除为 Object,有上限的则被替换为上限类型(如 CharSequence)。因此不同泛型实例在 JVM 中属于同一类,字段实际类型均为擦除后的类型。利用反射可以绕过编译期检查,在已擦除的集合中插入不匹配的元素,体现了“伪泛型”的特性。

什么是PECS?

PECS 法则是 Java 泛型中处理生产者(Producer)和消费者(Consumer)的原则。`? extends T` 表示协变,只能从集合读取 T(或子类),不能写入;`? super T` 表示逆变,只能向集合写入 T(或子类),读取只能得到 Object。示例中 `List<? extends Fruit>` 只能取 Fruit,`List<? super Fruit>` 只能放 Fruit 或其子类。数组在 Java 中是协变的。Kotlin 用 `out`/`in` 表达同样的协变/逆变,并通过 `inline` + `reified` 实现运行时泛型信息。若既要写入又要读取,需使用具体类型而非通配符。

什么是类型通配符?

类型通配符用于统一表示不同泛型 List 的父类,分为三类: ① 无界通配符 `<?>`,元素类型未知,能指向任何 List,但不能向其中写入元素; ② 上界通配符 `<? extends T>`,表示 List 中元素为 T 或其子类,如 `List<? extends Number>` 可指向 `List<Number>`、`List<Integer>` 等; ③ 下界通配符 `<? super T>`,表示 List 中元素为 T 或其父类,如 `List<? super Number>` 可指向 `List<Number>`、`List<Object>`。文中通过示例代码演示了这三种通配符的声明方式及其适用的泛型实例。

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

Redis提供两种持久化方式:RDB快照通过save/bgsave生成二进制文件,利用写时复制避免阻塞;AOF记录每条写命令,可配置fsync策略并支持重写压缩。Redis 4.0引入混合持久化,将RDB前置与增量AOF合并,提高重启速度。生产环境可同时开启RDB和AOF,恢复时优先使用AOF。备份建议定时复制并跨机保存。主从复制通过PSYNC实现全量或增量同步,支持断点续传,防止复制风暴。文中给出从节点配置步骤、Jedis连接池示例,以及Pipeline和Lua脚本的用法,强调其降低网络开销和实现原子操作的优势。

JVM垃圾收集器G1&ZGC

G1(-XX:+UseG1GC)面向多核大内存服务器,将堆划分为最多2048个等大小Region,保留分代但Region可在新老代间动态切换。通过并发标记、STW初始/最终标记和基于回收价值的筛选回收,优先回收收益最高的Region,实现可预测的停顿(‑XX:MaxGCPauseMillis),适合8 GB 以上、停顿要求 500 ms 以内的业务。ZGC(-XX:+UseZGC)是 JDK 11 引入的低延迟收集器,采用单代、基于 Region 的并发标记‑整理,利用颜色指针和读屏障实现对象“自愈”,停顿始终 ≤10 ms,支持 TB 级堆并感知 NUMA。两者均通过并行/并发技术提升吞吐,G1 适合可调停顿的常规场景,ZGC 则侧重极端低延迟与超大堆内存。

Nacos 注册中心的心跳机制

微服务启动后,内置的 Nacos 客户端每 5 秒向 Nacos Server 的 /nacos/v1/ns/instance/beat 接口发送一次心跳,携带实例名称、IP、端口、集群、权重等信息。Server 的 naming 模块收到心跳后,先判断实例是否已存在,若不存在则注册并存入实例 Map;若已存在则更新心跳时间、标记为健康并推送状态变更消息,随后返回下次心跳间隔。为防止无效实例滞留,Server 每 20 秒扫描实例 Map,删除所有非健康实例,从而实现对服务实例的动态注册、健康检查和自动剔除。

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

文章系统阐述JVM整体结构与内存模型,解释minor GC时对象复制后引用的更新机制;详细列举常用JVM参数含义及调优方法,如‑Xms、‑Xmx、‑Xmn、‑Xss、MetaspaceSize等,并通过StackOverflowError示例说明‑Xss对栈大小的影响。最后给出高并发订单系统的内存参数配置原则:让对象尽量在新生代分配回收,避免频繁晋升老年代,并提供实际参数示例。

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

本文介绍了在 Java 中对 List 去重的五种实现方式:① 利用 LinkedHashSet 既去重又保序;② 使用 Java 8 Stream 的 distinct() 再收集为 List;③ 通过 HashSet 的 add 返回值在遍历中筛选唯一元素;④ 采用 List 的 contains 检查避免重复插入;⑤ 传统的双层循环比较并删除相同元素。每种方法均给出代码示例及适用场景。