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에서 실시간으로 실행 됩니다.
dates.toString () : [2020-02-02, 2020-02-03, 2020-02-04]
colors.toString () : [AliceBlue, 파파야 채찍, DarkSlateGray]
masterColors.toString () : [AliceBlue, PapayaWhip, Chartreuse, DarkSlateGray]
객체 참조에 대해 물었습니다. 다른 사람들이 말했듯이 하나의 목록을 만들어 두 개의 참조 변수 (포인터)에 할당하면 여전히 하나의 목록 만 있습니다. 둘 다 같은 목록을 가리 킵니다. 포인터를 사용하여 목록을 수정하면 메모리에 목록이 하나만 있기 때문에 나중에 두 포인터 모두 변경 사항을 볼 수 있습니다.
따라서 목록의 사본을 만들어야합니다. 해당 복사본을 수정할 수 없게하려면 List.copyOf
이 답변에 설명 된 방법을 사용하십시오 . 이 접근 방식에서는 각각 동일한 내용 객체에 대한 참조를 보유하는 요소가있는 두 개의 개별 목록으로 끝납니다. 예를 들어, 위의 예제에서 String
객체를 사용하여 색상을 나타내는 경우 색상 객체가 메모리에서 어딘가에 떠 있습니다. 두 목록에는 동일한 색상 객체에 대한 포인터가 있습니다. 다음은 다이어그램입니다.
첫 번째 목록 colors
은 수정 가능합니다. 이것은 위의 코드에서 볼 수 있듯이 원래의 세 번째 요소 Chartreuse
(인덱스 2 = 서수 3)를 제거한 일부 요소가 제거 될 수 있음을 의미합니다 . 그리고 요소를 추가 할 수 있습니다. 그리고 요소는 몇 가지 다른 지점으로 변경 될 수 있습니다 String
와 같은 OliveDrab
나 CornflowerBlue
.
대조적으로, 네 가지 요소 masterColors
는 고정되어 있습니다. 다른 색상을 제거하거나 추가하거나 대체하지 않습니다. 그 List
구현은 수정할 수 없습니다.