获取一个数组,而不创建新副本

时间:2013-03-22 19:34:39

标签: java arrays

我正在尝试找到解决极大数组的解决方案/解决方法而不创建新副本。这是我的问题。

假设我有一个大小为1亿或更多的double / int数组。我在一个非常大的数组中存储了代表不同内容的许多不同数组,以显着节省内存使用量。因此,我没有100万个大小为100的阵列,而是拥有一个大小为1亿的阵列。我存储索引(开始和停止)以跟踪我的数据。

我希望得到数千个大小为100的切片。如果我使用方法Arrays.copyOfRange()来获取切片,它就会失败将所有内容放在一个大型数组中的目的,因为每个切片都是一个占用内存的新副本

我有遗留代码(许多人多年来写的超过100万行),它们使用自己的数据(较小的数组)。无法修改现有代码以使用大型数组中的索引(开始,结束)。

如果我能以某种方式返回原始数组,使返回的数组是一个引用(或假冒),其中索引0是原始大数组中的某个任意索引,那就太棒了。

在C / C ++中,我可以轻松返回一个指针,该指针具有调用代码可以使用的特定偏移量和长度。

我在Java中有哪些选择?

编辑:我查看了以下类似的问题,但它不包含对我的问题的回复。 How to get a sub array of array in Java, without copying data?

4 个答案:

答案 0 :(得分:1)

您最好的选择是将切片的索引存储在单独的结构中,例如存储这些索引的数组。

这样,您就不会将大型数组实例化为整个数据数组的分区。

答案 1 :(得分:1)

对于int值数组,可以换入IntBuffer。你也可以包装一个数组的片段。

int[] largeArray = . . .

// create a slice containing the elements 100 through 149 (50 elements):
IntBuffer slice = IntBuffer.wrap(largeArray, 100, 50);

答案 2 :(得分:0)

您可以创建自己的对象来存储索引,大小和对原始数组的引用吗?

class CustomizedArray {
  int startIndex;
  int size;
  int[] originalArray;

  public CustomizedArray(int startIndex, int size, int[] originalArray) {
    this.startIndex = startIndex;
    this.size = size;
    this.originalArray = originalArray;
   }

   public int getIndex(int index) {
     int originalIndex = startIndex+index;
     if(index <0 || originalIndex >= startIndex+size) {
        throw new IndexOutOfBoundException();
     }
     return originalArray[originalIndex];


}

然后你可以将CustomizedArray存储在更大的结构中。

答案 3 :(得分:0)

如何创建一个包含对原始数组和起始索引的引用的包装类,并使用此包装器的实例来访问原始数组。

下面的代码可能在语法上不正确,但它应该给你一个想法。

public class ArraySlice(){
  private int startIndex;
  private int[] originalArray;
  //getters-setters

  public ArraySlice(int[] originalArray, int startIndex){
    //Initialize
  }

  public int get(int index){
    return originalArray[startIndex+index]
  }
}