将2个字符写入单个Java char
这是创建超低延迟的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相关推荐
- java写入单个字符_将2个字符写入单个Java char
java写入单个字符 这是创建超低延迟的Chronicle FIX-Engine时使用的另一个好技巧. 在从字节流中读取数据时,如果可能的话,将数据存储在char而不是将其读取到String效率更高. ...
- 字符集与字符编码,java中的char和unicode
文章目录 基本单位转换 进制缩写与表示 字符.字符集.字符编码 ASCII码 全角 GBK.GB2312 为什么需要字符编码 UTF-8和Unicode的关系 java中的char 和unicode ...
- java char字符转编码_一、java基础-数据类型_数据类型转化_字符编码_转义字符
1.Java 支持的8种基本数据类型: java的四种整数数据类型:byte 1 short 2 int4 long8 byte 8位带符号整数 -128到127之间的 ...
- java基础—IO流——将一些字符写入到指定硬盘上的目录中去:
将一些字符写入到指定硬盘上的目录中去: import java.io.*; //将一些文字储存到硬盘的文件中去 //操作的是文字,因此选用字符流来操作 public class FileWriterD ...
- 字符集和Java char与UTF-16
文章目录 为什么需要引入字符集 字符集和字符编码的区别 ASCII编码 OEM 字符集的衍生 GB2312 GBK Unicode 字符集 Unicode 字符集的几种常见编码方式 UTF-32 UT ...
- java 输入 字符_在java中如何输入一个char型字符。
展开全部 可以创建Scanner类来从键盘输入一个字符,用String类型来接收,再使用String的charAt功能,具体步骤如下62616964757a686964616fe59b9ee7ad94 ...
- 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 ...
- 将字符写入文件c语言,C语言写入字符到文件
C语言写入字符到文件教程 在 C语言fputc函数详解 语法 int fputc(int ch, FILE *fp); 参数 参数 描述 ch 要写入的字符. fp 打开文件返回的文件指针. 返回值 ...
- Java char所占用的字节_关于unicode:为什么Java char原语占用2个字节的内存?
有什么理由为什么Java char原始数据类型为2个字节而不像C为1个字节? 谢谢 简短的答案是因为它们无聊:他们应该使用32位字符. 不,他们不应该使用32位宽的字符. 这将使开销更大! @ vy3 ...
最新文章
- vibe前景提取改进算法
- 微软687亿美元收购动视暴雪成第三大游戏公司,网友:米哈游只有收购索尼才能抗衡了...
- VHDL/Verilog编译错误总结
- 龙图 VP 李翀:数据化运营及云计算下的运维
- mysql+phpmyadmin配置流程
- qq linux版本下载官网下载,腾讯QQ For Linux
- 5 万条微信语音升入太空;阿里京东否认停止社招;雷军开怼华为 | 极客头条...
- 路由器故障排除的思路与理论
- 1.1 矩阵与线性方程组-矩阵的基本运算
- 任意版本nodejs下载
- 广东取消英语和计算机考试,广东停考全国英语等级考试、全国计算机等级考试...
- Unity篇——Minimap小地图
- 我的世界php motd,我的世界防压测插件 MOTD压测防御
- 原来游戏技术行业最大的秘密竟然是...
- 笨小孩--投资中的确定性
- sketch中快速绘制图形的几个小技巧
- 【*不为人知的U盘量成CD-ROM小技巧*】
- uni-app下使用vant组件
- C#判断两个字符串是否相等的方法
- html 的打印和下载
热门文章
- 《金色梦乡》金句摘抄(一)
- java中判断 101-200 之间有多少个素数,并输出所有的素数
- SpringCloud Netflix Hystrix
- mysql 行转列分级输出_MySQL如何实现行转列分级输出?_MySQL
- nginx解析php失败,为什么nginx不能解析php?
- nacos启动失败:org.springframework.boot.web.server.WebServerExceptio
- Java IO(BIO, NIO, AIO) 总结
- MySQL基础---增删改查语法
- Spring MVC+layui(基于bootstrap)+t 新增功能(页面和数据传递)
- aws部署ssh_将Quarkus应用程序部署到AWS Elastic Beanstalk