Java 如何获得字符串2D数组的子数组(如减少前1000行)?

Java 如何获得字符串2D数组的子数组(如减少前1000行)?,java,arrays,multidimensional-array,Java,Arrays,Multidimensional Array,我有一个巨大的2D字符串数组。我想从2D数组中读取前1000行,将元素复制到其他几个2D数组中,并将原始数组减少1000行以节省内存。我尝试过以下代码: public static String[][] getSubArray(String[][] origArray, int offset) { String[][] tempArray = new String[origArray.length - offset][]; System.arraycopy

我有一个巨大的2D字符串数组。我想从2D数组中读取前1000行,将元素复制到其他几个2D数组中,并将原始数组减少1000行以节省内存。我尝试过以下代码:

    public static String[][] getSubArray(String[][] origArray, int offset) {
        String[][] tempArray = new String[origArray.length - offset][];
        System.arraycopy(origArray, offset, tempArray, 0, tempArray.length);
        return tempArray;
    }

但是这并没有像预期的那样工作,我得到了错误的数组。

第一点,它表明
Java
中的数组是一个
对象。当您初始化新数组(即
String[][]arr=newstring[10_000][10_000]
)时,这意味着您在内存中有连续的区域来保存所有
10_000 x 10_000
字符串元素,并引用
arr
对象。不可能减小阵列的大小。例如,
ArrayList
通过创建新对象和重写引用
arr
来增加内部数组大小

因此,您希望从阵列中获取1000个元素,并减少现有阵列以节省内存。通过这些步骤,它意味着:

  • 创建新的2D阵列1以保存1000个元素
  • 将1000个元素从原始数组复制到新数组1中
  • 新建二维数组2,保存原数组的其余元素
  • 将rest元素复制到新数组2中
  • 将参考
    arr
    更改为数组2
  • 原始数组将可用于GC,但它仍然存在(因为GC永远无法启动)。在任何情况下,由于您认为要做的事情,将增加内存使用

    我建议避免所有这些阵列拷贝。例如,你有巨大的2D阵列。不要修改此数组。让它作为一个数组存储在内存中。你有你需要的所有数据。只需将偏移量添加到方法中,并让它们准备好原始数组中的数据

    此外,
    Java
    中的2D数组是数组的数组。这意味着您可以获得对所需行的引用,而无需将其复制到新数组中。例如:

    String[][] originalArray = new String[2][2];
    String[] row_0 = originalArray[0];
    String[] row_1 = originalArray[1];
    
    p.S.当然,如果您必须在REST内或在当前JVM外发送此数组,那么您必须创建所需部分的副本,但仍然不必更改原始数组

    示例:

    public static void main(String... args) {
        String[][] origArray = {
                { "1.1", "1.2", "1.3", "1.4", "1.5" },
                { "2.1", "2.2", "2.3", "2.4", "2.5" },
                { "3.1", "3.2", "3.3", "3.4", "3.5" },
                { "4.1", "4.2", "4.3", "4.4", "4.5" },
                { "5.1", "5.2", "5.3", "5.4", "5.5" } };
    
        int offs = 0;
        final int rows = 2;
    
        while (offs < origArray.length) {
            doSomething(origArray, offs, rows);
            offs += rows;
            System.out.println("---");
        }
    
        originalArray = null;  // make it available for GC
    }
    
    public static void doSomething(String[][] origArray, int offs, int rows) {
        for (int row = offs; row < origArray.length && row < offs + rows; row++)
            doSomethingWithArray(origArray[row], row);
    }
    
    public static void doSomethingWithArray(String[] arr, int row) {
        // here you have a reference to row from originalArray (without copying it to the new array) 
        System.out.println(Arrays.toString(arr));
    }
    
    正如您所看到的,I
    doSomething
    包含3次迭代,共2行。并且没有任何数组副本或类似的smth


    p.S.毕竟,不要忘了清除对您的巨大数组的所有引用,以使其可用于GC。

    第一点,它表明
    Java
    中的数组是一个
    对象。当您初始化新数组(即
    String[][]arr=newstring[10_000][10_000]
    )时,这意味着您在内存中有连续的区域来保存所有
    10_000 x 10_000
    字符串元素,并引用
    arr
    对象。不可能减小阵列的大小。例如,
    ArrayList
    通过创建新对象和重写引用
    arr
    来增加内部数组大小

    因此,您希望从阵列中获取1000个元素,并减少现有阵列以节省内存。通过这些步骤,它意味着:

  • 创建新的2D阵列1以保存1000个元素
  • 将1000个元素从原始数组复制到新数组1中
  • 新建二维数组2,保存原数组的其余元素
  • 将rest元素复制到新数组2中
  • 将参考
    arr
    更改为数组2
  • 原始数组将可用于GC,但它仍然存在(因为GC永远无法启动)。在任何情况下,由于您认为要做的事情,将增加内存使用

    我建议避免所有这些阵列拷贝。例如,你有巨大的2D阵列。不要修改此数组。让它作为一个数组存储在内存中。你有你需要的所有数据。只需将偏移量添加到方法中,并让它们准备好原始数组中的数据

    此外,
    Java
    中的2D数组是数组的数组。这意味着您可以获得对所需行的引用,而无需将其复制到新数组中。例如:

    String[][] originalArray = new String[2][2];
    String[] row_0 = originalArray[0];
    String[] row_1 = originalArray[1];
    
    p.S.当然,如果您必须在REST内或在当前JVM外发送此数组,那么您必须创建所需部分的副本,但仍然不必更改原始数组

    示例:

    public static void main(String... args) {
        String[][] origArray = {
                { "1.1", "1.2", "1.3", "1.4", "1.5" },
                { "2.1", "2.2", "2.3", "2.4", "2.5" },
                { "3.1", "3.2", "3.3", "3.4", "3.5" },
                { "4.1", "4.2", "4.3", "4.4", "4.5" },
                { "5.1", "5.2", "5.3", "5.4", "5.5" } };
    
        int offs = 0;
        final int rows = 2;
    
        while (offs < origArray.length) {
            doSomething(origArray, offs, rows);
            offs += rows;
            System.out.println("---");
        }
    
        originalArray = null;  // make it available for GC
    }
    
    public static void doSomething(String[][] origArray, int offs, int rows) {
        for (int row = offs; row < origArray.length && row < offs + rows; row++)
            doSomethingWithArray(origArray[row], row);
    }
    
    public static void doSomethingWithArray(String[] arr, int row) {
        // here you have a reference to row from originalArray (without copying it to the new array) 
        System.out.println(Arrays.toString(arr));
    }
    
    正如您所看到的,I
    doSomething
    包含3次迭代,共2行。并且没有任何数组副本或类似的smth


    p.S.毕竟,别忘了清除对您的大型数组的所有引用,以使其可供GC使用。

    您能举一个
    String[][]Origaray
    的例子吗?您不能减小数组大小,您必须将数据复制到一个较小的数组中。您能举一个
    String[][]的例子吗origArray
    ?您不能减小数组大小,必须将数据复制到较小的数组中。我需要将元素从origArray复制到几个不同的二维数组中,这样就可以复制元素了。我真正想要的是将前几行复制到其他二维数组。根据您的解决方案,我将从原始数组中一次读取几行,然后将它们复制到其他数组中,这当然会减少内存使用量的突然增加,但有没有办法释放已复制元素占用的内存?我需要将元素从origArray复制到几个不同的2D数组,这样就可以复制元素了。我真正想要的是将前几行复制到其他二维数组。根据您的解决方案,我将从原始数组中一次读取几行,然后将它们复制到其他数组中,这肯定会减少内存使用量的突然增加,但有没有办法释放已复制元素占用的内存?