这是创建超低延迟的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' // 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

摘要

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

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

将2个字符写入单个Java char相关推荐

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

    java写入单个字符 这是创建超低延迟的Chronicle FIX-Engine时使用的另一个好技巧. 在从字节流中读取数据时,如果可能的话,将数据存储在char而不是将其读取到String效率更高. ...

  2. 字符集与字符编码,java中的char和unicode

    文章目录 基本单位转换 进制缩写与表示 字符.字符集.字符编码 ASCII码 全角 GBK.GB2312 为什么需要字符编码 UTF-8和Unicode的关系 java中的char 和unicode ...

  3. java char字符转编码_一、java基础-数据类型_数据类型转化_字符编码_转义字符

    1.Java  支持的8种基本数据类型: java的四种整数数据类型:byte 1    short 2     int4     long8 byte     8位带符号整数 -128到127之间的 ...

  4. java基础—IO流——将一些字符写入到指定硬盘上的目录中去:

    将一些字符写入到指定硬盘上的目录中去: import java.io.*; //将一些文字储存到硬盘的文件中去 //操作的是文字,因此选用字符流来操作 public class FileWriterD ...

  5. 字符集和Java char与UTF-16

    文章目录 为什么需要引入字符集 字符集和字符编码的区别 ASCII编码 OEM 字符集的衍生 GB2312 GBK Unicode 字符集 Unicode 字符集的几种常见编码方式 UTF-32 UT ...

  6. java 输入 字符_在java中如何输入一个char型字符。

    展开全部 可以创建Scanner类来从键盘输入一个字符,用String类型来接收,再使用String的charAt功能,具体步骤如下62616964757a686964616fe59b9ee7ad94 ...

  7. Java char转换为String,String转换为char数组

    Today we will look into java char to String program. We will also learn how to convert String to a c ...

  8. 将字符写入文件c语言,C语言写入字符到文件

    C语言写入字符到文件教程 在 C语言fputc函数详解 语法 int fputc(int ch, FILE *fp); 参数 参数 描述 ch 要写入的字符. fp 打开文件返回的文件指针. 返回值 ...

  9. Java char所占用的字节_关于unicode:为什么Java char原语占用2个字节的内存?

    有什么理由为什么Java char原始数据类型为2个字节而不像C为1个字节? 谢谢 简短的答案是因为它们无聊:他们应该使用32位字符. 不,他们不应该使用32位宽的字符. 这将使开销更大! @ vy3 ...

最新文章

  1. vibe前景提取改进算法
  2. 微软687亿美元收购动视暴雪成第三大游戏公司,网友:米哈游只有收购索尼才能抗衡了...
  3. VHDL/Verilog编译错误总结
  4. 龙图 VP 李翀:数据化运营及云计算下的运维
  5. mysql+phpmyadmin配置流程
  6. qq linux版本下载官网下载,腾讯QQ For Linux
  7. 5 万条微信语音升入太空;阿里京东否认停止社招;雷军开怼华为 | 极客头条...
  8. 路由器故障排除的思路与理论
  9. 1.1 矩阵与线性方程组-矩阵的基本运算
  10. 任意版本nodejs下载
  11. 广东取消英语和计算机考试,广东停考全国英语等级考试、全国计算机等级考试...
  12. Unity篇——Minimap小地图
  13. 我的世界php motd,我的世界防压测插件 MOTD压测防御
  14. 原来游戏技术行业最大的秘密竟然是...
  15. 笨小孩--投资中的确定性
  16. sketch中快速绘制图形的几个小技巧
  17. 【*不为人知的U盘量成CD-ROM小技巧*】
  18. uni-app下使用vant组件
  19. C#判断两个字符串是否相等的方法
  20. html 的打印和下载

热门文章

  1. 《金色梦乡》金句摘抄(一)
  2. java中判断 101-200 之间有多少个素数,并输出所有的素数
  3. SpringCloud Netflix Hystrix
  4. mysql 行转列分级输出_MySQL如何实现行转列分级输出?_MySQL
  5. nginx解析php失败,为什么nginx不能解析php?
  6. nacos启动失败:org.springframework.boot.web.server.WebServerExceptio
  7. Java IO(BIO, NIO, AIO) 总结
  8. MySQL基础---增删改查语法
  9. Spring MVC+layui(基于bootstrap)+t 新增功能(页面和数据传递)
  10. aws部署ssh_将Quarkus应用程序部署到AWS Elastic Beanstalk