中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

如何在java項目中使用字符串與數字的性能

發布時間:2020-11-26 16:17:39 來源:億速云 閱讀:213 作者:Leah 欄目:編程語言

這期內容當中小編將會給大家帶來有關如何在java項目中使用字符串與數字的性能,文章內容豐富且以專業的角度為大家分析和敘述,閱讀完這篇文章希望大家可以有所收獲。

對于大數據處理來說,從字符串替換為數字類型,可以極大地節省內存、磁盤存儲以及網絡帶寬,減少IO的代價,而且很多數據結構和算法使用數字類型比字符串要更快。

我們來看一個例子,假設你有很多的日志需要處理,而每條日志都有一個唯一的標識,標識類似這樣的格式:

F5051582611729507844
3832154813577306424
F1624235934976711017
3810376634214027595
F6884923813121317381
7278044081826528150

看到這些標識,你怎么想?我的第一反應應該是數字,可是怎么有個F呢?我想可以把它當做16進制。后來發現可以把F當做負號,這就是一個64位的長整型。

那么如果你把這些標識當成字符串,會有什么不同呢?

當然有,如果你每秒要處理這樣的日志百萬或者千萬條,每條處理結果可能會包含百萬或者千萬個這樣的標識元素構成的集合,這個不同就會體現的非常明顯。

下面,我們來分析一下標識3832154813577306424的存儲占用情況:

1、內存占用

當做字符串:我們知道,JAVA中字符串是由字符構成的,一個字符是由2個字節構成的(這是JAVA的悲劇了),上述標識有19個字符,所以,占用的內存大小為:19*2+4=42(字節),+4是因為字符串使用一個整型保存字符串的哈希值。

當做數字:如當做長整型,則占用的內存大小為8字節。

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

2、序列化字節大小

當我們需要通過網絡傳輸這些標識或者需要把這些標識存儲到磁盤中的時候,我們就需要把這些標識轉換為字節數組,如何轉換為字節數組呢?我們可以使用多種編碼方式。

當做字符串:我們知道,JAVA中字符串轉換為字節數組可以使用多種編碼方式,我們看看常見的編碼方式對如上字符串編碼之后的字節數:

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

當做數字:如當做長整型,則占用的內存大小為8字節。

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

那么我們如何在長整型和字節數組之間轉換呢?

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();
}

上述就是小編為大家分享的如何在java項目中使用字符串與數字的性能了,如果剛好有類似的疑惑,不妨參照上述分析進行理解。如果想知道更多相關知識,歡迎關注億速云行業資訊頻道。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

泸水县| 噶尔县| 平湖市| 涡阳县| 武城县| 阳新县| 县级市| 唐海县| 阜平县| 石嘴山市| 宣汉县| 绍兴县| 渝中区| 双城市| 碌曲县| 舞钢市| 大关县| 崇义县| 崇信县| 兰考县| 喜德县| 巴彦淖尔市| 郑州市| 时尚| 通河县| 临海市| 蓬莱市| 孝昌县| 乃东县| 汉阴县| 都安| 武川县| 汉中市| 察哈| 元阳县| 宝丰县| 大兴区| 盐边县| 牡丹江市| 富民县| 芦溪县|