加载中

Java

文章分类

浏览该分类下的所有文章

237 篇文章 20

面试现场【Redis篇】

Redis 4.0 前单线程处理网络 I/O 与 Set/Get,避免锁竞争并使用 epoll 实现高效 I/O;4.0 后引入多线程用于大数据异步删除。持久化提供 AOF(追加日志)和 RDB(快照)两种方式,4.0 还支持二者混合。AOF 先执行命令再写日志,存在数据丢失和阻塞风险;RDB 可通过 save 同步阻塞或 bgsave 子进程异步生成快照,写时复制保证数据可修改。高可用方案包括主从复制、哨兵自动故障转移和 Cluster。Cluster 将键映射至 16384 个哈希槽,采用 CRC16 取模实现节点选择,解决写和存储扩展问题。

每日一题(2022/1/20)

代码演示了 Java 中字符串比较的细节。`s1` 通过 `new String("xiaozou")` 在堆中创建了独立对象,`s2` 直接引用常量池中的字面量,两者地址不同,`s1 == s2` 为 `false`。调用 `s1.intern()` 时,若常量池已有相同内容的字符串,则返回该池中对象的引用,否则将其加入池中。因为常量池已经存在 `"xiaozou"`,`s3` 获得的正是 `s2` 的引用,故 `s2 == s3` 为 `true`。文章通过源码解释说明了 `intern()` 的工作原理及其在字符串共享中的作用。

每日一题(2022/1/19)

本文以“String s = new String("abc")”为例,要求在不改变s引用的前提下使其输出“abcd”。常规做法如StringBuilder.append或String.replace均不可行。正确方案是通过反射获取String内部的private final char[] value字段并修改其内容:使用Field.setAccessible(true)后调用value.set(s, "abcd".toCharArray())。但在JDK 11 及以上运行时会抛出 IllegalArgumentException,提示非法访问并禁止对final字段的修改,这是因为JVM 在编译期已将String 常量化并对其进行优化,反射修改已被限制。

Dubbo最佳实战

本文概述了 Apache Dubbo 的定位与特性,重点阐述了基于 Zookeeper 的服务注册中心及服务治理流程。随后通过完整实战案例,演示了在 Maven 项目中搭建 API、Provider、Consumer 三个模块的步骤:定义共享接口、在提供者中实现并使用 @Service 注解注册服务、配置 Dubbo 与 Zookeeper 参数、编写启动类;在消费者中通过 @Reference 引用接口、配置注册中心并实现调用。文中提供了完整的依赖、配置文件、代码示例及运行流程,帮助读者快速上手 Dubbo 的服务发布与消费。

使用HashMap的注意事项

HashMap 键唯一、值可重复,支持 null 键和值。其底层结构为数组+链表,JDK 8 起在冲突较多时转为红黑树,且不是线程安全的。使用自定义类作键时,必须重写 `hashCode` 与 `equals`:先比较哈希值,再用 `equals` 判断真正相等,否则会出现键重复但实际不同的情况。示例代码演示了未覆写时的异常行为以及正确实现后的结果。

Elasticsearch7.x实战指南

Elasticsearch 7.x 去除 TransportClient,仅支持 High‑level REST Client,type 被简化为默认的 _doc,默认分片数改为 1,节点名取主机名。底层升级至 Lucene 8,加入 Weak‑AND 与 Intervals 查询,优化相关性与词序控制;集群协调子系统重构,移除 minimum_master_nodes,新增熔断机制防止 OOM。本文系统演示了 7.x 的基本操作(索引创建、映射、文档增删改查)及高级特性(geo_point、动态映射、dynamic_templates),并提供常用 Query DSL 示例,帮助开发者快速上手并充分利用新特性。

自定义持久层框架(仿MyBatis)

本文介绍了仿 MyBatis 的自定义持久层框架的整体设计与实现步骤。首先在使用端提供 `sqlMapConfig.xml`(数据源)和 `mapper.xml`(SQL 声明),在框架端通过 `Resources` 将配置文件读取为流,再用 `SqlSessionFactoryBuilder` 结合 `XMLConfigBuilder` 解析 XML,填充 `Configuration` 与 `MappedStatement` 两大 Bean。随后创建 `SqlSessionFactory`(DefaultSqlSession)并提供 `SqlSession` 接口,实现 `selectList`、`selectOne` 等 CRUD 方法,内部封装 JDBC 执行。框架核心采用 Builder、Factory、Proxy 等设计模式。文中还给出 MySQL 表结构、Mapper 示例、实体类以及 Maven 依赖和关键类代码,实现了一个可运行的轻量化 MyBatis 替代品。

LinkedList常用API详解

本文系统梳理了 Java LinkedList 常用 API 的功能与实现细节,重点包括:peek/peekFirst/peekLast 用于获取头、首、尾元素但不删除;poll/pollFirst/pollLast 用于获取并删除相应元素;offer/offerFirst/offerLast 用于在链表尾部、头部或末尾插入新元素。文中通过示例代码演示了这些方法的调用顺序及运行结果,直观展示了 LinkedList 在元素访问、删除和添加方面的行为,帮助读者快速掌握其常用操作。

集合工具类Collections详解

Collections 是 JDK java.util 包下的集合工具类,提供一系列静态方法,帮助对 List、Collection 等进行排序(reverse、shuffle、sort、swap)、查找(binarySearch、max、min、frequency)、填充(fill)等常用操作。它还能通过 synchronizedXxx 返回线程安全的包装集合,避免 ArrayList、HashMap 的并发问题;提供 empty、singleton、unmodifiable 等创建不可变集合的工厂方法;以及 addAll、disjoint 等实用工具。文章通过代码实例演示了这些方法的使用效果,并指出应深入源码了解实现细节,使用 Collections 能提升编码水平,避免自行实现低效代码。

equals方法该如何重写?

文章说明何时需要重写Object的equals方法,何时可以不写,并详细阐述重写时必须遵守的五条原则(自反、对称、传递、一致、非空),以及常见违规例子。随后以AbstractSet的实现为模板,提供编写高质量equals的步骤:先检查引用相等、类型匹配、大小比较,再用containsAll逐域比较,并配合对应的hashCode实现,强调参数类型必须保持Object。

如何使用Java程序读取zip文档?

本文介绍了在 Java 中使用 `ZipInputStream` 读取 ZIP 文档的基本方法。首先在 Maven 中加入 `commons-io` 依赖,然后通过 `ZipFile` 与 `ZipInputStream`(指定 GBK 编码)打开压缩包,使用 `getNextEntry()` 循环遍历每个 `ZipEntry`,打印路径并对非目录且以 `.txt` 结尾的文件读取内容,利用 `IOUtils.readLines` 将流转为字符串列表。代码示例展示了完整的文件读取、文本输出以及资源的安全关闭,运行后可在控制台打印出压缩包内所有文件及 txt 文件内容。

CGLIB与JDK动态代理

CGLIB和JDK动态代理都是为了解耦而产生的代理技术。JDK代理只能为实现接口的类生成基于接口的代理,需要实现InvocationHandler并使用反射;CGLIB则利用ASM字节码框架为目标类生成子类,覆盖非final方法,可对没有接口的类进行代理。Spring默认:bean实现接口时使用JDK代理,未实现接口时使用CGLIB,亦可强制指定。性能上,JDK在JDK6+及调用次数少时更快,CGLIB在大量调用且JDK8以前可能占优,但对final类/方法无能为力。CGLIB的实现核心是Enhancer.create生成子类并通过MethodInterceptor拦截方法,适用于AOP等场景。