国产片侵犯亲女视频播放_亚洲精品二区_在线免费国产视频_欧美精品一区二区三区在线_少妇久久久_在线观看av不卡

服務器之家:專注于服務器技術及軟件下載分享
分類導航

PHP教程|ASP.NET教程|Java教程|ASP教程|編程技術|正則表達式|C/C++|IOS|C#|Swift|Android|VB|R語言|JavaScript|易語言|vb.net|

服務器之家 - 編程語言 - Java教程 - java 開發使用字符串和數字的性能分析

java 開發使用字符串和數字的性能分析

2020-12-01 14:38楊尚川 Java教程

這篇文章主要介紹了java 開發使用字符串和數字的性能分析的相關資料,需要的朋友可以參考下

java 開發使用字符串數字性能分析

前言:

             分析使用字符串和數字,在軟件產品上線后用戶較多的情況下,很有必要考慮的問題,這直接體現了用戶的體驗程度,總不能讓用戶用著很卡的感覺吧! 

在我多年的開發經驗中,經常發現的一個情況就是,很多項目的對象字段或者是數據庫字段本來是數字類型的,卻被定義成字符串類型,這無關痛癢嗎?

對于小項目來說,可能沒什么影響,反正只要業務邏輯正確即可,性能沒什么問題,因為數據也不多,用戶也不多。

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

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

?
1
2
3
4
5
6
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中字符串轉換為字節數組可以使用多種編碼方式,我們看看常見的編碼方式對如上字符串編碼之后的字節數:

?
1
2
3
4
5
6
7
8
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);

輸出如下:

?
1
2
3
4
5
6
3832154813577306424 length:19
UTF-8:19
unicode:40
gbk:19
gb2312:19
ISO-8859-1:19

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

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

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

?
1
2
3
4
5
6
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));

輸出如下:

?
1
2
3
3832154813577306424 length:19
long:8
string:3832154813577306424
?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
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();
}

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

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 中文字幕高清视频 | 国产羞羞视频在线观看 | 亚洲精品久久久久久一区二区 | 视频一区二区中文字幕 | 欧美中文字幕一区 | 野狼在线社区2017入口 | 亚洲第一av | 国产黄色av网站 | 午夜黄色影院 | 激情久久免费视频 | 国产一区二区三区欧美 | 国产亚洲精品精品国产亚洲综合 | 久久久网站 | 久久亚洲综合 | 久久精品国产欧美亚洲人人爽 | 久久久久久高清 | 精品视频久久 | 国产婷婷色一区二区三区 | av伊人网 | 人人干天天干 | 国产精品久久九九 | 国产一区二区三区免费在线观看 | 日韩在线一区二区三区 | 欧美视频免费 | 国产精品69毛片高清亚洲 | 国产精品久久久久久久久久久久冷 | 欧美日韩一区二区在线观看 | 亚洲天堂中文字幕 | 亚洲国产一级毛片 | 欧美在线视频一区 | 日韩精品在线一区 | 中文字幕在线免费视频 | 亚洲一区二区久久 | 亚洲成人精品一区 | 日韩视频在线免费观看 | 欧美九九九| 在线播放黄 | 在线观看黄色电影 | 日本在线视频一区二区 | 中文字幕在线一区 | 好看的国产精彩视频 |