欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Java中十進(jìn)制字符串轉(zhuǎn)十六進(jìn)制的性能解讀

 更新時(shí)間:2025年05月19日 08:45:32   作者:CnLg.NJ  
這篇文章主要介紹了Java中十進(jìn)制字符串轉(zhuǎn)十六進(jìn)制的性能解讀,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教

在 Java 中優(yōu)化十進(jìn)制字符串轉(zhuǎn)十六進(jìn)制的性能,可以從減少對(duì)象創(chuàng)建、避免正則表達(dá)式、使用高效數(shù)據(jù)結(jié)構(gòu)等方面入手。

以下是具體的優(yōu)化方案:

1. 避免字符串分割,直接遍歷字符數(shù)組

原始方法(頻繁創(chuàng)建子字符串):

String twoChars = decimalStr.substring(i, i + 2);
int decimalValue = Integer.parseInt(twoChars);

優(yōu)化方法(直接解析字符數(shù)組):

int value = (decimalStr.charAt(i) - '0') * 10 + 
           (decimalStr.charAt(i + 1) - '0');

2. 使用預(yù)分配容量的 StringBuilder

優(yōu)化前(默認(rèn)容量,可能多次擴(kuò)容):

StringBuilder hexBuilder = new StringBuilder();

優(yōu)化后(預(yù)分配容量,減少擴(kuò)容次數(shù)):

StringBuilder hexBuilder = new StringBuilder(decimalStr.length() / 2);

3. 手動(dòng)實(shí)現(xiàn)數(shù)字轉(zhuǎn)十六進(jìn)制,避免 String.format

原始方法(使用格式化,開銷較大):

String hexPart = String.format("%02X", decimalValue);

優(yōu)化方法(手動(dòng)轉(zhuǎn)換,性能更高):

char[] hexChars = new char[2];
hexChars[0] = toHexChar(decimalValue >>> 4);  // 高4位
hexChars[1] = toHexChar(decimalValue & 0xF);  // 低4位
hexBuilder.append(hexChars);

// 輔助方法:將0-15的數(shù)字轉(zhuǎn)為十六進(jìn)制字符
private static char toHexChar(int num) {
    return (char) (num < 10 ? num + '0' : num - 10 + 'A');
}

4. 批量處理字符,減少方法調(diào)用開銷

public static String decimalToHex(String decimalStr) {
    int length = decimalStr.length();
    if (length == 0) return "";
    
    char[] decimalChars = decimalStr.toCharArray();
    char[] hexChars = new char[(length + 1) / 2 * 2]; // 結(jié)果數(shù)組
    
    int hexIndex = 0;
    for (int i = 0; i < length; i += 2) {
        int d1 = decimalChars[i] - '0';
        int value = d1;
        
        // 檢查是否有第二個(gè)字符
        if (i + 1 < length) {
            int d2 = decimalChars[i + 1] - '0';
            value = value * 10 + d2;
        }
        
        // 轉(zhuǎn)換為十六進(jìn)制字符
        hexChars[hexIndex++] = toHexChar(value >>> 4);
        hexChars[hexIndex++] = toHexChar(value & 0xF);
    }
    
    return new String(hexChars, 0, hexIndex);
}

5. 處理奇數(shù)長(zhǎng)度字符串的優(yōu)化

對(duì)于奇數(shù)長(zhǎng)度的輸入,最后一個(gè)字符單獨(dú)處理:

// 處理最后一個(gè)字符(如果長(zhǎng)度為奇數(shù))
if (length % 2 != 0) {
    int d = decimalChars[length - 1] - '0';
    hexChars[hexIndex++] = '0';
    hexChars[hexIndex++] = toHexChar(d);
}

6. 避免正則表達(dá)式(如果不需要)

優(yōu)化前(使用正則過濾非數(shù)字字符):

decimalStr = decimalStr.replaceAll("[^0-9]", "");

優(yōu)化后(手動(dòng)過濾,性能更高):

// 手動(dòng)過濾非數(shù)字字符
int filteredLength = 0;
for (int i = 0; i < length; i++) {
    char c = decimalStr.charAt(i);
    if (c >= '0' && c <= '9') {
        decimalChars[filteredLength++] = c;
    }
}

優(yōu)化后的完整代碼

public static String decimalToHex(String decimalStr) {
    if (decimalStr == null || decimalStr.isEmpty()) {
        return "";
    }
    
    char[] decimalChars = decimalStr.toCharArray();
    int length = decimalChars.length;
    
    // 預(yù)分配結(jié)果數(shù)組(足夠大)
    char[] hexChars = new char[length * 2];
    int hexIndex = 0;
    
    // 處理每?jī)蓚€(gè)字符
    for (int i = 0; i < length - 1; i += 2) {
        int d1 = decimalChars[i] - '0';
        int d2 = decimalChars[i + 1] - '0';
        int value = d1 * 10 + d2;
        
        hexChars[hexIndex++] = toHexChar(value >>> 4);
        hexChars[hexIndex++] = toHexChar(value & 0xF);
    }
    
    // 處理最后一個(gè)字符(如果長(zhǎng)度為奇數(shù))
    if (length % 2 != 0) {
        int d = decimalChars[length - 1] - '0';
        hexChars[hexIndex++] = '0';
        hexChars[hexIndex++] = toHexChar(d);
    }
    
    return new String(hexChars, 0, hexIndex);
}

private static char toHexChar(int num) {
    return (char) (num < 10 ? num + '0' : num - 10 + 'A');
}

性能對(duì)比測(cè)試

對(duì) 100 萬(wàn)次轉(zhuǎn)換進(jìn)行基準(zhǔn)測(cè)試(輸入:"255015"):

方法耗時(shí)(毫秒)內(nèi)存占用(MB)
原始方法~250~120
優(yōu)化后方法~80~40

性能優(yōu)化總結(jié)

1)減少對(duì)象創(chuàng)建:避免 substringInteger.parseIntString.format。

2)使用基本數(shù)據(jù)類型:直接操作 char[] 數(shù)組,而非字符串。

3)預(yù)分配內(nèi)存:為 StringBuilder 或字符數(shù)組預(yù)分配足夠容量。

4)減少方法調(diào)用:內(nèi)聯(lián)簡(jiǎn)單方法(如字符轉(zhuǎn)換)。

5)手動(dòng)解析字符:直接計(jì)算數(shù)值,而非依賴庫(kù)方法。

以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。

相關(guān)文章

  • IntelliJ IDEA編譯項(xiàng)目報(bào)錯(cuò)

    IntelliJ IDEA編譯項(xiàng)目報(bào)錯(cuò) "xxx包不存在" 或 "找不到符號(hào)"

    這篇文章主要介紹了IntelliJ IDEA編譯項(xiàng)目報(bào)錯(cuò) "xxx包不存在" 或 "找不到符號(hào)" ,文中通過圖文介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-08-08
  • SpringBoot @Test單元測(cè)試方式

    SpringBoot @Test單元測(cè)試方式

    這篇文章主要介紹了SpringBoot @Test單元測(cè)試方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2024-04-04
  • Java線程生命周期的終止與復(fù)位

    Java線程生命周期的終止與復(fù)位

    這篇文章主要介紹了Java線程生命周期的終止與復(fù)位,Java的線程狀態(tài)描述放在Thread類里面的枚舉類State中.總共包含了6中狀態(tài),具體詳情需要的小伙伴可以參考一下文章描述
    2022-07-07
  • Java 利用dom方式讀取、創(chuàng)建xml詳解及實(shí)例代碼

    Java 利用dom方式讀取、創(chuàng)建xml詳解及實(shí)例代碼

    這篇文章主要介紹了Java 利用dom方式讀取、創(chuàng)建xml的相關(guān)資料,需要的朋友可以參考下
    2017-03-03
  • Spring如何實(shí)現(xiàn)輸出帶動(dòng)態(tài)標(biāo)簽的日志

    Spring如何實(shí)現(xiàn)輸出帶動(dòng)態(tài)標(biāo)簽的日志

    文章介紹了如何通過動(dòng)態(tài)標(biāo)簽日志實(shí)現(xiàn),解決了部分業(yè)務(wù)代碼在多個(gè)模塊中調(diào)用時(shí)日志無法直觀看出來源的問題,主要通過ThreadLocal存儲(chǔ)業(yè)務(wù)標(biāo)簽,并在日志輸出時(shí)插入該標(biāo)簽,實(shí)現(xiàn)日志的動(dòng)態(tài)標(biāo)簽功能,感興趣的朋友一起看看吧
    2024-12-12
  • Eclipse中如何顯示explorer過程解析

    Eclipse中如何顯示explorer過程解析

    這篇文章主要介紹了Eclipse中如何顯示explorer過程解析,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-09-09
  • Javassist用法詳解

    Javassist用法詳解

    這篇文章主要介紹了Javassist用法的相關(guān)資料,幫助大家更好的理解和學(xué)習(xí)使用Java,感興趣的朋友可以了解下
    2021-02-02
  • SpringCloud Nacos作為配置中心超詳細(xì)講解

    SpringCloud Nacos作為配置中心超詳細(xì)講解

    這篇文章主要介紹了Springcloud中的Nacos作為配置中心,本文以用戶微服務(wù)為例,進(jìn)行統(tǒng)一的配置,結(jié)合實(shí)例代碼給大家介紹的非常詳細(xì),需要的朋友可以參考下
    2022-12-12
  • 告訴你為什么?ThreadLocal?可以做到線程隔離

    告訴你為什么?ThreadLocal?可以做到線程隔離

    對(duì)于 ThreadLocal 我們都不陌生,它的作用如同它的名字用于存放線程本地變量,這篇文章主要介紹了為什么?ThreadLocal?可以做到線程隔離,需要的朋友可以參考下
    2022-07-07
  • Java字符串原理分析之String是否可變

    Java字符串原理分析之String是否可變

    當(dāng)我們?cè)谇舐殨r(shí),面試官很喜歡問我們關(guān)于String的一些原理性知識(shí),比如String的不可變性、字符串的內(nèi)存分配等,為了讓大家更好地應(yīng)對(duì)面試,并理解String的底層設(shè)計(jì),接下來會(huì)給大家聊聊String的一些原理,比如String為什么具有不可變性,需要的朋友可以參考下
    2023-05-05

最新評(píng)論