最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Java四大常用JSON解析工具性能對(duì)比(Hutool、Fastjson2、Gson與Jackson)

 更新時(shí)間:2025年05月20日 08:50:42   作者:不掉頭發(fā)的阿水  
JSON?是現(xiàn)代軟件開(kāi)發(fā)中常用的數(shù)據(jù)交換格式,尤其在微服務(wù)和前后端分離的架構(gòu)中更是必不可少,本文將對(duì)?Java?中四大主流?JSON?解析庫(kù)進(jìn)行性能測(cè)試和對(duì)比分析,希望對(duì)大家有所幫助

1. 引言

JSON 是現(xiàn)代軟件開(kāi)發(fā)中常用的數(shù)據(jù)交換格式,尤其在微服務(wù)和前后端分離的架構(gòu)中更是必不可少。

本文將對(duì) Java 中四大主流 JSON 解析庫(kù)——Hutool、Fastjson2、Gson 和 Jackson 進(jìn)行性能測(cè)試和對(duì)比分析,通過(guò)實(shí)測(cè) 20 萬(wàn)條數(shù)據(jù)解析,揭示各庫(kù)在批量和逐條處理中的表現(xiàn)。

測(cè)試結(jié)果僅供參考?。?! 請(qǐng)多次測(cè)試再抉擇

2. 環(huán)境與依賴

2.1 環(huán)境信息

操作系統(tǒng):Window11

JDK 版本:jdk1.8.0_281

CPU :  AMD Ryzen 9 7945HX

內(nèi)存:32GB

2.2 Maven依賴

在項(xiàng)目的 pom.xml 文件中引入以下依賴:

      <!-- https://mvnrepository.com/artifact/com.google.code.gson/gson -->
        <dependency>
            <groupId>com.google.code.gson</groupId>
            <artifactId>gson</artifactId>
            <version>2.10.1</version>
        </dependency>
        <!-- https://mvnrepository.com/artifact/com.alibaba.fastjson2/fastjson2 -->
        <dependency>
            <groupId>com.alibaba.fastjson2</groupId>
            <artifactId>fastjson2</artifactId>
            <version>2.0.52</version>
        </dependency>
        <!-- https://mvnrepository.com/artifact/com.fasterxml.jackson.core/jackson-databind -->
        <dependency>
            <groupId>com.fasterxml.jackson.core</groupId>
            <artifactId>jackson-databind</artifactId>
            <version>2.14.2</version>
        </dependency>
        <dependency>
            <groupId>cn.hutool</groupId>
            <artifactId>hutool-all</artifactId>
            <version>5.8.35</version>
        </dependency>
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
        </dependency>

3. 測(cè)試代碼

3.1 數(shù)據(jù)模型

定義一個(gè)簡(jiǎn)單的實(shí)體對(duì)象:

import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
 
/**
 * @author 阿水
 */
@Data
@AllArgsConstructor
@NoArgsConstructor
public class Variable {
    private int id;
    private String name;
    private double value;
    private String description;
    private String type;
}

3.2 測(cè)試數(shù)據(jù)生成

模擬 20 萬(wàn)條數(shù)據(jù)用于測(cè)試:

  // 生成測(cè)試數(shù)據(jù)
    public static List<Variable> generateData(int size) {
        List<Variable> list = new ArrayList<>(size);
        for (int i = 0; i < size; i++) {
            Variable data = new Variable();
            data.setId(i);
            data.setName("Name" + i);
            data.setValue(Math.random() * 1000);
            data.setDescription(IdUtil.fastSimpleUUID());
            data.setType(IdUtil.fastSimpleUUID()+i);
            list.add(data);
        }
        return list;
    }

3.3 四大庫(kù)序列化與反序列化測(cè)試

import cn.hutool.core.util.IdUtil;
import cn.hutool.json.JSONUtil;
import com.alibaba.fastjson2.JSON;
import com.fasterxml.jackson.core.type.TypeReference;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.google.gson.Gson;
import com.google.gson.reflect.TypeToken;
import lombok.extern.slf4j.Slf4j;
import java.util.ArrayList;
import java.util.List;
import java.util.stream.Collectors;
 
/**
 * @description: JSON 序列化、解析性能測(cè)試
 * @author 阿水
 */
@Slf4j
public class JsonBenchmarkTest {
    //數(shù)據(jù)總條數(shù)
    public static int dataSize = 200000;
    //測(cè)試次數(shù)
    public static  int iterations = 10;
 
    public static void main(String[] args) throws Exception {
        // 生成測(cè)試數(shù)據(jù)
        List<Variable> testData = generateData(dataSize);
        log.info("測(cè)試數(shù)據(jù)總條數(shù)為: {} 條", dataSize);
        log.info("以下測(cè)試結(jié)果均為進(jìn)行 {} 次計(jì)算之后,耗費(fèi)時(shí)間取平均值計(jì)算得出。", iterations);
        // 序列化測(cè)試
        String jsonString = serializationTest(testData);
        log.info("JSON 數(shù)據(jù)總大小為: {} 字節(jié)", jsonString.length());
 
        // 批量解析測(cè)試
        log.info("===== 使用批量解析 JSON(即解析集合API)=====");
        batchParseTest(jsonString);
 
        // 單條解析測(cè)試
        log.info("===== 循環(huán)遍歷逐個(gè)解析 JSON API =====");
        singleParseTest(jsonString);
 
        // 單條解析并插入集合測(cè)試
        log.info("===== 循環(huán)遍歷逐個(gè)解析 JSON并插入集合 API=====");
        singleParseAndAddListTest(jsonString);
    }
    // 生成測(cè)試數(shù)據(jù)
    public static List<Variable> generateData(int size) {
        List<Variable> list = new ArrayList<>(size);
        for (int i = 0; i < size; i++) {
            Variable data = new Variable();
            data.setId(i);
            data.setName("Name" + i);
            data.setValue(Math.random() * 1000);
            data.setDescription(IdUtil.fastSimpleUUID());
            data.setType(IdUtil.fastSimpleUUID()+i);
            list.add(data);
        }
        return list;
    }
    /**
     * 序列化測(cè)試
     */
    private static String serializationTest(List<Variable> testData) throws Exception {
        String jsonResult = null;
        // Hutool
        long hutoolTotal = 0;
        for (int i = 0; i < iterations; i++) {
            long start = System.currentTimeMillis();
            String hutoolJson = JSONUtil.toJsonStr(testData);
            long end = System.currentTimeMillis();
            hutoolTotal += (end - start);
            if (i == 0) jsonResult = hutoolJson; // 保存結(jié)果
        }
        log.info("HuTool 序列化平均耗時(shí): {} ms", hutoolTotal / iterations);
 
        // Fastjson2
        long fastjsonTotal = 0;
        for (int i = 0; i < iterations; i++) {
            long start = System.currentTimeMillis();
            String fastjsonJson = JSON.toJSONString(testData);
            long end = System.currentTimeMillis();
            fastjsonTotal += (end - start);
        }
        log.info("Fastjson2 序列化平均耗時(shí): {} ms", fastjsonTotal / iterations);
 
        // Gson
        Gson gson = new Gson();
        long gsonTotal = 0;
        for (int i = 0; i < iterations; i++) {
            long start = System.currentTimeMillis();
            String gsonJson = gson.toJson(testData);
            long end = System.currentTimeMillis();
            gsonTotal += (end - start);
        }
        log.info("Gson 序列化平均耗時(shí): {} ms", gsonTotal / iterations);
 
        // Jackson
        ObjectMapper objectMapper = new ObjectMapper();
        long jacksonTotal = 0;
        for (int i = 0; i < iterations; i++) {
            long start = System.currentTimeMillis();
            String jacksonJson = objectMapper.writeValueAsString(testData);
            long end = System.currentTimeMillis();
            jacksonTotal += (end - start);
        }
        log.info("Jackson 序列化平均耗時(shí): {} ms", jacksonTotal / iterations);
 
        return jsonResult;
    }
 
    /**
     * 批量解析測(cè)試
     */
    private static void batchParseTest(String jsonString) throws Exception {
        // Hutool
        long hutoolTotal = 0;
        for (int i = 0; i < iterations; i++) {
            long start = System.currentTimeMillis();
            List<Variable> result = JSONUtil.toList(JSONUtil.parseArray(jsonString), Variable.class);
            long end = System.currentTimeMillis();
            hutoolTotal += (end - start);
        }
        log.info("HuTool 批量解析平均耗時(shí): {} ms", hutoolTotal / iterations);
 
        // Fastjson2
        long fastjsonTotal = 0;
        for (int i = 0; i < iterations; i++) {
            long start = System.currentTimeMillis();
            List<Variable> result = JSON.parseArray(jsonString, Variable.class);
            long end = System.currentTimeMillis();
            fastjsonTotal += (end - start);
        }
        log.info("Fastjson2 批量解析平均耗時(shí): {} ms", fastjsonTotal / iterations);
 
        // Gson
        Gson gson = new Gson();
        long gsonTotal = 0;
        for (int i = 0; i < iterations; i++) {
            long start = System.currentTimeMillis();
            List<Variable> result = gson.fromJson(jsonString, new TypeToken<List<Variable>>() {}.getType());
            long end = System.currentTimeMillis();
            gsonTotal += (end - start);
        }
        log.info("Gson 批量解析平均耗時(shí): {} ms", gsonTotal / iterations);
 
        // Jackson
        ObjectMapper objectMapper = new ObjectMapper();
        long jacksonTotal = 0;
        for (int i = 0; i < iterations; i++) {
            long start = System.currentTimeMillis();
            List<Variable> result = objectMapper.readValue(jsonString, new TypeReference<List<Variable>>() {});
            long end = System.currentTimeMillis();
            jacksonTotal += (end - start);
        }
        log.info("Jackson 批量解析平均耗時(shí): {} ms", jacksonTotal / iterations);
    }
 
    /**
     * 單條解析測(cè)試
     */
    private static void singleParseTest(String jsonString) throws Exception {
        List<String> messageList = JSON.parseArray(jsonString, Variable.class).stream()
                .map(JSON::toJSONString)
                .collect(Collectors.toList());
        // Hutool
        long hutoolTotal = 0;
        for (int i = 0; i < iterations; i++) {
            long start = System.currentTimeMillis();
            for (String msg : messageList) {
                Variable v = JSONUtil.toBean(msg, Variable.class);
            }
            long end = System.currentTimeMillis();
            hutoolTotal += (end - start);
        }
        log.info("HuTool 單條解析平均耗時(shí): {} ms", hutoolTotal / iterations);
 
        // Fastjson2
        long fastjsonTotal = 0;
        for (int i = 0; i < iterations; i++) {
            long start = System.currentTimeMillis();
            for (String msg : messageList) {
                Variable v = JSON.parseObject(msg, Variable.class);
            }
            long end = System.currentTimeMillis();
            fastjsonTotal += (end - start);
        }
        log.info("Fastjson2 單條解析平均耗時(shí): {} ms", fastjsonTotal / iterations);
 
        // Gson
        Gson gson = new Gson();
        long gsonTotal = 0;
        for (int i = 0; i < iterations; i++) {
            long start = System.currentTimeMillis();
            for (String msg : messageList) {
                Variable v = gson.fromJson(msg, Variable.class);
            }
            long end = System.currentTimeMillis();
            gsonTotal += (end - start);
        }
        log.info("Gson 單條解析平均耗時(shí): {} ms", gsonTotal / iterations);
 
        // Jackson
        ObjectMapper objectMapper = new ObjectMapper();
        long jacksonTotal = 0;
        for (int i = 0; i < iterations; i++) {
            long start = System.currentTimeMillis();
            for (String msg : messageList) {
                Variable v = objectMapper.readValue(msg, Variable.class);
            }
            long end = System.currentTimeMillis();
            jacksonTotal += (end - start);
        }
        log.info("Jackson 單條解析平均耗時(shí): {} ms", jacksonTotal / iterations);
    }
    /**
     * 循環(huán)遍歷單條解析并插入集合測(cè)試
     */
    /**
     * 循環(huán)遍歷單條解析并插入集合測(cè)試 (平均耗時(shí)計(jì)算)
     */
    static void singleParseAndAddListTest(String jsonString) throws Exception {
        // 轉(zhuǎn)換為模擬 MQ 消息體
        List<String> messageList = JSON.parseArray(jsonString, Variable.class).stream()
                .map(JSON::toJSONString) // 將每個(gè)對(duì)象轉(zhuǎn)為 JSON 字符串模擬單條消息
                .collect(Collectors.toList());
 
        // 平均耗時(shí)變量定義
        double hutoolTotalTime = 0;
        double fastjsonTotalTime = 0;
        double gsonTotalTime = 0;
        double jacksonTotalTime = 0;
 
        // 循環(huán) 10 次計(jì)算平均耗時(shí)
        for (int i = 0; i < iterations; i++) {
 
            // 1. Hutool JSONUtil 單條解析
            List<Variable> hutoolList = new ArrayList<>();
            long hutoolStart = System.currentTimeMillis();
            for (String msg : messageList) {
                Variable v = JSONUtil.toBean(msg, Variable.class);
                hutoolList.add(v); // 將對(duì)象存入集合
            }
            long hutoolEnd = System.currentTimeMillis();
            hutoolTotalTime += (hutoolEnd - hutoolStart);
 
            // 2. Fastjson2 單條解析
            List<Variable> fastjsonList = new ArrayList<>();
            long fastjsonStart = System.currentTimeMillis();
            for (String msg : messageList) {
                Variable v = JSON.parseObject(msg, Variable.class);
                fastjsonList.add(v);
            }
            long fastjsonEnd = System.currentTimeMillis();
            fastjsonTotalTime += (fastjsonEnd - fastjsonStart);
 
            // 3. Gson 單條解析
            List<Variable> gsonList = new ArrayList<>();
            Gson gson = new Gson();
            long gsonStart = System.currentTimeMillis();
            for (String msg : messageList) {
                Variable v = gson.fromJson(msg, Variable.class);
                gsonList.add(v);
            }
            long gsonEnd = System.currentTimeMillis();
            gsonTotalTime += (gsonEnd - gsonStart);
 
            // 4. Jackson 單條解析
            List<Variable> jacksonList = new ArrayList<>();
            ObjectMapper objectMapper = new ObjectMapper();
            long jacksonStart = System.currentTimeMillis();
            for (String msg : messageList) {
                Variable v = objectMapper.readValue(msg, Variable.class);
                jacksonList.add(v);
            }
            long jacksonEnd = System.currentTimeMillis();
            jacksonTotalTime += (jacksonEnd - jacksonStart);
        }
 
        // 輸出平均耗時(shí)結(jié)果
        log.info("HuTool 單條解析并存入集合平均耗時(shí): {} ms", hutoolTotalTime / iterations);
        log.info("Fastjson2 單條解析并存入集合平均耗時(shí): {} ms", fastjsonTotalTime / iterations);
        log.info("Gson 單條解析并存入集合平均耗時(shí): {} ms", gsonTotalTime / iterations);
        log.info("Jackson 單條解析并存入集合平均耗時(shí): {} ms", jacksonTotalTime / iterations);
    }
 
}

4.結(jié)果分析

20W條數(shù)據(jù)、31098673字節(jié)測(cè)試結(jié)果分析(僅供參考 僅供參考 僅供參考 !?。。?/strong>

庫(kù)名稱序列化+反序列化總耗時(shí)性能排名
Fastjson2110ms左右第一名
Jackson170ms左右第二名
Gson210ms左右第三名
Hutool1800ms左右第四名

5. 性能分析與總結(jié)

測(cè)試結(jié)果分析

1.Fastjson2

  • 性能表現(xiàn): 測(cè)試結(jié)果中,無(wú)論是批量解析、逐條解析還是逐條解析并插入集合,它的速度都是最快的(30ms、39ms、39.8ms)。
  • 特性優(yōu)勢(shì): 支持復(fù)雜對(duì)象結(jié)構(gòu)解析,API 設(shè)計(jì)簡(jiǎn)潔高效,并修復(fù)了舊版 Fastjson 的反序列化漏洞,安全性更高。
  • 適用場(chǎng)景: 高并發(fā)、大數(shù)據(jù)量處理及性能敏感型應(yīng)用場(chǎng)景。

2.Hutool

  • 性能表現(xiàn): 表現(xiàn)最慢,尤其在批量解析(637ms)和逐條解析(589ms)中遠(yuǎn)落后于其他庫(kù)。
  • 特性優(yōu)勢(shì): API 優(yōu)雅輕便,開(kāi)發(fā)效率高,但性能瓶頸明顯,不適合超大規(guī)模數(shù)據(jù)解析。
  • 適用場(chǎng)景: 適合中小規(guī)模項(xiàng)目的快速開(kāi)發(fā),便捷性優(yōu)先于性能要求的場(chǎng)合。

3.Jackson

  • 性能表現(xiàn): 表現(xiàn)較優(yōu),解析速度僅次于 Fastjson2(78ms、101ms、99.8ms),兼顧性能與功能復(fù)雜性。
  • 特性優(yōu)勢(shì): 支持復(fù)雜 Java 對(duì)象和自定義配置,兼容性強(qiáng),適合復(fù)雜數(shù)據(jù)結(jié)構(gòu)映射需求。
  • 適用場(chǎng)景: 企業(yè)級(jí)應(yīng)用、大型復(fù)雜系統(tǒng)開(kāi)發(fā)及對(duì)靈活性要求高的項(xiàng)目。

4.Gson

  • 性能表現(xiàn): 性能優(yōu)于 Hutool,但低于 Fastjson2 和 Jackson(93ms、119ms、119.5ms)。
  • 特性優(yōu)勢(shì): API 簡(jiǎn)單直觀,開(kāi)發(fā)成本低,但在大數(shù)據(jù)量或高并發(fā)處理時(shí)性能表現(xiàn)不夠理想。
  • 適用場(chǎng)景: 小規(guī)模數(shù)據(jù)解析需求,或?qū)π阅芤蟛桓叩娜蝿?wù)。

6. 推薦選擇

求類型推薦庫(kù)適用場(chǎng)景描述
性能優(yōu)先Fastjson2在所有測(cè)試場(chǎng)景中速度最快,適合高性能和高并發(fā)場(chǎng)景,適合日志分析、大數(shù)據(jù)處理和消息隊(duì)列數(shù)據(jù)解析等應(yīng)用
輕量便捷Hutool更適合中小規(guī)模項(xiàng)目的快速開(kāi)發(fā),雖然性能較低,但 API 優(yōu)雅輕便,適合便捷性優(yōu)先的場(chǎng)合
功能復(fù)雜需求Jackson兼顧性能與靈活性,支持復(fù)雜數(shù)據(jù)結(jié)構(gòu)和自定義配置,適合大型企業(yè)級(jí)應(yīng)用或復(fù)雜對(duì)象映射需求
簡(jiǎn)單解析需求GsonAPI 簡(jiǎn)潔易用,適合小規(guī)模數(shù)據(jù)解析任務(wù),學(xué)習(xí)成本低,但不適合大數(shù)據(jù)和高并發(fā)需求

7. 結(jié)論與建議

Fastjson2:

  • 性能最高,適合高并發(fā)與大數(shù)據(jù)處理需求。
  • 安全性較高,是性能敏感應(yīng)用的首選。

Hutool:

  • 開(kāi)發(fā)便捷但性能較低,適合中小規(guī)模項(xiàng)目。
  • 如果對(duì)開(kāi)發(fā)效率要求高且數(shù)據(jù)量適中,可以選擇它。

Jackson:

  • 性能與靈活性兼顧,適合復(fù)雜對(duì)象和企業(yè)級(jí)系統(tǒng)。
  • 面向需要自定義解析規(guī)則的場(chǎng)景表現(xiàn)更出色。

Gson:

  • 簡(jiǎn)單易用但性能低于 Fastjson2 和 Jackson。
  • 適合小型項(xiàng)目或?qū)π阅芤蟛桓叩膱?chǎng)合。

注意事項(xiàng)

  • 安全性: Fastjson2 安全性最佳,其他庫(kù)需關(guān)注版本更新,以避免反序列化漏洞。
  • 兼容性: Jackson 在跨平臺(tái)兼容性和復(fù)雜結(jié)構(gòu)處理方面表現(xiàn)更佳。
  • 性能評(píng)估: 項(xiàng)目正式使用前,應(yīng)基于實(shí)際生產(chǎn)環(huán)境進(jìn)行更大規(guī)模的性能測(cè)試和壓力測(cè)試。

僅當(dāng)前測(cè)試數(shù)據(jù)明確顯示:

  • Fastjson2 性能最佳,適合高性能需求。
  • Hutool 性能最慢,更適合便捷開(kāi)發(fā)而非大規(guī)模數(shù)據(jù)解析。
  • Jackson 在性能和靈活性之間取得平衡,適合復(fù)雜應(yīng)用場(chǎng)景。
  • Gson 表現(xiàn)優(yōu)于 Hutool,但略遜于 Fastjson2 和 Jackson,適合輕量級(jí)需求。

到此這篇關(guān)于Java四大常用JSON解析工具性能對(duì)比(Hutool、Fastjson2、Gson與Jackson)的文章就介紹到這了,更多相關(guān)Java解析JSON內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • java構(gòu)造器 默認(rèn)構(gòu)造方法及參數(shù)化構(gòu)造方法

    java構(gòu)造器 默認(rèn)構(gòu)造方法及參數(shù)化構(gòu)造方法

    構(gòu)造器也叫構(gòu)造方法、構(gòu)造函數(shù),是一種特殊類型的方法,負(fù)責(zé)類中成員變量(域)的初始化。構(gòu)造器的用處是在創(chuàng)建對(duì)象時(shí)執(zhí)行初始化,當(dāng)創(chuàng)建一個(gè)對(duì)象時(shí),系統(tǒng)會(huì)為這個(gè)對(duì)象的實(shí)例進(jìn)行默認(rèn)的初始化,下面文章將進(jìn)入講解,需要的朋友可以參考下
    2021-10-10
  • 深入理解Spring bean加載順序

    深入理解Spring bean加載順序

    在默認(rèn)配置下,SpringBean的加載順序主要受到Bean定義順序、依賴關(guān)系和生命周期回調(diào)方法的影響,本文就來(lái)了解一下Spring bean加載順序,感興趣的同學(xué)可以學(xué)習(xí)
    2024-10-10
  • SpringBoot+SpringSecurity實(shí)現(xiàn)基于真實(shí)數(shù)據(jù)的授權(quán)認(rèn)證

    SpringBoot+SpringSecurity實(shí)現(xiàn)基于真實(shí)數(shù)據(jù)的授權(quán)認(rèn)證

    Spring Security是一個(gè)功能強(qiáng)大且高度可定制的身份驗(yàn)證和訪問(wèn)控制框架,Spring Security主要做兩個(gè)事情,認(rèn)證、授權(quán)。這篇文章主要介紹了SpringBoot+SpringSecurity實(shí)現(xiàn)基于真實(shí)數(shù)據(jù)的授權(quán)認(rèn)證,需要的朋友可以參考下
    2021-05-05
  • Spring?Boot集成LiteFlow規(guī)則引擎的詳細(xì)過(guò)程

    Spring?Boot集成LiteFlow規(guī)則引擎的詳細(xì)過(guò)程

    本文詳細(xì)介紹了如何在Spring?Boot應(yīng)用程序中集成LiteFlow規(guī)則引擎,并探討如何使用LiteFlow庫(kù)來(lái)實(shí)現(xiàn)業(yè)務(wù)流程的規(guī)則處理,將通過(guò)具體的示例來(lái)展示如何在Spring?Boot應(yīng)用程序中配置和使用LiteFlow規(guī)則引擎,以提高系統(tǒng)的靈活性和可維護(hù)性,感興趣的朋友跟隨小編一起看看吧
    2024-07-07
  • MyBatis自定義類型轉(zhuǎn)換器實(shí)現(xiàn)加解密

    MyBatis自定義類型轉(zhuǎn)換器實(shí)現(xiàn)加解密

    這篇文章主要介紹了MyBatis自定義類型轉(zhuǎn)換器實(shí)現(xiàn)加解密的相關(guān)資料,需要的朋友可以參考下
    2016-07-07
  • java解析xml之dom4j解析xml示例分享

    java解析xml之dom4j解析xml示例分享

    DOM4J具有性能優(yōu)異、功能強(qiáng)大和極端易用使用的特點(diǎn),只要懂得DOM基本概念,就可以通過(guò)dom4j的api文檔來(lái)解析xml,dom4j是一套開(kāi)源的api。實(shí)際項(xiàng)目中,往往選擇dom4j來(lái)作為解析xml的利器
    2014-01-01
  • Java反射的定義和用法詳解

    Java反射的定義和用法詳解

    Java中的反射是指在程序運(yùn)行時(shí)動(dòng)態(tài)地獲取和操作類、方法、屬性等元素的能力。它使得我們可以在程序運(yùn)行時(shí)獲取一個(gè)類的信息,并對(duì)其進(jìn)行操作,需要的朋友可以參考下
    2023-05-05
  • java集合Collection常用方法解讀

    java集合Collection常用方法解讀

    這篇文章主要介紹了java集合Collection常用方法解讀,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-03-03
  • Java中將List列表轉(zhuǎn)換為字符串的三種方法

    Java中將List列表轉(zhuǎn)換為字符串的三種方法

    這篇文章主要介紹了如何在 Java中將List 轉(zhuǎn)換為 String,接下來(lái)使用Java 8 Streams Collectors api和String.join()方法將帶有逗號(hào)分隔符或自定義分隔符的集合轉(zhuǎn)換為字符串,需要的朋友可以參考下
    2025-04-04
  • Java 實(shí)戰(zhàn)項(xiàng)目錘煉之醫(yī)院門診收費(fèi)管理系統(tǒng)的實(shí)現(xiàn)流程

    Java 實(shí)戰(zhàn)項(xiàng)目錘煉之醫(yī)院門診收費(fèi)管理系統(tǒng)的實(shí)現(xiàn)流程

    讀萬(wàn)卷書(shū)不如行萬(wàn)里路,只學(xué)書(shū)上的理論是遠(yuǎn)遠(yuǎn)不夠的,只有在實(shí)戰(zhàn)中才能獲得能力的提升,本篇文章手把手帶你用java+html+jdbc+mysql實(shí)現(xiàn)一個(gè)醫(yī)院門診收費(fèi)管理系統(tǒng),大家可以在過(guò)程中查缺補(bǔ)漏,提升水平
    2021-11-11

最新評(píng)論

永平县| 温泉县| 沾化县| 沅陵县| 芜湖县| 建始县| 禄劝| 巴林左旗| 苍山县| 拜城县| 政和县| 三原县| 鄂托克前旗| 株洲县| 天水市| 修水县| 徐闻县| 石景山区| 雷州市| 阿拉善左旗| 甘肃省| 青州市| 兴义市| 进贤县| 三穗县| 股票| 邵武市| 吐鲁番市| 甘孜县| 昌吉市| 尼勒克县| 福州市| 榆社县| 浦江县| 绥宁县| 荆州市| 武冈市| 宁明县| 湛江市| 抚远县| 宜兴市|