【问题标题】:Concatenating 2 bytes in Java efficiently在 Java 中有效地连接 2 个字节
【发布时间】:2017-06-08 03:54:34
【问题描述】:

我正在开发一个程序,我试图减少分配的内存量,我以前用来连接字符串,但问题是我做了几百万次这个过程,我做的越多,花费的时间就越长分配这些字符串。相反,现在我正在尝试使用字节。我想做这样的事情:

byte[] arr = new byte[5];
byte cat = arr[0] + arr[1]  //this addition would give me an error obviously. It's for demostration purposes

System.out.println(cat);

我只想获取第一个字节并将第二个字节放在它之后而不使用任何形式的字符串类,因为它需要更多的开销来连接字符串。有没有办法用最少的操作做到这一点?

【问题讨论】:

  • 看看这个question
  • 你想将字节连接成什么?您的代码显示您试图将它们连接成一个 byte,这没有多大意义。两个字节可以构成byte[2]shortchar
  • 您必须创建一个字节数组(或者,正如其他人所提到的,将最多 8 个字节一起打包成一个更大的原语,如 short、int 或 long)。但是,当您的字符串连接花费的时间太长时——您使用的是 StringBuilder 还是 +
  • 您的 + 可能是 O(n^2) 操作。您应该使用 StringBuilder 而不是直接连接。我没有方便的链接,但我确信在这个网站上有一个关于这个的问题。搜索 StringBuilder vs concatenation,或类似的。
  • @ProgrammingCuber 自己看一下 API:StringBuilder

标签: java byte concatenation


【解决方案1】:

使用System.arraycopy()创建一个新的输出字节数组,其大小等于要在新字节数组中连接的所有字节的总和

System.arraycopy() 是原生调用,肯定会比字符串拼接快。

【讨论】:

  • System.arraycopy() 有多贵?
  • System.arraycopy() 是最有效的数组复制方式,无论长度如何。
【解决方案2】:

如果你想将两个或多个字节“连接”成一个新的字节数组,只需使用array initializer 语法:

byte a = 1;
byte b = 42;
byte c = 99;

byte[] cat = {a,b,c};

System.out.println(Arrays.toString(cat)); // prints: [1, 42, 99]

但是,您的示例更类似于 substring() 调用,为此您应该使用 Arrays.copyOfRange(),例如

byte[] arr = {5,4,3,2,1};

byte[] cat = Arrays.copyOfRange(arr, 0, 2);

System.out.println(Arrays.toString(cat)); // prints: [5, 4]

【讨论】:

  • 我不想要一个新数组,我只想要一个新字节,而不是使用任何字符串方法来连接两个值。
  • @ProgrammingCuber 但是两个字节不能存储在一个字节中。您可以“添加”它们,但您特别要求将它们连接起来。一个字节长 8 位。如果您有两个字节(8+8=16 位),则根本无法将其存储在一个字节中。你的要求是不可能的。
  • @ProgrammingCuber 和连接两个字符串一样。如果第一个字符串是 3 长,第二个字符串是 5 长,则连接的字符串是 8 长。连接的大小是被连接的值大小的 sum
  • 好的,我明白你的意思了,为什么我想要的没有意义。
猜你喜欢
  • 2016-08-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-10-24
相关资源
最近更新 更多