将2个字符写入单个Java char
這是創(chuàng)建超低延遲的Chronicle FIX-Engine時(shí)使用的另一個(gè)好技巧。
在從字節(jié)流中讀取數(shù)據(jù)時(shí),如果可能的話,將數(shù)據(jù)存儲(chǔ)在char而不是將其讀取到String效率更高。 (至少您要避免創(chuàng)建String對(duì)象,盡管可以通過使用緩存或使用CharSequence而不是String來緩解這種情況,但這是另一篇文章的主題。)
使用JMH基準(zhǔn)測試,我發(fā)現(xiàn)了這些時(shí)機(jī):(我沒有包括源代碼,因?yàn)檫@將是另一篇文章的主題,在此我將更詳細(xì)地描述不同的方法論)。
從一個(gè)字節(jié)流中讀取2個(gè)ascii字符到:
String - 34.48ns Pooled String - 28.57ns StringBuilder - 21.27ns char (using 2 chars method) - 6.75ns關(guān)鍵是,將數(shù)據(jù)讀入String至少是char 3倍,甚至沒有考慮所創(chuàng)建的垃圾。
因此,不用說,當(dāng)您知道期望的數(shù)據(jù)始終是單個(gè)字符時(shí),應(yīng)該將其讀取為char ,而不是將其讀取為String變量。
現(xiàn)在,如果您知道流中期望的數(shù)據(jù)不超過2個(gè)字符,該怎么辦。 (例如在FIX 5.0標(biāo)記35 msgType中找到這種情況)。 您是否必須使用字符串來容納額外的字符? 乍一看似乎如此,畢竟一個(gè)char只能包含一個(gè)字符。
可以嗎
一個(gè)Java char由2個(gè)字節(jié)組成,而不是一個(gè)字節(jié)。 因此,如果您知道您的數(shù)據(jù)是由ascii字符組成的,那么您將知道將僅使用一個(gè)字節(jié)( char中的2個(gè)字節(jié))。 例如,“ A”是65,而“ z”是122。
您可以通過以下簡單循環(huán)打印出適合單個(gè)字節(jié)的值:
for (int i = 0; i < 256; i++) {char c = (char)i;System.out.println(i+ ":" + c); }現(xiàn)在,您可以自由使用char的另一個(gè)字符來保留第二個(gè)ascii字符。
這是這樣做的方法:
在此示例中,您已讀取2個(gè)字節(jié)“ a”和“ b”,并希望將它們存儲(chǔ)在單個(gè)char中。
byte a = (byte)'a'; byte b = (byte)'b'; //Now place a and b into a single char char ab = (char)((a << 8) + b);//To retrieve the bytes individually see code below System.out.println((char)(ab>>8) +""+ (char)(ab & 0xff));為了更好地理解這一點(diǎn),讓我們看一下二進(jìn)制文件:
byte a = (byte)'a' // 01100001byte b = (byte)'b' // 01100010As you can see below, when viewed as a char, the top 8 bits are not being usedchar ca = 'a' // 00000000 01100001char cb = 'b' // 00000000 01100010Combine the characters with a taking the top 8 bits and b the bottom 8 bits.char ab = (char)((a << 8) + b); // 01100001 01100010摘要
將數(shù)據(jù)讀入char而不是String效率更高。 如果您知道最多2個(gè)ascii字符,則可以將它們組合成一個(gè)Java char。 當(dāng)然,如果您真的擔(dān)心超低延遲,請僅使用此技術(shù)!
翻譯自: https://www.javacodegeeks.com/2016/01/writing-2-characters-single-java-char.html
總結(jié)
以上是生活随笔為你收集整理的将2个字符写入单个Java char的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 现货黄金有主力主控吗?
- 下一篇: 具有FastUtil的精简Java集合