[解決済み] Java 配列のクローンメソッド
2023-06-13 14:27:49
質問
Javaでclone()メソッドを配列に使用した場合、具体的に何を返すのでしょうか? それは元のデータからコピーされた新しい配列を返すのですか?
元です。
int[] a = {1,2,3};
int[] b = a.clone();
どのように解決するのですか?
このとき
clone
メソッドが配列に対して起動されると、ソース配列と同じ要素を含む(または参照する)新しい配列への参照が返されます。
つまり、あなたの例では
int[] a
はヒープ上に作成された別のオブジェクトのインスタンスであり
int[] b
はヒープ上に作成された別のオブジェクトのインスタンスです。 (すべての配列はオブジェクトであることを忘れないでください)。
int[] a = {1,2,3};
int[] b = a.clone();
System.out.println(a == b ? "Same Instance":"Different Instance");
//Outputs different instance
もし
int[] b
を変更しても、その変更は
int[] a
には反映されません。
b[0] = 5;
System.out.println(a[0]);
System.out.println(b[0]);
//Outputs: 1
// 5
ソース配列にオブジェクトが含まれる場合、これは少し複雑になります。 この場合
clone
メソッドは新しい配列への参照を返し、その配列はソース配列と同じオブジェクトを参照します。
ですから、もし私たちがクラス
Dog
...
class Dog{
private String name;
public Dog(String name) {
super();
this.name = name;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
という型の配列を作成し、それを入力します。
Dog
...
Dog[] myDogs = new Dog[4];
myDogs[0] = new Dog("Wolf");
myDogs[1] = new Dog("Pepper");
myDogs[2] = new Dog("Bullet");
myDogs[3] = new Dog("Sadie");
次に犬のクローン...
Dog[] myDogsClone = myDogs.clone();
配列が同じ要素を参照している...
System.out.println(myDogs[0] == myDogsClone[0] ? "Same":"Different");
System.out.println(myDogs[1] == myDogsClone[1] ? "Same":"Different");
System.out.println(myDogs[2] == myDogsClone[2] ? "Same":"Different");
System.out.println(myDogs[3] == myDogsClone[3] ? "Same":"Different");
//Outputs Same (4 Times)
これは、クローン配列からアクセスしたオブジェクトを変更した場合、ソース配列の同じオブジェクトにアクセスすると、同じ参照を指しているため、変更が反映されることを意味します。
myDogsClone[0].setName("Ruff");
System.out.println(myDogs[0].getName());
//Outputs Ruff
ただし、配列自体への変更はその配列にのみ影響します。
myDogsClone[1] = new Dog("Spot");
System.out.println(myDogsClone[1].getName());
System.out.println(myDogs[1].getName());
//Outputs Spot
// Pepper
オブジェクトの参照がどのように機能するかを一般的に理解していれば、オブジェクトの配列がクローンや変更によってどのような影響を受けるかを理解するのは簡単です。 参照とプリミティブについてさらに理解を深めるために、私はこの優れた 記事 .
関連
-
[解決済み] Java enumのメンバーを比較する:==またはequals()?
-
プロジェクトの依存関係を解決できない。
-
Solve モジュールのビルドに失敗しました。Error: ENOENT: no such file or directory エラー
-
JDK8 の Optional.of と Optional.ofNullable メソッドの違いと使い方を説明する。
-
[解決済み] JavaScriptでオブジェクトをディープクローンする最も効率的な方法は何ですか?
-
[解決済み] ディープクローンオブジェクト
-
[解決済み] JavaScriptで配列の先頭に新しい配列要素を追加するにはどうすればよいですか?
-
[解決済み] Javaでネストされたループから抜け出すには?
-
[解決済み】Android UserManager.isUserAGoat()の正しい使用例?)
-
[解決済み】JSP 2を使用して、JSPファイル内のJavaコードを回避するにはどうすればよいですか?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
プロジェクトの依存関係を解決できない。
-
シェルコマンドやスクリプトのJavaコール
-
Junitのユニットテストはjava.lang.Testを報告します。
-
SocketException java.netの4つの例外解決策。
-
API の戻り値を処理するために ResponseEntity を使用する
-
eclipse にリソースリーク:'in' が閉じない
-
eclipse 実行 Java、エラー: 選択を起動できず、レシーバーもありません。
-
Java:未解決コンパイル問題の解決方法
-
Java JDKのダイナミックプロキシ(AOP)の使用と実装の原理分析
-
CAS 5.1.8でhttpをサポートし、認証されていない認可サービスエラーのプロンプトが表示される問題を解決した。