1. 程式人生 > >關於Java 拷貝陣列方法 Arrays.copyOf() 是地址傳遞還是值傳遞

關於Java 拷貝陣列方法 Arrays.copyOf() 是地址傳遞還是值傳遞

在看別人的關於 CopyOnWriteArrayList 這個類的時候,看到有人提出了關於:陣列拷貝的方法Arrays.copyOf() 的問題,如下:
只是複製了引用地址,陣列內的物件還是和舊陣列一樣的?

看了他的問題,我也是有點迷惑了,以前都沒想過這個。既然如此,我就有如下的測試,以解心中之疑惑。

看了圖和執行結果,可以看出來,這分明就是2個不相干的陣列嗎。兩者是沒關係。
然後再看看原始碼裡面,是怎麼在那複製陣列的。

    public static <T> T[] copyOf(T[] original, int newLength) {
        return (T[]) copyOf(original, newLength, original.getClass());
    }

    public static <T,U> T[] copyOf(U[] original, int newLength, Class<? extends T[]> newType) {
        T[] copy = ((Object)newType == (Object)Object[].class)
            ? (T[]) new Object[newLength]
            : (T[]) Array.newInstance(newType.getComponentType(), newLength);
        System.arraycopy(original, 0, copy, 0,
                         Math.min(original.length, newLength));
        return copy;
    }

可以看到,他是在方法內部,新建了一個相同型別的陣列,然後呼叫系統方法
System.arraycopy(original, 0, copy, 0,Math.min(original.length, newLength));

original - 源陣列。 
0 - 源陣列中的起始位置。 
copy - 目標陣列。 
0 - 目標資料中的起始位置。 
Math.min(original.length, newLength) - 要複製的陣列元素的數量。

2018.08.03 更新

看到不少老鐵對這個測試存在很大疑問,so,師兄我就再測試一下。

大師兄最帥

不是有老鐵說我的第一個測試使用的是有爭議的數字和字串嘛,大師兄我就再弄個物件的。看程式碼名字,就是從其他地方獲得三個student物件到這個數組裡面,列印沒複製之前的陣列資訊。然後修改新新陣列的第0個學生的名字。然後再輸出copy出來的陣列和源陣列,看看啥情況。

結果:

啪啪啪的打臉啦。(哎喲,,,,疼,,,,疼,,,,疼,,,,疼,,,,疼,,,)

雖然copy出來的是新陣列沒錯。

但是新舊陣列都是指向同一個引用滴,哦 my god 。

所以:

最後的結論是:Java 拷貝陣列方法 Arrays.copyOf() 是地址傳遞。

感謝留言的小夥伴,不然師兄我就誤人子弟啦。

相關推薦

關於Java 拷貝陣列方法 Arrays.copyOf() 是地址傳遞還是傳遞

在看別人的關於 CopyOnWriteArrayList 這個類的時候,看到有人提出了關於:陣列拷貝的方法Arrays.copyOf() 的問題,如下: 只是複製了引用地址,陣列內的物件還是和舊陣列一樣的? 看了他的問題,我也是有點迷惑了,以前都沒想過這個。既然如此,我就有如

關於Java 拷貝數組方法 Arrays.copyOf() 是地址傳遞還是傳遞

clone images java 地址 tput mage alt 元素 color 基本元素為對象時,淺拷貝,拷貝引用(ArrayList 的clone()調用Arrays.copyof(),官方文檔註明為淺拷貝) class A{ int

Java陣列查詢Arrays類的binarySearch()方法詳解

Arrays類的binarySearch()方法,可以使用二分搜尋法來搜尋指定的陣列,以獲得指定物件。該方法返回要搜尋元素的索引值。binarySearch()方法提供多種過載形式,用於滿足各種型別陣

java的引數傳遞傳遞還是地址傳遞

java的引數傳遞是值傳遞還是地址傳遞結論: 1、基本型別作為引數傳遞時,是傳遞值的拷貝,無論你怎麼改變這個拷貝,原值是不會改變的 2、物件作為引數傳遞時,是把物件在記憶體中的地址拷貝了一份傳給了引數。 基本型別作為引數傳遞 public class Test1

java拷貝陣列(深拷貝)

假設陣列a,b。要把陣列a中的元素拷貝到b中,如果直接b = a的話。就會使b指向a的儲存區域,對b的修改也會引發a中元素的修改(淺拷貝)。public class ShallowCopy { public static void main(String[] args) {

java用spilt方法分割ip地址

必須對"."進行轉意 “ . ”在正則表示式中有特殊的含義,因此我們使用的時候必須進行轉義。 public static void main(string[] args) {   string v

理解Java中的引用傳遞傳遞

包裝類 pri ble buffer 聲明 change cnblogs padding ber 關於Java傳參時是引用傳遞還是值傳遞,一直是一個討論比較多的話題,有論壇說Java中只有值傳遞,也有些地方說引用傳遞和值傳遞都存在,比較容易讓人迷惑。關於值傳遞和引用傳遞其

java參數傳遞傳遞

自定義類型 hello 傳遞方式 bsp 我們 n) %20 images color 一 概述 1.什麽是參數傳遞? 調用方法時向形參傳遞數據的過程叫做參數傳遞。在編程語言中有兩種傳遞方式:值傳遞與引用傳遞。必須強調的是,這裏提到的兩種傳遞方式不是僅限於java使用到

java 引用傳遞傳遞

方式 con 並不是 一個 基本類型 依賴 tro 結束 事務 1.為什麽要分值傳遞和引用傳遞:   基本類型存在在棧中,復合類型(對象)存在堆中。操作棧的速度要快於堆,且對象的復制相比基本類型不僅浪費內存而且速度比較慢。 從這裏就可以看出來:對象是按照引用傳遞(數據庫事務

java引用傳遞傳遞

pos += 基本 test 特殊 今天 對象類型 改變 ring 關於Java傳參時是引用傳遞還是值傳遞,一直是一個討論比較多的話題,有論壇說Java中只有值傳遞,也有些地方說引用傳遞和值傳遞都存在,比較容易讓人迷惑。關於值傳遞和引用傳遞其實需要分情況看待,今天學習和分析

Java中的引用傳遞傳遞

基本類型包裝類 new except pri 引用類型 otsu 靜態 數據 app   1.基本類型和引用類型在內存中的保存  Java中數據類型分為兩大類,基本類型和對象類型。相應的,變量也有兩種類型:基本類型和引用類型。  基本類型的變量保存原始值,即它代表的值就是數

java引用傳遞還是傳遞

app 分享 jvm內存模型 作用 相同 http thumb 第一個 bject 首先,不要糾結於 Pass By Value 和 Pass By Reference 的字面上的意義,否則很容易陷入所謂的“一切傳引用其實本質上是傳值”這種並不能解決問題無意義論戰中。更何

java引用傳遞傳遞

進行 swap 源代碼 代碼 oid wap 值傳遞 declared 一個 2個interger的引用對象傳給一個swap方法在方法內部進行交換,返回後 1.1 java中方法參數傳值方式 java中方法傳參數都是值傳遞的,只不過根據參數的類型是引用類型還是非引用類型 引

java 裏面的引用傳遞傳遞問題

system nal 新建 類型 tostring 問題 沒有 引用 操作 1.先從值引用:String a ="God";//a存放在stack 中 God存放在head(堆中)創建了兩個對象String b=a;a指向堆中的God對象b=a;說明b也

關於java的引數傳遞傳遞、引用傳遞和傳、傳引用等)

所謂引數傳遞就是用函式呼叫所給出的實參(實際引數)向函式定義所給出的形參(形式引數)設定初始值的過程。基本的有三種引數分別為: (1)傳值:   (2)傳址(即是傳指標) (3)傳引用 以上

九、java基礎之引數傳遞傳遞

一、值傳遞/*程式在執行過程中,引數傳遞問題: 1.傳遞資料是基本資料型別 2.傳遞資料是引用資料型別 */1.以下程式是傳遞基本資料型別 public class ClassTest04 { public static void m1(int i){ i++;

九、java基礎之參數傳遞傳遞

oid 值傳遞 [] 問題 數據 sta out 執行過程 入口 一、值傳遞/*程序在執行過程中,參數傳遞問題: 1.傳遞數據是基本數據類型 2.傳遞數據是引用數據類型 */1.以下程序是傳遞基本數據類型 public class ClassTest04 {

java 物件傳入到函式原物件不改變 傳遞 引用傳遞

背景: 做專案的時候,將一個空物件的引用傳入到方法中,期待方法裡面建立一個新的物件給這個引用,後面就可以拿著這個物件用了。   可結果就是,定義在外面的物件引用並沒有拿到這個引用 demo.java public class Entry { public st

討論java中呼叫函式,形參的傳遞傳遞還是引用傳遞的問題

首先說結論: 當引數是引用資料型別時,傳入形參的是實參的引用;(證一) 當引數是基本資料型別時,傳入形參的是實參值;(證二) 證明如下: (證一) public class PassByReferenceOrValueTest { public static void main(String

Java千百問_05面向物件(011)_引用傳遞傳遞有什麼區別

1、什麼是值傳遞 值傳遞,是將記憶體空間中某個儲存單元中存放的值,傳送給另一個儲存單元。(java中的儲存單元並不是實體記憶體的地址,但具有相關性) 例如: //定義了一個改變引數值的函式 public static void changeVa