在Java中,如何有效地将数据从String复制到char[]/byte[]



我需要将许多大而不同的String str的内容复制到静态字符数组中,并在要求效率的工作中频繁使用该数组,因此避免分配太多新空间很重要。

由于上述原因,str.toCharArray()被禁止,因为它为每个String分配空间。

众所周知,charAt(i)比使用方括号[i]更慢、更复杂。所以我想使用byte[]char[]

一个好消息是,有一个str.getBytes(srcBegin, srcEnd, dst, dstBegin)。但坏消息是,它已经(或将要(被弃用。

那么,我们如何才能完成这项艰巨的工作呢?

我相信您想要getChars(int, int, char[], int)。这将把字符复制到指定的数组中,我希望它能做到这一点;尽可能有效";。

除非你真的需要,否则你应该避免在文本和二进制表示之间转换。除此之外,转换本身可能很耗时。

小型盘点:

  • String执行Unicode文本;它可以被归一化(java.text.Normalizer(
  • int[]代码点是Unicode符号
  • char[]是Unicode UTF-16BE(每个字符2个字节(,有时对于代码点需要2个字符:代理项对
  • byte[]用于二进制数据。UTF-8中的Unicode文本在有大量ASCII响应时相对紧凑。拉丁语-1

处理可以在ByteBuffer、CharBuffer、IntBuffer上完成。

在处理亚洲脚本时,int代码点可能是最可行的。否则字节似乎是最好的。

当Character类用于对Unicode块和脚本、多个脚本中的数字、表情符号等进行分类时,代码点(或字符(也很有意义。

性能最好以字节为单位,因为字节通常是最紧凑的。可能是UTF-8。

不能有效地处理内存分配getBytes应与字符集一起使用。几乎总是会发生某种转变。由于新的java版本可以为Latin-1、ISO-8859-1等编码保留字节数组而不是字符数组,即使使用内部字符数组也不行。

可以做的是使用快速字节缓冲区。

或者,对于语言分析,可以使用数据库,也可以使用图形数据库。至少是一些可以利用并行性的东西。

您在很大程度上被限制在字符串类中提供的API中,而且很明显,不推荐使用的方法应该被getBytes()(或允许指定字符集的替代方法。

换句话说:你所说的那个问题;具有许多需要进入数组的大字符串";不容易解决。

因此,一个明显的否定答案是:仔细研究你的设计。如果性能真的很关键,那么就不要在前面创建那么多大字符串

换句话说:如果你的测量结果让你相信你确实存在真正的性能问题,那么根据需要调整你的设计。也许有一种机会,在你的琴弦所在的地方;即将到来";在里面您已经不使用String对象,但以后在性能方面会使用更适合您的对象。

但当然:这将导致一个复杂的、容易出错的解决方案,在这个解决方案中,你要做很多";存储器管理";你自己因此,正如所说:先测量。确保你有一个真正的问题,它实际上就在你认为的地方。

str.getBytes(srcBegin, srcEnd, dst, dstBegin)确实已被弃用。相关文件建议使用getBytes()。如果您需要str.getBytes(srcBegin, srcEnd, dst, dstBegin),因为有时您不必转换整个字符串,我想您可以先转换substring(),但我不确定这会对代码的效率产生多大影响(如果有的话(。或者,如果它对你来说都一样,如果你把它存储在char[]中,那么你可以使用getChars(int,int,char[],int(,这是不推荐使用的。

最新更新