List.copyOf
➙変更できないリスト
あなたは尋ねました:
リストのコピーを割り当てる他の方法はありませんか
Java 9は、List.of
リテラルを使用して変更不可能List
な未知の具象クラスを作成するためのメソッドをもたらしました。
LocalDate today = LocalDate.now( ZoneId.of( "Africa/Tunis" ) ) ;
List< LocalDate > dates = List.of(
today.minusDays( 1 ) , // Yesterday
today , // Today
today.plusDays( 1 ) // Tomorrow
);
それに加えて、私たちも手に入れましたList.copyOf
。このメソッドも、変更不可能List
な未知の具象クラスを返します。
List< String > colors = new ArrayList<>( 4 ) ; // Creates a modifiable `List`.
colors.add ( "AliceBlue" ) ;
colors.add ( "PapayaWhip" ) ;
colors.add ( "Chartreuse" ) ;
colors.add ( "DarkSlateGray" ) ;
List< String > masterColors = List.copyOf( colors ) ; // Creates an unmodifiable `List`.
「変更不可」とは、リスト内の要素の数を意味し、要素として各スロットに保持されているオブジェクト参照が固定されます。要素を追加、削除、または置換することはできません。ただし、各要素に保持されているオブジェクト参照は、変更可能である場合とそうでない場合があります。
colors.remove( 2 ) ; // SUCCEEDS.
masterColors.remove( 2 ) ; // FAIL - ERROR.
IdeOne.comでこのコードがライブで実行されるのを確認してください。
date.toString():[2020-02-02、2020-02-03、2020-02-04]
colors.toString():[AliceBlue、PapayaWhip、DarkSlateGray]
masterColors.toString():[AliceBlue、PapayaWhip、Chartreuse、DarkSlateGray]
オブジェクト参照について質問しました。他の人が言ったように、1つのリストを作成して2つの参照変数(ポインター)に割り当てても、リストは1つだけです。どちらも同じリストを指しています。どちらかのポインタを使用してリストを変更した場合、メモリにはリストが1つしかないため、後で両方のポインタに変更が反映されます。
そのため、リストのコピーを作成する必要があります。そのコピーを変更できないようにするにはList.copyOf
、この回答で説明されている方法を使用します。このアプローチでは、2つの別々のリストができ、それぞれに同じコンテンツオブジェクトへの参照を保持する要素があります。たとえば、String
オブジェクトを使用して色を表す上記の例では、カラーオブジェクトはメモリのどこかに浮かんでいます。2つのリストは、同じカラーオブジェクトへのポインタを保持しています。これが図です。
最初のリストcolors
は変更可能です。これは、上記のコードにあるように、元の3番目の要素Chartreuse
(インデックス2 =序数3)を削除した場合に、一部の要素が削除される可能性があることを意味します。そして要素を追加することができます。また、要素を変更してString
、OliveDrab
またはなどの他のポイントを指すようにすることができますCornflowerBlue
。
対照的に、の4つの要素masterColors
は固定されています。別の色を削除したり、追加したり、置換したりする必要はありません。このList
実装は変更できません。