【问题标题】:Is it possible to change the type of an array in Java? [duplicate]是否可以在 Java 中更改数组的类型? [复制]
【发布时间】:2012-08-07 07:04:44
【问题描述】:

可能重复:
byte array to Int Array

我有一个大的字节数组,我能不能把它解释为一个整数数组,这样每个条目就是原始字节的四个?

我的意思是这样的:

for (int i = 0; i < byteArray.length; i += 4) {
    intArray[i / 4] = byteArray[i] << 24 + byteArray[i+1] << 16 + byteArray[i+2] << 8 + byteArray[i+3];
}

而不是逐字节复制整个数组,因为数组很大,所以只需要从已经存在的数组中读取整数。

【问题讨论】:

  • 您当然可以读取字节并将它们放入 int 变量中,它们会自动向上转换为 int。然而,数组本身中的字节将并且必须保留为字节。
  • ByteBuffer.wrap(byteArray).toIntBuffer()
  • 哦,是的,这行得通。抱歉重复了,我之前读过这个问题,但不知道假设字节缓冲区是什么,它会涉及复制数组。
  • @user1559670 - 它确实涉及“复制数组”。

标签: java


【解决方案1】:

使用此代码:

IntBuffer intarray = ByteBuffer.wrap(bytearray).order(ByteOrder.BIG_ENDIAN).asIntBuffer();
 intarray.get(100);

将占用很少的额外堆空间。实际上,它包装了字节数组并创建了一个 int 数组视图。明显更快,在我的 PC 中,缓冲区大小为 INT_MAX 需要几纳秒。

【讨论】:

    【解决方案2】:

    问:Java 中可以改变数组的类型吗?

    A:一般来说,“不”。您必须逐项复制/转换。

    在这种特定情况下:是的,当然。只需使用 asIntBuffer()。例如:

    import java.nio.*;
    import java.nio.IntBuffer;
    import java.nio.ByteBuffer;
    
    public class MyClass {
    
      public static void main(String[] args) throws Exception {
        ByteBuffer byteBuffer = ByteBuffer.allocate(1024);
        int[] array = new int[] { 1, 2, 3, 4 };
        IntBuffer IntBuf = byteBuffer.asIntBuffer();
        IntBuf.put(array);
        ...
    

    请注意,java.nio 引入了这些转换(以及相关的“翻转”、“换行”、更改字节顺序的能力等)。

    【讨论】:

    • PS:波西米亚语是正确的。 original 数组不变。 asIntBuffer() 和朋友只是复制 数组。根据需要进行转换。非常非常有效。
    【解决方案3】:

    没有。数组的类型是不变的。

    没有如果,但是是或者也许是。

    【讨论】:

    • 你是绝对正确的 :) 我认为 OP 只是想知道是否有替代方法来逐个复制和转换数组。而且,在这种情况下,有。
    猜你喜欢
    • 2011-06-09
    • 2015-09-09
    • 1970-01-01
    • 2014-05-31
    • 2015-09-11
    • 2012-05-29
    • 1970-01-01
    • 1970-01-01
    • 2013-04-21
    相关资源
    最近更新 更多