使用移位运算符理解java数组初始化

Aas*_*war 4 java arrays bit-manipulation

我知道java中任何数组的最大大小是Integer.maxValue。因为数组是 int 索引的。但我知道,我们也可以使用移位运算符初始化数组。我试过了,但它抛出了奇怪的输出。

        int arr[] = new int[1<<5];
        System.out.println(arr.length);
        arr = new int[1<<10];
        System.out.println(arr.length);
        arr = new int[1<<20];
        System.out.println(arr.length);
        arr = new int[1<<25];
        System.out.println(arr.length);
        arr = new int[1<<40];
        System.out.println(arr.length);
        arr = new int[1<<111];
        System.out.println(arr.length);
Run Code Online (Sandbox Code Playgroud)

我预计每移动 n 次,数组的结果大小将为 2^n。

但输出如下 -

32
1024
1048576
33554432
256
32768
Run Code Online (Sandbox Code Playgroud)

因此,如果有任何其他方法可以在适当的大小分配中初始化这样的数组,是否可以通过移动 1100 次来初始化大小为 2^100 的数组?

Iva*_*van 5

您会看到由于溢出而System.out.println(1 << 40);打印256。在 Java 中int溢出所以Integer.MAX_VALUE + 1等于Integer.MIN_VALUE.

你可以尝试做这样的事情:

int[] arr = new int[1 << 100];
Run Code Online (Sandbox Code Playgroud)

但是因为两个操作数都是类型int,所以结果也将是int. 由于溢出,它将不是 2^100,而是 16。

如果您尝试让 JVM 将结果转换为long执行以下操作

int[] arr = new int[1L << 100];
Run Code Online (Sandbox Code Playgroud)

你会得到编译错误,因为数组的长度应该是类型int

  • @AashishPawar 没有办法。顺便说一句,你为什么需要它?如果您需要一种非常非常大的数组,并且可以通过索引进行持续访问,则可以使用“HashMap&lt;Long, Integer&gt;”。另外,具有 N 个元素的 int 数组将立即在堆中分配“N*4”字节。因此,对于大型阵列,您将需要大量 RAM (2认同)