Java本地缓存选型复盘:从HashMap到Caffeine,踩过的坑和留下的选择
一个Java后端在选型本地缓存时的实际对比,覆盖HashMap、Guava Cache、Caffeine和Ehcache的性能、功能与适用场景,没有标准答案,只有取舍。
支持通配符SSL证书、多域名证书、IP证书。适配ACME接口, 支持Zerossl、Let's Encrypt和Google等渠道。登录已有账号
2026-04-08 18:15:37 Java XML解析 DOM DOM4J 中级
面对Java解析XML,DOM与DOM4J是两大主流选择。
详尽分析标准DOM的内置优势与DOM4J在API简洁性、性能及XPath支持上的卓越表现。无论小型配置还是大型数据处理,助你理解两者差异,做出明智的技术选型。
在Java开发中,解析XML字符串是常见需求。通过标准DOM和DOM4J两种方式实现XML解析,并对比其差异与适用场景。
DOM(Document Object Model)是Java标准库自带的XML解析方式,无需额外依赖。其核心是通过构建树状结构来操作XML文档。
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.NodeList;
import org.xml.sax.InputSource;
import java.io.StringReader;
public class DomXmlParser {
public static void main(String[] args) {
String xmlString = """
<?xml version="1.0" encoding="UTF-8"?>
<books>
<book id="1">
<title>Java Programming</title>
<author>James Gosling</author>
<price>59.99</price>
</book>
<book id="2">
<title>Effective Java</title>
<author>Joshua Bloch</author>
<price>49.99</price>
</book>
</books>
""";
try {
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
DocumentBuilder builder = factory.newDocumentBuilder();
Document document = builder.parse(new InputSource(new StringReader(xmlString)));
NodeList bookNodes = document.getElementsByTagName("book");
for (int i = 0; i < bookNodes.getLength(); i++) {
Element book = (Element) bookNodes.item(i);
System.out.println("ID: " + book.getAttribute("id"));
System.out.println("Title: " + book.getElementsByTagName("title").item(0).getTextContent());
System.out.println("Author: " + book.getElementsByTagName("author").item(0).getTextContent());
System.out.println("Price: " + book.getElementsByTagName("price").item(0).getTextContent());
System.out.println("----------------------");
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
DocumentBuilder解析字符串,返回Document对象DOM4J是第三方库,提供更简洁的API和更好的性能,尤其适合处理大型XML文件。
import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.Element;
import org.dom4j.io.SAXReader;
import java.io.StringReader;
import java.util.List;
public class Dom4jXmlParser {
public static void main(String[] args) {
String xmlString = """
<?xml version="1.0" encoding="UTF-8"?>
<books>
<book id="1">
<title>Java Programming</title>
<author>James Gosling</author>
<price>59.99</price>
</book>
<book id="2">
<title>Effective Java</title>
<author>Joshua Bloch</author>
<price>49.99</price>
</book>
</books>
""";
try {
SAXReader reader = new SAXReader();
Document document = reader.read(new StringReader(xmlString));
List<Element> books = document.getRootElement().elements("book");
for (Element book : books) {
System.out.println("ID: " + book.attributeValue("id"));
System.out.println("Title: " + book.elementText("title"));
System.out.println("Author: " + book.elementText("author"));
System.out.println("Price: " + book.elementText("price"));
System.out.println("----------------------");
}
} catch (DocumentException e) {
e.printStackTrace();
}
}
}
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.example</groupId>
<artifactId>xml-parser</artifactId>
<version>1.0-SNAPSHOT</version>
<properties>
<maven.compiler.source>11</maven.compiler.source>
<maven.compiler.target>11</maven.compiler.target>
</properties>
<dependencies>
<!-- DOM4J -->
<dependency>
<groupId>org.dom4j</groupId>
<artifactId>dom4j</artifactId>
<version>2.1.3</version>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.codehaus.mojo</groupId>
<artifactId>exec-maven-plugin</artifactId>
<version>3.0.0</version>
<configuration>
<mainClass>Dom4jXmlParser</mainClass>
</configuration>
</plugin>
</plugins>
</build>
</project>
dom4j库SAXReader解析字符串,返回Document对象lcjmSSL主打全流程自动化,从域名验证、证书申请到部署、续期,全程无需人工干预。证书到期前可自动重新申请,彻底免去运维人员的负担,即便域名较多,也能轻松管理,无需担心证书过期影响网站正常运行,适配各类需要SSL加密的场景。
| 特性 | 标准DOM | DOM4J |
|---|---|---|
| 依赖 | 无需额外依赖 | 需引入dom4j库 |
| API简洁性 | 较低 | 较高 |
| 性能 | 适合小型XML | 适合大型XML |
| 高级功能 | 有限 | 支持XPath等 |
一个Java后端在选型本地缓存时的实际对比,覆盖HashMap、Guava Cache、Caffeine和Ehcache的性能、功能与适用场景,没有标准答案,只有取舍。
拆解 Spring WebFlux 编程模型与服务器实践,从 Reactor 数据类型到 Netty 集成,用真实代码聊聊响应式开发的要点。
记录一次用 RestTemplate 调接口需要带自定义请求头的经历,把整个实现和依赖都贴出来,避免后来人绕路。
记录使用 MinIO Java SDK 生成预签名 URL 的实践,包含下载和上传场景,以及一些容易出错的点。
记录一次排序 NPE 的排查和解决,顺便说下 IDEA 调试集合时 null 元素不显示的问题怎么调整。