1.ディープコピーとシャローコピーの違い
Java配列のコピー操作は、ディープコピーとシャローコピーに分けることができます。簡単に言うと、ディープコピーはオブジェクトの値とオブジェクトのコンテンツをコピーできます。シャローコピーとは、オブジェクト参照のコピーを指します。
2つ目は、System.arraycopy()メソッドがコピーを実現することです。
1.ネイティブの静的メソッドarraycopy()がSystemで提供されており、アレイ間でコピーするために使用できます。1次元配列の場合、この種のコピー属性値の転送、コピーの変更は元の値に影響しません。オブジェクトが2次元または1次元の配列に格納されている場合、コピーの結果、1次元の参照変数がコピーの1次元の配列に渡されます。コピーが変更されると、元の配列が影響を受けます。
2.System.arraycopyの関数プロトタイプは次のとおりです。
public static void arraycopy(Object src、 int srcPos、 Object dest、 int destPos、 int length)
その中で、srcはソース配列を表し、srcPosはコピーされるソース配列の開始位置を表し、descはターゲット配列を表し、lengthはコピーされる長さを表します。
3.System.arraycopyを使用して配列コピーを実装する例:
package com.shuzu;
/ *システムはネイティブメソッドarraycopy()を提供します* /
パブリッククラスSsytemArrayCopy {
public static void main(String [] args){
ユーザー[] users = new User [] {new User(1、 "admin"、 "[email protected]")、new User(2、 "maco"、 "maco @ qq、com")、new User(3 、 "kitty"、 "kitty @ qq、com")}; //初期初期化異性数組
User [] target = new User [users.length]; //新しいターゲットオブジェクト配列を作成します
System.arraycopy(users、0、target、0、users.length); //コピーを実現
System.out.println( "ソースオブジェクトとターゲットオブジェクトの物理アドレスは同じですか:" +(users [0] == target [0]? "Shallow copy": "Deep copy"));
target [0] .setEmail( "[email protected]");
System.out.println( "ターゲットオブジェクトの属性値を変更した後のソースオブジェクトユーザー:");
for(ユーザーユーザー:ユーザー){
System.out.println(user);
}
}
}
クラスユーザー{
プライベート整数ID;
プライベート文字列ユーザー名;
プライベート文字列メール;
//パラメータコンストラクタなし
public User(){}
//パラメータを持つコンストラクタ
public User(Integer id、String username、String email){
素晴らしい();
this.id = id;
this.username =ユーザー名;
this.email = email;
}
public Integer getId(){
IDを返します。
}
public void setId(Integer id){
this.id = id;
}
public String getUsername(){
ユーザー名を返す;
}
public void setUsername(String username){
this.username =ユーザー名;
}
public String getEmail(){
メールを返す;
}
public void setEmail(String email){
this.email = email;
}
@オーバーライド
public String toString(){
return "User [id =" + id + "、username =" + username + "、email =" + email
+ "]";
}
}
プログラムを実行した結果:
次の図は、System.arraycopy()のコピープロセスです。