截断数组而不复制它?

时间:2009-07-02 13:19:38

标签: java

在Java中,有没有办法截断数组而不必复制它?常见的习语是Arrays.copyOf(foo, n)(其中新数组的长度为n个元素)。我不认为有另一种选择,但我很好奇是否有更好的方法。

4 个答案:

答案 0 :(得分:19)

初始化后,Java中的数组长度无法更改,因此您不得不使用新大小进行复制。实际上,Java数组的length参数被声明为final,因此一旦设置就无法更改。

如果您需要更改数组的大小,我会使用ArrayList。

答案 1 :(得分:5)

我正在考虑更多......而且只是为了踢,如下所示。

注意:这只是“可以做到的吗?” Java黑客攻击中的智力锻炼。任何试图在生产代码中实际使用这个想法的人都应该得到毫无疑问会产生的所有痛苦。

public class Foo
{
    private static byte[] array = new byte[10];

    public static void main(String[] arg) throws Exception
    {
        Field field = Unsafe.class.getDeclaredField("theUnsafe");
        field.setAccessible(true);
        Unsafe unsafe = (Unsafe) field.get(null);
        Field arrayField = Foo.class.getDeclaredField("array");
        long ptr = unsafe.staticFieldOffset(arrayField);
        // doesn't work... there's gotta be a way though!
        unsafe.reallocateMemory(ptr, 5);
        System.out.println("New array size is: " + array.length);
    }
}

答案 2 :(得分:0)

我不相信。一个数组被分配为一个连续的内存块,我无法想象有任何方法可以释放该块的一部分。

答案 3 :(得分:0)

简洁地说:不,据我所知,没有。 Java数组是固定大小的数据结构。 “逻辑”调整大小的唯一方法是创建一个新数组并将所需元素复制到新数组中。

相反:您可以(可能)实现一个将数组包装到集合中的类,并使用“size”变量来逻辑地减少数组的长度而不实际复制值。这种方法的实用性有限......我能想象的唯一情况就是当你处理一个巨大的数组时,由于内存限制而无法复制它。

复制阵列在时间上相对便宜......除非你做了数百万次,在这种情况下你可能需要考虑一个算法来避免这种情况,而不是浪费你的时间来捣乱“变长数组“。

当然......你可以使用ArrayList代替。是