16
final Integer[] arr={1,2,3};
arr[0]=3;
System.out.println(Arrays.toString(arr));

上記のコードを試して、最終的な配列の変数を再割り当てできるかどうかを確認しました[ ans:it can be]。最終的なInteger[]配列では、現在のインスタンスとは別にInteger[]の別のインスタンスを割り当てることができないことを理解しています。最初に割り当てられます。配列変数も変更できないようにすることが可能かどうかを知りたいです。

4

6 に答える 6

27

私の知る限り、これは不可能です。

ただし、たとえば。の変更不可能なビューを作成するメソッドCollections.unmodizableList(..)List<Integer>があります。

変更不可能なビューリストの作成者でさえ、基になる(変更可能な)リストを変更できないことを保証したい場合は、GuavaのImmutableListを参照してください。

于 2010-09-17T18:05:17.880 に答える
9

いいえ。配列の内容は変更できます。あなたはそれを防ぐことはできません。

コレクションには、変更できないコレクションを作成するためのさまざまな方法がありますが、配列は提供されていません。

于 2010-09-17T18:05:22.833 に答える
5

最後のキーワードは、arr参照の変更を防ぐだけです。つまり、次のことはできません。

final int[] arr={1,2,3}; 
arr = new int[5]; 

arrが参照しているオブジェクトが(配列のような)可変オブジェクトである場合、それを変更することを妨げるものは何もありません。

唯一の解決策は、不変オブジェクトを使用することです。

于 2010-09-17T18:15:38.043 に答える
2

別の方法は、この関数を使用することです。

Arrays.copyOf(arr, arr.length);
于 2017-08-31T12:43:19.627 に答える
0

キーワード「final」は、参照(ヒープ内のオブジェクトのメモリ位置へのポインタ)にのみ適用されます。オブジェクトのメモリアドレス(場所)を変更することはできません。不変性を内部的にどのように処理するかは、オブジェクト次第です。

intはプリミティブデータ型ですが、int[]はオブジェクトとして扱う必要があります。

あなたはこれを行うことはできません

final int a = 5
a = 6

あなたはこれを行うことができます:

final int[] a = new int[]{2,3,4};
  a[0] = 6;

あなたはこれを行うことはできません:

final int[] a = new int[]{2,3,4};
 a = new int[]{1,2,3}
于 2011-03-03T22:49:50.643 に答える
0

この古い質問を読んでいる他の人には、GoogleGuavaの不変のコレクションもあることを覚えておいてください。ImmutableListは、Collections.unmodizableList()よりもはるかに強力なパフォーマンスを備えており、真に不変であり、可変コレクションに支えられていないため、間違いなく安全です。

于 2015-04-15T12:49:12.503 に答える