java写入单个字符_将2个字符写入单个Java char

java写入单个字符

这是创建超低延迟的Chronicle FIX-Engine时使用的另一个好技巧。

在从字节流中读取数据时,如果可能的话,将数据存储在char而不是将其读取到String效率更高。 (至少您要避免创建String对象,尽管可以通过使用缓存或使用CharSequence而不是String来缓解这种情况,但这是另一篇文章的主题。)

使用JMH基准测试,我发现了这些时间安排:(我没有包括源代码,因为这将是另一篇文章的主题,在此我将更详细地描述不同的方法论)。

从一个字节流中读取2个ascii字符到:

String - 34.48ns
Pooled String - 28.57ns
StringBuilder - 21.27ns
char (using 2 chars method) - 6.75ns

关键是,将数据读入String至少是char 3倍,而这甚至没有考虑创建的垃圾。

因此,不用说,当您知道期望的数据始终是单个字符时,应该将其读取为char ,而不是将其读取为String变量。

现在,如果您知道流中期望的数据不超过2个字符,该怎么办。 (例如在FIX 5.0标记35 msgType中找到这种情况)。 您是否必须使用字符串来容纳额外的字符? 乍一看似乎如此,毕竟一个char只能包含一个字符。

可以吗

一个Java char由2个字节组成,而不是一个字节。 因此,如果您知道您的数据是由ascii字符组成的,那么您将只使用一个字节( char中的2个字节)。 例如,“ A”是65,而“ z”是122。

您可以通过以下简单循环打印出适合单个字节的值:

for (int i = 0; i < 256; i++) {
    char c = (char)i;
    System.out.println(i+ ":" + c);
}

现在,您可以自由使用char的另一个字符来保留第二个ascii字符。

这是这样做的方法:

在此示例中,您已读取2个字节“ a”和“ b”,并希望将它们存储在单个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));

为了更好地理解这一点,让我们看一下二进制文件:

byte a  = (byte)'a' // 01100001

byte b  = (byte)'b' // 01100010

As you can see below, when viewed as a char, the top 8 bits are not being used

char ca = 'a' // 00000000 01100001

char cb = 'b' // 00000000 01100010

Combine the characters with a taking the top 8 bits and b the bottom 8 bits.

char ab = (char)((a << 8) + b); // 01100001 01100010

摘要

将数据读入char而不是String效率更高。 如果您知道最多有2个ascii字符,则可以将它们组合成一个Java char。 当然,只有在您确实担心超低延迟的情况下才使用此技术!

翻译自: https://www.javacodegeeks.com/2016/01/writing-2-characters-single-java-char.html

java写入单个字符

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值