![](/img/trans.png)
[英]How can I double the size of the array without getting NullPointException?
[英]How to double the size of an array
我必須實現一個從隨機生成器中獲取其元素的數組。 每當數組到達它的最后一個元素時,就會調用一個方法 resize() 來增加數組的大小。 在我的代碼中,在調用 resize() 方法之前,一切都會發生,它對數組的大小沒有任何影響。 它應該增加數組的大小以允許輸入更多元素。
for (int j=0; j<arr.length-1; j++) {
random= generator.nextInt(arr.length*4) ;
arr[j]=random;
}
if(arr_size==arr.length){
resize(arr);
for (int h=0; h<(arr.length-1)*2; h++) {
random= generator.nextInt(arr.length*4) ;
arr[h]=random;}
}
這是調整大小():
private static void resize(int[] arr) {
int[] tmp = new int[2*arr.length];
System.arraycopy(arr,0,tmp,0,arr.length);
arr = tmp;
}
設置arr = tmp
不會做您認為的那樣。 您只需將resize()
方法中的局部變量arr
指向局部變量tmp
。 您想要做的是返回tmp
並將其分配給方法之外的arr
。
if(arr_size==arr.length){
arr = resize(arr);
並將resize()
方法簽名更改為
private static int[] resize(int[] arr) {
//Resize
return tmp;
}
要帶走的關鍵是:在 Java 中將對象引用傳遞給方法時,您傳遞的是該對象引用的副本,可以將其視為該對象內存中位置的副本。 在被調用方法中對此 REFERENCE 的所有此類操作都不會在該方法之外生效。 但是,您可以操作實際對象本身,因為正如我所說,引用指向內存中具有完全相同對象的相同位置。
但是將內存中某個位置的副本更改為指向內存中的新位置不會導致原始調用對象引用指向同一位置
要么按照 Kon 的描述設置並返回 tmp 變量,要么通過引用傳入arr
以使對其的更改在 resize 函數之外保持不變:
private static void resize(ref int[] arr) { .... }
並稱之為
resize(ref arr);
嘗試這個 :
private static int[] resize(int[] arr) {
int[] tmp = new int[2*arr.length];
System.arraycopy(tmp,0,arr,0,arr.length);
System.out.println(tmp.length);
return tmp;
}
當您說 New int 時,引用已更改。 Java使用按引用復制而不是完全按引用傳遞,如果您通過新更改引用,則調用方方法屬性不會有任何更改,在您的情況下有返回類型並將其分配回arr。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.