java中字符和字节的转换_Java最佳实践–字符到字节和字节到字符的转换

java中字符和字节的转换

在使用Java编程语言时,我们将继续讨论与建议的实践有关的系列文章,我们将讨论String性能调优。 特别是,我们将着重于使用默认编码时如何有效地处理字符到字节和字节到字符的转换。 本文总结了两种建议的自定义方法与两种经典方法(“ String.getBytes() ”和NIO ByteBuffer )的性能比较,该方法将字符转换为字节,反之亦然。

所有讨论的主题均基于用例,这些用例源于电信行业关键任务超高性能生产系统的开发。

在阅读本文的每个部分之前,强烈建议您参考相关的Java API文档以获取详细信息和代码示例。

所有测试均针对具有以下特征的Sony Vaio进行:

  • 系统:openSUSE 11.1(x86_64)
  • 处理器(CPU):Intel(R)Core(TM)2 Duo CPU T6670 @ 2.20GHz
  • 处理器速度:1,200.00 MHz
  • 总内存(RAM):2.8 GB
  • Java:OpenJDK 1.6.0_0 64位

应用以下测试配置:

  • 并发工作者线程数:1
  • 每个工作人员重复测试线程:1000000
  • 整体测试次数:100

字符到字节和字节到字符的转换
字符到字节和字节到字符的转换被认为是Java开发人员的常见任务,这些Java开发人员正在针对网络环境进行编程,操纵字节数据流,序列化String对象,实现通信协议等。因此,Java提供了一些实用程序来启用开发人员将String (或字符数组)转换为等效的字节数组,反之亦然。

String类的“ getBytes(charsetName) ”操作可能是将String转换为其等效的字节数组的最常用方法。 由于可以根据所使用的编码方案来不同地表示每个字符,因此,上述操作需要“ charsetName ”以正确转换String字符也就不足为奇了。 如果未提供“ charsetName ”,则该操作使用平台的默认字符集将String编码为字节序列。

将字符数组转换为其等效字节数组的另一种“经典”方法是使用NIO包的ByteBuffer类。 稍后将提供特定方法的示例代码片段。

与更细粒度的方法相比,上述两种方法虽然非常流行并且毫无争议地易于使用和直接使用,但它们的性能都大大不足。 请记住, 我们不是在字符编码之间进行转换 。 为了在字符编码之间进行转换,您应该坚持使用“ String.getBytes(charsetName) ”或NIO框架方法和实用程序的“经典”方法。

当所有要转换的字符均为ASCII字符时,建议的转换方法如下所示:

public static byte[] stringToBytesASCII(String str) {char[] buffer = str.toCharArray();byte[] b = new byte[buffer.length];for (int i = 0; i < b.length; i++) {b[i] = (byte) buffer[i];}return b;
}

通过将每个字符值转换为等效的字节来构造结果字节数组,因为我们知道所有字符都在ASCII范围内(0 – 127),因此只能占据一个 字节大小。

使用结果字节数组,我们可以通过使用“经典” 字符串构造函数“ new String(byte []) ”转换回原始String 。

对于默认的字符编码,我们可以使用下面显示的方法将String转换为字节数组,反之亦然:

public static byte[] stringToBytesUTFCustom(String str) {char[] buffer = str.toCharArray();byte[] b = new byte[buffer.length << 1];for(int i = 0; i < buffer.length; i++) {int bpos = i << 1;b[bpos] = (byte) ((buffer[i]&0xFF00)>>8);b[bpos + 1] = (byte) (buffer[i]&0x00FF);}return b;
}

Java中的每种字符类型都占用2个字节的大小。 为了将String转换为其等效的字节数组,我们将String的每个字符转换为其2字节的表示形式。

使用结果字节数组,可以使用以下提供的方法将其转换回原始的String :

public static String bytesToStringUTFCustom(byte[] bytes) {char[] buffer = new char[bytes.length >> 1];for(int i = 0; i < buffer.length; i++) {int bpos = i << 1;char c = (char)(((bytes[bpos]&0x00FF)<<8) + (bytes[bpos+1]&0x00FF));buffer[i] = c;}return new String(buffer);
}

我们从其2字节表示形式构造每个String字符。 使用结果字符数组,我们可以通过使用“经典” 字符串构造函数“ new String(char []) ”将其转换回原始String 。

最后但并非最不重要的一点是,我们提供了两个使用NIO包的示例方法,以便将String转换为其等效的字节数组,反之亦然:

public static byte[] stringToBytesUTFNIO(String str) {char[] buffer = str.toCharArray();byte[] b = new byte[buffer.length << 1];CharBuffer cBuffer = ByteBuffer.wrap(b).asCharBuffer();for(int i = 0; i < buffer.length; i++)cBuffer.put(buffer[i]);return b;
}
public static String bytesToStringUTFNIO(byte[] bytes) {CharBuffer cBuffer = ByteBuffer.wrap(bytes).asCharBuffer();return cBuffer.toString();
}

对于本文的最后一部分,我们提供了上述字符串到字节数组和字节数组到字符串转换方法的性能比较表。 我们已经使用输入字符串“ test string ”测试了所有方法。

首先将String转换为字节数组的性能比较表:

横轴表示测试运行的次数,纵轴表示每次测试运行的每秒平均事务数(TPS)。 因此,较高的值更好。 正如预期的那样,与“ stringToBytesASCII(String) ”和“ stringToBytesUTFCustom(String) ”建议的方法相比,“ String.getBytes() ”和“ stringToBytesUTFNIO(String) ”方法的执行效果均较差。 如您所见,与“经典”方法相比,我们提出的方法可将TPS提高近30%。

最后将字节数组转换为String的性能对比图:

横轴表示测试运行的次数,纵轴表示每次测试运行的每秒平均事务数(TPS)。 因此,较高的值更好。 正如预期的那样,无论是“ 新的字符串(字节[])”“bytesToStringUTFNIO(字节[])”的方法较差相比,“bytesToStringUTFCustom(字节[])”建议的方法进行。 如您所见,与“ new String(byte []) ”方法相比,我们提出的方法使TPS增长了近15%,与“ bytesToStringUTFNIO(byte []) ”方法相比,TPS增长了近30%。

总之,当您处理字符到字节或字节到字符的转换时,如果您不打算更改所使用的编码,则可以通过使用自定义(细粒度)方法而不是使用提供的“经典”方法来获得卓越的性能。 String类和NIO包。 当将测试字符串转换为等效的字节数组时,与“经典”方法相比,我们提出的方法总体上提高了45%的性能。

快乐编码

贾斯汀

聚苯乙烯

考虑到我们的一些读者提出的使用“ String.charAt(int) ”操作而不是使用“ String.toCharArray() ”来将String字符转换为字节的提议后,我更改了我们提出的方法,并重新执行测试。 如预期的那样,进一步实现了性能提升。 特别地,在TPS 额外 13%的平均增加被记录为“stringToBytesASCII(字符串)”方法和TPS的额外 2%平均增加被记录为“stringToBytesUTFCustom(字符串)”。 因此,您应该使用更改后的方法,因为它们的性能甚至比原始方法还要好。 更新的方法如下所示:

public static byte[] stringToBytesASCII(String str) {byte[] b = new byte[str.length()];for (int i = 0; i < b.length; i++) {b[i] = (byte) str.charAt(i);}return b;
}
public static byte[] stringToBytesUTFCustom(String str) {byte[] b = new byte[str.length() << 1];for(int i = 0; i < str.length(); i++) {char strChar = str.charAt(i);int bpos = i << 1;b[bpos] = (byte) ((strChar&0xFF00)>>8);b[bpos + 1] = (byte) (strChar&0x00FF); }return b;
}
相关文章 :
  • Java最佳实践–多线程环境中的DateFormat
  • Java最佳实践–高性能序列化
  • Java最佳实践– Vector vs ArrayList vs HashSet
  • Java最佳实践–字符串性能和精确字符串匹配
  • Java最佳实践–队列之战和链接的ConcurrentHashMap

翻译自: https://www.javacodegeeks.com/2010/11/java-best-practices-char-to-byte-and.html

java中字符和字节的转换

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/359735.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Android实现简单短信发送器

布局&#xff1a; <RelativeLayout xmlns:android"http://schemas.android.com/apk/res/android"xmlns:tools"http://schemas.android.com/tools"android:id"id/container"android:layout_width"match_parent"android:layout_heigh…

linux 查看文件哈希码,使用linux的sha1sum命令查看效验文件哈希值命令

服务器今天小编给大家分享的是使用linux的sha1sum命令查看效验文件哈希值命令&#xff0c;相信很多人都不太了解&#xff0c;为了让大家更加了解&#xff0c;所以给大家总结了以下内容&#xff0c;一起往下看吧。一定会有所收获的哦。sha1sum命令用于生成和校验文件的sha1值。它…

Java中的传值与传引用

曾经对java中传值还是传引用的问题十分困惑&#xff0c;而且也被问到过许多次&#xff0c;无论是面试&#xff0c;还是平时我们平时的讨论中。 在stackoverflow上面浏览时&#xff0c;无意中发现了跟这个问题有关的论题&#xff0c;于是深入地查看了&#xff0c;感觉获益匪浅&a…

java高性能序列化_Java最佳实践–高性能序列化

java高性能序列化在使用Java编程语言时&#xff0c;我们将继续讨论与建议的实践有关的系列文章&#xff0c;我们将讨论并演示如何将对象序列化用于高性能应用程序。 所有讨论的主题均基于用例&#xff0c;这些用例源于电信行业关键任务超高性能生产系统的开发。 在阅读本文的…

linux进程属主6,20150917 Linux进程查看与管理以及作业管理

第一、基础知识MBR引导--内核--内核程序--》协调其它程序一般内核运行在硬件之上&#xff0c;各应用也在硬件之前1)OS的基本功能&#xff1a;文件系统、网络功能、进程管理、内存管理、驱动程序、安全功能以上为通用目的设置的程序。&#xff0c;程序指令数据&#xff0c;程序运…

在javaweb中通过servlet类和普通类读取资源文件

javaweb有两种方式读取资源文件 在Servlet中读取&#xff0c;可以使用servletContext&#xff0c;servletContext可以拿到web所有的资源文件&#xff0c;然后随便读&#xff0c;但是这种方法不常用&#xff0c;尽量少在Servlet中读取资源文件 在普通Java类中&#xff08;DAO中&…

数学图形(1.43)贝壳形曲线与鱼形曲线

贝壳形曲线 #http://curvebank.calstatela.edu/naturalcurves/slide7.jpgvertices 12000t from 0 to (2*PI)r 10*(0.7 2.6*cos(t) 1.3*pow(sin(90*t), 3))x r*sin(t) y r*cos(t) 鱼形曲线 #http://www.2dcurves.com/quartic/quarticfi.html vertices 1000 t from 0 to…

linux下编译ios,为iOS安装OpenCV

一&#xff0c;要求CMake 2.8.8 或者更高Xcode 4.2 或者更新二&#xff0c;从Git库取得最新的 OpenCV使用 git 客户端从 http://github.com/itseez/opencv clone Open 库。在 max os x 下&#xff0c;可以通过以下命令行完成cd ~/git clone https://github.com/Itseez/opencv…

学习使用资源文件[11] - DLL 中的资源文件

本例将把一张 bmp 图片, 以资源文件的方式嵌入 dll, 然后再调用.第一步: 建一个 DLL 工程, 如图:然后保存, 我这里使用的名称都是默认的.第二步: 建一个资源原文件, 如图:编辑内容如下(路径中的文件一定要存在):img1 BITMAP "c:\temp\test.bmp"然后, 取个名(后缀须是…

linux 自动安装 yum,LINUX6安装YUM仓库和实现开机自动挂载

# LINUX6安装YUM仓库和实现开机自动挂载---------------------------------安装环境-------------------------------Redhat6镜像文件&#xff1a;链接&#xff1a;https://pan.baidu.com/s/1DKH6adbrsipM-cTzH-wBgA 百度网盘 密码是hxcbVmware Workstation虚拟机工具&#x…

.NET Framework 4.0源代码

原文出处&#xff1a;http://blogs.microsoft.co.il/blogs/arik/archive/2010/07/12/step-into-net-framework-4-0-source-code.aspx 本文将向你展示如何配置Visual Studio 2010逐语句执行.NET Framework 4.0源代码。 为啥? 因为很酷。 因为能帮助调试。 你不仅能看到源代码…

linux blender骨骼绑定,在Linux系统中安装开源3D创建套件Blender的方法

Blender是免费的开源3D创建套件&#xff0c;它可在Linux系统中安装&#xff0c;可使用snap或flatpak命令安装Blender。简介Blender也称为开源3D建模软件&#xff0c;支持整个3D管道&#xff0c;建模&#xff0c;装配&#xff0c;动画&#xff0c;模拟&#xff0c;渲染&#xff…

配置源码管理工具(2)

源码管理是开发中最重要的事情之一&#xff0c;在vs.net里我们通常采用vss进行版本控制&#xff0c;在Eclipse里看帖子说用svn的比例很大&#xff0c;和IDE的集成性也很好。 1&#xff1a;服务器部署 下载地址是&#xff1a;http://subversion.apache.org/packages.html 下载的…

编写下载服务器。 第六部分:描述您发送的内容(内容类型等)

就HTTP而言&#xff0c;客户端下载的只是一堆字节。 但是&#xff0c;客户真的很想知道如何解释这些字节。 它是图像吗&#xff1f; 或者也许是ZIP文件&#xff1f; 本系列的最后一部分描述了如何向客户端提示她下载的内容。 设置 内容类型描述了要返回的资源的MIME类型 。 此…

ruby中的self

self&#xff0c;自己&#xff0c;在ruby中表示当前对象或默认对象。程序执行的任一时刻&#xff0c;有且仅有一个self。 1.谁成为self&#xff0c;在什么位置成为self&#xff1f; 要知道哪个对象是self&#xff0c;就必须知道当前的上下文。上下文主要有顶层上下文&#xff0…

二手宏碁上网本装linux,Acer国内20日首发“上网本” 放弃Linux使用XP

据相关媒体报道 8月20日将在国内正式推出XP系统版的8.9英寸超便携笔记本电脑Aspire One&#xff0c;放弃使用Linux系统&#xff0c;硬件配置方面&#xff0c;除了依然采用英特尔Atom处理器之外&#xff0c;推出120GB传统硬盘和SSD两个版本。其中&#xff0c;XP系统 120G传统硬盘…

免费WiFi,仅仅为好久没联系的你们

昨日&#xff0c;认识五年的朋友搬来与我一起住了&#xff0c;说不上来&#xff0c;没有激动&#xff0c;仅仅是突然感觉生活又多了一点生机。兴致上来&#xff0c;晚上立马联系了已经近四个月没有联系的好友&#xff0c;才知道他们的生活也因这几个月发生了翻天覆地的变化。究…

五猴分桃c语言课程设计,c语言程序设计五猴分桃问题实验报告.doc

c语言程序设计五猴分桃问题实验报告.doc 课程设计报告学院、系&#xff1a;吉林大学珠海学院计算机科学与技术系专业名称&#xff1a;软件工程课程设计科目C语言程序课程设计所在班级&#xff1a;10班学生学号&#xff1a;04121010学生姓名&#xff1a;赵学文指导教师&#xff…

c语言100以内奇数的和为多少,编写C#程序,计算100以内所有奇数的和。谢谢了,大神帮忙啊...

编写C#程序&#xff0c;计算100以内所有奇数的和。谢谢了&#xff0c;大神帮忙啊以下文字资料是由(历史新知网www.lishixinzhi.com)小编为大家搜集整理后发布的内容&#xff0c;让我们赶快一起来看一下吧&#xff01;编写C#程序&#xff0c;计算100以内所有奇数的和。谢谢了&am…

监控系统的多协议直播(RTSP RTMP HTTP Live Streaming)

监控系统的多协议直播&#xff08;RTSP RTMP HTTP Live Streaming) 转载于:https://www.cnblogs.com/cl1024cl/p/6204791.html