我正在尝试找到解决极大数组的解决方案/解决方法而不创建新副本。这是我的问题。
假设我有一个大小为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?
答案 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]
}
}