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

java 開(kāi)發(fā)使用字符串和數(shù)字的性能分析

 更新時(shí)間:2017年07月12日 15:17:22   作者:楊尚川  
這篇文章主要介紹了java 開(kāi)發(fā)使用字符串和數(shù)字的性能分析的相關(guān)資料,需要的朋友可以參考下

java 開(kāi)發(fā)使用字符串和數(shù)字的性能分析

前言:

             分析使用字符串和數(shù)字,在軟件產(chǎn)品上線(xiàn)后用戶(hù)較多的情況下,很有必要考慮的問(wèn)題,這直接體現(xiàn)了用戶(hù)的體驗(yàn)程度,總不能讓用戶(hù)用著很卡的感覺(jué)吧! 

在我多年的開(kāi)發(fā)經(jīng)驗(yàn)中,經(jīng)常發(fā)現(xiàn)的一個(gè)情況就是,很多項(xiàng)目的對(duì)象字段或者是數(shù)據(jù)庫(kù)字段本來(lái)是數(shù)字類(lèi)型的,卻被定義成字符串類(lèi)型,這無(wú)關(guān)痛癢嗎?

對(duì)于小項(xiàng)目來(lái)說(shuō),可能沒(méi)什么影響,反正只要業(yè)務(wù)邏輯正確即可,性能沒(méi)什么問(wèn)題,因?yàn)閿?shù)據(jù)也不多,用戶(hù)也不多。

然而,對(duì)于大數(shù)據(jù)處理來(lái)說(shuō),這個(gè)可不是小事,從字符串替換為數(shù)字類(lèi)型,可以極大地節(jié)省內(nèi)存、磁盤(pán)存儲(chǔ)以及網(wǎng)絡(luò)帶寬,減少I(mǎi)O的代價(jià),而且很多數(shù)據(jù)結(jié)構(gòu)和算法使用數(shù)字類(lèi)型比字符串要更快。

我們來(lái)看一個(gè)例子,假設(shè)你有很多的日志需要處理,而每條日志都有一個(gè)唯一的標(biāo)識(shí),標(biāo)識(shí)類(lèi)似這樣的格式:

F5051582611729507844
3832154813577306424
F1624235934976711017
3810376634214027595
F6884923813121317381
7278044081826528150

看到這些標(biāo)識(shí),你怎么想?我的第一反應(yīng)應(yīng)該是數(shù)字,可是怎么有個(gè)F呢?我想可以把它當(dāng)做16進(jìn)制。后來(lái)發(fā)現(xiàn)可以把F當(dāng)做負(fù)號(hào),這就是一個(gè)64位的長(zhǎng)整型。

那么如果你把這些標(biāo)識(shí)當(dāng)成字符串,會(huì)有什么不同呢?

當(dāng)然有,如果你每秒要處理這樣的日志百萬(wàn)或者千萬(wàn)條,每條處理結(jié)果可能會(huì)包含百萬(wàn)或者千萬(wàn)個(gè)這樣的標(biāo)識(shí)元素構(gòu)成的集合,這個(gè)不同就會(huì)體現(xiàn)的非常明顯。

下面,我們來(lái)分析一下標(biāo)識(shí)3832154813577306424的存儲(chǔ)占用情況:

1、內(nèi)存占用

當(dāng)做字符串:我們知道,JAVA中字符串是由字符構(gòu)成的,一個(gè)字符是由2個(gè)字節(jié)構(gòu)成的(這是JAVA的悲劇了),上述標(biāo)識(shí)有19個(gè)字符,所以,占用的內(nèi)存大小為:19*2+4=42(字節(jié)),+4是因?yàn)樽址褂靡粋€(gè)整型保存字符串的哈希值。

當(dāng)做數(shù)字:如當(dāng)做長(zhǎng)整型,則占用的內(nèi)存大小為8字節(jié)。

這里有5倍以上的差距了吧。

2、序列化字節(jié)大小

當(dāng)我們需要通過(guò)網(wǎng)絡(luò)傳輸這些標(biāo)識(shí)或者需要把這些標(biāo)識(shí)存儲(chǔ)到磁盤(pán)中的時(shí)候,我們就需要把這些標(biāo)識(shí)轉(zhuǎn)換為字節(jié)數(shù)組,如何轉(zhuǎn)換為字節(jié)數(shù)組呢?我們可以使用多種編碼方式。

當(dāng)做字符串:我們知道,JAVA中字符串轉(zhuǎn)換為字節(jié)數(shù)組可以使用多種編碼方式,我們看看常見(jiàn)的編碼方式對(duì)如上字符串編碼之后的字節(jié)數(shù):

String abc = "3832154813577306424";

System.out.println("3832154813577306424 length:"+abc.length());
System.out.println(Charset.defaultCharset().name()+":"+abc.getBytes().length);
System.out.println("unicode:"+abc.getBytes("unicode").length);
System.out.println("gbk:"+abc.getBytes("gbk").length);
System.out.println("gb2312:"+abc.getBytes("gb2312").length);
System.out.println("ISO-8859-1:"+abc.getBytes("ISO-8859-1").length);

輸出如下:

3832154813577306424 length:19
UTF-8:19
unicode:40
gbk:19
gb2312:19
ISO-8859-1:19

當(dāng)做數(shù)字:如當(dāng)做長(zhǎng)整型,則占用的內(nèi)存大小為8字節(jié)。

這里有2倍以上的差距了吧。

那么我們?nèi)绾卧陂L(zhǎng)整型和字節(jié)數(shù)組之間轉(zhuǎn)換呢?

String abc = "3832154813577306424";

System.out.println("3832154813577306424 length:"+abc.length());
System.out.println("long:"+ByteUtils.longToBytes(Long.parseLong(abc)).length);
byte[] bytes = ByteUtils.longToBytes(Long.parseLong(abc));
System.out.println("string:"+ByteUtils.bytesToLong(bytes));

輸出如下:

3832154813577306424 length:19
long:8
string:3832154813577306424
public static byte[] longToBytes(long x) {
  ByteBuffer longBuffer = ByteBuffer.allocate(Long.BYTES);
  longBuffer.putLong(0, x);
  return longBuffer.array();
}
public static long bytesToLong(byte[] bytes) {
  return bytesToLong(bytes, 0, bytes.length);
}
public static long bytesToLong(byte[] bytes, int offset, int length) {
  ByteBuffer longBuffer = ByteBuffer.allocate(Long.BYTES);
  longBuffer.put(bytes, offset, length);
  longBuffer.flip();//need flip
  return longBuffer.getLong();
}

感謝閱讀,希望能幫助到大家,謝謝大家對(duì)本站的支持!

相關(guān)文章

  • java實(shí)現(xiàn)傾斜水印鋪滿(mǎn)整張圖

    java實(shí)現(xiàn)傾斜水印鋪滿(mǎn)整張圖

    這篇文章主要為大家詳細(xì)介紹了java實(shí)現(xiàn)傾斜水印鋪滿(mǎn)整張圖的具體代碼,教大家如何控制水印之間的空隙,感興趣的小伙伴們可以參考一下
    2016-06-06
  • Java 定時(shí)器的使用示例

    Java 定時(shí)器的使用示例

    這篇文章主要介紹了Java 定時(shí)器的使用,幫助大家更好的理解和使用Java time類(lèi),感興趣的朋友可以了解下
    2020-09-09
  • MyBatis-Plus中自動(dòng)填充功能的用法示例詳解

    MyBatis-Plus中自動(dòng)填充功能的用法示例詳解

    有些時(shí)候我們可能會(huì)有這樣的需求,插入或者更新數(shù)據(jù)時(shí),希望有些字段可以自動(dòng)填充數(shù)據(jù),比如密碼、version、注冊(cè)時(shí)默認(rèn)的用戶(hù)角色等,在MP中提供了這樣的功能,可以實(shí)現(xiàn)自動(dòng)填充功能,需要的朋友可以參考下
    2022-12-12
  • Springboot如何使用Aspectj實(shí)現(xiàn)AOP面向切面編程

    Springboot如何使用Aspectj實(shí)現(xiàn)AOP面向切面編程

    這篇文章主要介紹了Springboot如何使用Aspectj實(shí)現(xiàn)AOP面向切面編程,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-01-01
  • Spring學(xué)習(xí)之Bean的裝配多種方法

    Spring學(xué)習(xí)之Bean的裝配多種方法

    本篇文章主要介紹了Spring學(xué)習(xí)之Bean的裝配三種方法,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2017-07-07
  • 圖解Java經(jīng)典算法快速排序的原理與實(shí)現(xiàn)

    圖解Java經(jīng)典算法快速排序的原理與實(shí)現(xiàn)

    快速排序是基于二分的思想,對(duì)冒泡排序的一種改進(jìn)。主要思想是確立一個(gè)基數(shù),將小于基數(shù)的數(shù)放到基數(shù)左邊,大于基數(shù)的數(shù)字放到基數(shù)的右邊,然后在對(duì)這兩部分進(jìn)一步排序,從而實(shí)現(xiàn)對(duì)數(shù)組的排序
    2022-09-09
  • 不使用他人jar包情況下優(yōu)雅的進(jìn)行dubbo調(diào)用詳解

    不使用他人jar包情況下優(yōu)雅的進(jìn)行dubbo調(diào)用詳解

    這篇文章主要為大家介紹了不使用他人jar包情況下優(yōu)雅的進(jìn)行dubbo調(diào)用詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-09-09
  • Java模擬并解決緩存穿透問(wèn)題

    Java模擬并解決緩存穿透問(wèn)題

    這篇文章主要介紹了Java模擬并解決緩存穿透問(wèn)題,本文給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值 ,需要的朋友可以參考下
    2019-08-08
  • 舉例詳解用Java實(shí)現(xiàn)web分頁(yè)功能的方法

    舉例詳解用Java實(shí)現(xiàn)web分頁(yè)功能的方法

    這篇文章主要介紹了舉例詳解用Java實(shí)現(xiàn)web分頁(yè)功能的方法,這種基本功能現(xiàn)一般通過(guò)Hibernate框架來(lái)完成,需要的朋友可以參考下
    2015-10-10
  • Java 判斷字符為中文實(shí)例代碼(超管用)

    Java 判斷字符為中文實(shí)例代碼(超管用)

    在做項(xiàng)目中經(jīng)常會(huì)遇到有項(xiàng)目需求是需要判斷字符為中文的一些問(wèn)題,所以搜集了判斷中文字符的代碼片段,特此分享供大家參考
    2016-02-02

最新評(píng)論

肇庆市| 渭源县| 莱芜市| 湘西| 洛宁县| 湾仔区| 黄梅县| 旺苍县| 钟山县| 苍山县| 沙雅县| 河南省| 平阳县| 共和县| 威信县| 墨脱县| 含山县| 濮阳县| 洮南市| 宁陕县| 万宁市| 沭阳县| 抚州市| 绥德县| 莱西市| 汶上县| 临洮县| 朝阳区| 平舆县| 邵阳市| 无棣县| 明光市| 运城市| 上杭县| 大石桥市| 乌什县| 沾化县| 齐河县| 呼伦贝尔市| 葫芦岛市| 澜沧|