复制Java数组到另一个数组的上方。

3

我想知道是否真的没有办法将一个数组按字节复制到另一个不同原始类型的数组中,就像我的搜索结果所显示的那样。 我有一个来自文件的byte[],它表示内存中的int[]。我可以进行移位操作,例如:

myints[i] = (mybytes[0] << 24) || (mybytes[1] << 16) || (mybytes[2] << 8) || mybytes[0];

但是这种性能杀手不可能成为首选的方式吧?难道没有其他方法吗?
byte[] mybytes = ... coming from file  
int[] myints = new int[mybytes.length / 4];  
MagicCopyFunction: copy mybytes.length bytes from 'mybytes' into 'myints'

2
为什么它会影响性能?你是如何测试的? - Bob Dalgleish
其中一个回答 [memcpy函数在C++中到Java的等效] (https://dev59.com/elfUa4cB1Zd3GeqPHF35) 可能会有所帮助,但是如果需要优化以提高性能和/或需要这种低级访问权限,则可能不应该使用Java。 - Bernhard Barker
你可能可以使用不安全的方式来实现这个,但我不确定... - assylias
我无法想象这个组装过程中涉及四次值访问、三次移位和逻辑或运算的速度大致与一次操作处理四个字节的简单int复制相同。不幸的是,我忘了提到我在进行安卓编程,所以没有unsafe类可用。 - Droidum
1个回答

4
最简单的方法是使用Buffer
ByteBuffer b = ByteBuffer.allocate(1024);
// Fill the bytebuffer and flip() it
IntBuffer i = b.asIntBuffer();

1
我认为这并没有提高原始代码的性能。当你从IntBuffer中获取一个int时,它最终会调用Bits.makeInt,而这正是OP想要避免的 - return (int)((((b3 & 0xff) << 24) | ((b2 & 0xff) << 16) | ((b1 & 0xff) << 8) | ((b0 & 0xff) << 0))); - Eran
1
虽然这可能不会对性能产生太大影响(尽管使用直接缓冲区应该更快),但至少它可以防止他自己编写那么多代码,可能会出现错误。 - Kayaman
好吧,即使缓冲区不更快,至少它让我远离这可怕的语法 :-) - Droidum

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接