2010-11-20 7 views
1

私はJavaで、配列を関数に渡すと元の配列を変更することに気付きました。私は再帰を使用するバックトラッキングメソッドを実装しようとしており、渡された配列の内容をコピーする独自の配列を持つ各呼び出しを必要とします。配列やarraylistsを効率的にコピーするには?

たとえば、元の配列があり、関数を呼び出すループ。各呼び出しに元の配列のすべてを含む配列を持たせたいが、変更するものは元の配列を変更するのではなく、それ自体の中にとどまる。これは可能ですか?

解決策がある場合は、arraylistsも可能でしょうか?

+1

内容が同じオブジェクトを参照するように配列をコピーするか、配列の内部にオブジェクトを実際にコピーするかどうかはわかりません。あなたが前者を意味するなら、チャンドラの答えは正しいものです。しかし、実際に配列自体のオブジェクトを変更しないようにしたい場合は、クローンを避けることを強くお勧めします。代わりに、オブジェクトを不変にする必要があるので、変更によって新しいインスタンスが作成されます。 –

+0

check http://stackoverflow.com/questions/2589741/how-to-effectively-copy-an-array-in-java –

答えて

5

Arrays.copyOfの方法を使用できます。

+2

そして、あなたはただarraylistを複製することができます – Tom

+0

私はこれを行うには高価な方法だと仮定しています。再帰メソッドが必要だが、各呼び出しに独自の配列がある場合は、毎回新しい配列を作るのが安価な別の方法がありますか? – sudo

+1

@sudo:それで、あなたはそれをコピーせずに配列をコピーしたいですか? – SimonJ

2

おそらくJavaでこれを行う最も速い方法はSystem.arraycopyの方法documented hereです。これはネイティブメソッドであり、一般的にはあなたが得るほど高速です。

場合によっては、アレイ全体を実際に変更していない場合に役立つコピーオンライトアプローチを試すこともできます。

+1

Arrays.copyOfはSystem.arraycopyをフードの下で使用し、宛先配列の作成を担当するので注意しておきましょう。既存の宛先がない場合は、Arrays.copyOfを使用する労力が少なくなります。 1.6 – earcam

関連する問題