使用浅副本检索另一个数组中的数组段并保留引用

时间:2016-06-05 15:05:43

标签: java arrays

我正在寻找一种方法将初始数组从特定索引切割到另一个索引

int[] array = {10,5,4,4,3,5,6};
int[] arrayCopy;

在此示例中,如果我想从索引[1] 分段到索引[4] 。我存储在arrayCopy中的新数组应该看起来像arrayCopy[] = {5,4,4,3}。常见的问题是,我的目标是保持对原始数组的引用。所以,如果在arrayCopy中我更改了一个元素,那么array

也将改变
arrayCopy[] = {5,4,4,3}
arrayCopy[0] = 20 // arrayCopy[] = {20,4,4,3} and  array = {10,20,4,4,3,5,6};

我尝试了Arrays.copyOfRange()但是深层复制System.arraycopy()制作了浅层副本,但它没有完成我想要的是。

我试着制作自己的方法

public E[] fillArray(int[] _array, int begin, int end){
     int[] arrayTemp;    
     for ( int i = begin ; i <= end; i++ ) {        
           arrayTemp[i] = _array[i];
     } 
    return arrayTemp;            
}

输出

arrayCopy = fillArray(array,1,4);
Exception in thread "main" java.lang.NullPointerException

注意:我想保留数组机制而不使用ArrayList或......

2 个答案:

答案 0 :(得分:1)

  

Can I change the second array and the first array will change too?

Java阵列无法支持该功能。

Java数组是一个Object,因此所有数组都是独立的对象,它们有自己的数组值内存结构。

(这与C不同,其中数组是通过指针操作完成的,因此第二个指针可以指向已被另一个指针引用的数组的内存序列。)

如果你想要第一个数组的子数组,那么它被映射成使得对子数组的更改反映在主数组中,反之亦然,你还需要其它数据。

一种选择是使用List,并使用subList(int fromIndex, int toIndex)创建子列表:

  

返回此列表中指定的fromIndex,包含和toIndex之间的部分视图。 (如果fromIndextoIndex相等,则返回的列表为空。)返回的列表由此列表支持,因此返回列表中的非结构更改将反映在此列表中,并且反之亦然。

如果您已有数组,则可以使用Arrays.asList(T... a)将数组包含在列表中,然后使用subList()作为任何其他列表。

  

返回由指定数组支持的固定大小的列表。 (对返回列表的更改&#34;通过&#34;写入数组。)

请注意,List不适用于原语类型,因此如果您的数组是基元,则应使用相应类型的Buffer({ {1}},ByteBufferCharBufferDoubleBufferFloatBufferIntBufferLongBuffer)。

E.g。对于ShortBuffer,使用IntBuffer.wrap(int[] array, int offset, int length)创建缓冲区:

  

将int数组包装到缓冲区中。

     

新缓冲区将由给定的int数组支持;也就是说,对缓冲区的修改将导致数组被修改,反之亦然。

如果您始终通过int[]访问数组,使用IntBuffer.wrap(int[] array)来包装整个数组,您的代码可能会使用IntBuffer而不知道它是否正在访问完整数组或子阵列。

答案 1 :(得分:-1)

这应该有用。

public static int[] fillArray(int[] _array, int begin, int end){
int[] arrayTemp = new int[end-begin+1];    
for ( int i = begin ; i <= end; i++ ) {        
      arrayTemp[i-begin] = _array[i];
} 
return arrayTemp;            
}