微信公众商城网站开发,网站上传小马后怎么做,武冈网络推广,山西百度推广开户java中字符和字节的转换在使用Java编程语言时#xff0c;我们将继续讨论与建议的实践有关的系列文章#xff0c;我们将讨论String性能调优。 特别是#xff0c;我们将着重于使用默认编码时如何有效地处理字符到字节和字节到字符的转换。 本文总结了两种建议的自定义方法与两… java中字符和字节的转换 在使用Java编程语言时我们将继续讨论与建议的实践有关的系列文章我们将讨论String性能调优。 特别是我们将着重于使用默认编码时如何有效地处理字符到字节和字节到字符的转换。 本文总结了两种建议的自定义方法与两种经典方法“ String.getBytes ”和NIO ByteBuffer 的性能比较该方法将字符转换为字节反之亦然。 所有讨论的主题均基于用例这些用例源于电信行业关键任务超高性能生产系统的开发。 在阅读本文的每个部分之前强烈建议您参考相关的Java API文档以获取详细信息和代码示例。 所有测试均针对具有以下特征的Sony Vaio进行 系统openSUSE 11.1x86_64 处理器CPUIntelRCoreTM2 Duo CPU T6670 2.20GHz 处理器速度1,200.00 MHz 总内存RAM2.8 GB JavaOpenJDK 1.6.0_0 64位 应用以下测试配置 并发工作者线程数1 每个工作人员重复测试线程1000000 整体测试次数100 字符到字节和字节到字符的转换 字符到字节和字节到字符的转换被认为是Java开发人员的常见任务这些Java开发人员正在针对网络环境进行编程操纵字节数据流序列化String对象实现通信协议等。因此Java提供了一些实用程序来启用开发人员将String 或字符数组转换为等效的字节数组反之亦然。 String类的“ getBytescharsetName ”操作可能是将String转换为其等效的字节数组的最常用方法。 由于可以根据所使用的编码方案来不同地表示每个字符因此上述操作需要“ charsetName ”以正确转换String字符也就不足为奇了。 如果未提供“ charsetName ”则该操作使用平台的默认字符集将String编码为字节序列。 将字符数组转换为其等效字节数组的另一种“经典”方法是使用NIO包的ByteBuffer类。 稍后将提供特定方法的示例代码片段。 与更细粒度的方法相比上述两种方法虽然非常流行并且毫无争议地易于使用和直接使用但它们的性能都大大不足。 请记住 我们不是在字符编码之间进行转换 。 为了在字符编码之间进行转换您应该坚持使用“ String.getBytescharsetName ”或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 Stringbyte [] ”转换回原始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[bpos1]0x00FF));buffer[i] c;}return new String(buffer);
} 我们从其2字节表示形式构造每个String字符。 使用结果字符数组我们可以通过使用“经典” 字符串构造函数“ new Stringchar [] ”将其转换回原始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。 因此较高的值更好。 正如预期的那样与“ stringToBytesASCIIString ”和“ stringToBytesUTFCustomString ”建议的方法相比“ String.getBytes ”和“ stringToBytesUTFNIOString ”方法的执行效果均较差。 如您所见与“经典”方法相比我们提出的方法可将TPS提高近30。 最后将字节数组转换为String的性能对比图 横轴表示测试运行的次数纵轴表示每次测试运行的每秒平均事务数TPS。 因此较高的值更好。 正如预期的那样无论是“ 新的字符串字节[]”和“bytesToStringUTFNIO字节[]”的方法较差相比“bytesToStringUTFCustom字节[]”建议的方法进行。 如您所见与“ new Stringbyte [] ”方法相比我们提出的方法使TPS增长了近15与“ bytesToStringUTFNIObyte [] ”方法相比TPS增长了近30。 总之当您处理字符到字节或字节到字符的转换时如果您不打算更改所使用的编码则可以通过使用自定义细粒度方法而不是使用提供的“经典”方法来获得卓越的性能。 String类和NIO包。 当将测试字符串转换为等效的字节数组时与“经典”方法相比我们提出的方法总体上提高了45的性能。 快乐编码 贾斯汀 聚苯乙烯 考虑到我们的一些读者提出的使用“ String.charAtint ”操作而不是使用“ 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) ((strChar0xFF00)8);b[bpos 1] (byte) (strChar0x00FF); }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.htmljava中字符和字节的转换