空白の final として宣言されている hashMap を変更できるのに、プリミティブ型を変更できないのはなぜですか? たとえば、マップを作成する場合
final Map<String, String> someMap;
コンストラクターで初期化しても、これに値を入れることができます。しかし、プリミティブの場合はそうではありません
final int a;
この場合、 a の値を変更することはできません。誰かがこれを説明できますか?
空白の final として宣言されている hashMap を変更できるのに、プリミティブ型を変更できないのはなぜですか? たとえば、マップを作成する場合
final Map<String, String> someMap;
コンストラクターで初期化しても、これに値を入れることができます。しかし、プリミティブの場合はそうではありません
final int a;
この場合、 a の値を変更することはできません。誰かがこれを説明できますか?
final
一度初期化すると変更できないことを意味します。変数を宣言しているだけで初期化していないため、許可されています。
したがって、これを行うことは有効です
final Map<String, String> someMap;
someMap = new HashMap<String, String>();
ただし、初期化後に別の値を割り当てようとすると、コンパイラは最終変数が既に初期化されているというエラーをスローする必要があります。
final Map<String, String> someMap;
someMap = new HashMap<String, String>();
someMap = new TreeMap<String, String>(); //error here
注:また、ハッシュマップに値を入れたり削除したりしても、最終変数の参照は変更されません。
someMap
変更できないのは、マップへの参照 (つまり、変数) だけです。マップ自体は変更可能です。たとえば、値を挿入できます。ただし、新しいマップを に割り当てることはできませんsomeMap
。
* emphasized text
*あなたが書くとき:
final Map<String, String> someMap;
それが参照であることを理解することが重要でsomeMap
あり、参照が最終的であることを宣言しています。実際のオブジェクトは不変ではありませんが、参照は不変です。したがって、参照を変更することはできません。つまり、次のことはできません。
someMap = anotherMap;
後で。