IT

UnmodifiableMap (Java Collections) vs ImmutableMap (Google) [duplicate]

lottoking 2020. 9. 9. 08:11
반응형

UnmodifiableMap (Java Collections) vs ImmutableMap (Google) [duplicate]


이 질문에 이미 답변이 있습니다.

석고

데이터 캐시에 사용중인지도에 대한 참조를 반환해야하고 싶습니다.

질문

온라인에서 UnmodifiableMap 및 ImmutableMap에 대한 많은 참조를 참조지만 비교 / 대조하는 내용이 없습니다. Google / Guava가 자체 버전을 만든 타당한 이유가 검증을 생각합니다. 누군가가 무엇인지 말해 줄 수 있습니까?


앞으로도 계속 변경 될 수 있습니다. 수정 가능한지도에 대한 보기뿐이며 백업지도의 변경 사항은 모두없는지도를 통해 볼 수 있습니다. 즉석 수없는 맵은 수없는 뷰에 대한 참조 만있는 사용자의 수정 만 방지합니다.

Map<String, String> realMap = new HashMap<String, String>();
realMap.put("A", "B");

Map<String, String> unmodifiableMap = Collections.unmodifiableMap(realMap);

// This is not possible: It would throw an 
// UnsupportedOperationException
//unmodifiableMap.put("C", "D");

// This is still possible:
realMap.put("E", "F");

// The change in the "realMap" is now also visible
// in the "unmodifiableMap". So the unmodifiableMap
// has changed after it has been created.
unmodifiableMap.get("E"); // Will return "F". 

이와 대조적으로 Guava의 ImmutableMap은 실제로 불변입니다 . 이 주어진 의 실제 복사본 이며, 누구도이 ImmutableMap을 어떤 식 으로든 존재하지 않습니다.

업데이트 :

주석 에서 지적했듯이 , 변경 불가능한지도는 다음을 사용하여 표준 API로 만들 수도 있습니다.

Map<String, String> immutableMap = 
    Collections.unmodifiableMap(new LinkedHashMap<String, String>(realMap)); 

이렇게하면 주어진지도의 실제 복사본에 ImmutableMap추가 수있는 기능 을 추가 수 있습니다.


ImmutableMap JavaDoc : doc 모습 보기

거기에 대한 정보가 있습니다.

여전히 변경 될 수있는 별도의 맵 뷰인 Collections.unmodifiableMap (java.util.Map)과 달리 ImmutableMap의 인스턴스는 자체 데이터를 포함하며 절대 변경하지 않습니다. ImmutableMap은 정적 최종 맵 ( "상수 맵")에 편리하며 호출자가 클래스에 제공되는 한 맵의 "방어 복사본"을 쉽게 만들 수 있습니다.


구아바 문서

JDK는 Collections.unmodifiableXXX메소드를 제공 하지만 우리의 의견 다루기 어렵고 장황 할 수 있습니다. 방어 복사본을 안전하지 않게 만들고 모든 곳에서 사용하는 것을 불쾌하게 만듭니다. 반환 된 컬렉션은 원래 컬렉션에 대한 참조를 비효율적으로 보유하지 않는 경우에만 진정으로 불변입니다. 데이터 구조에는 동시 수정 검사, 추가 공간을 포함하여 변경 가능한 컬렉션의 모든 오버 헤드가 여전히 있습니다. 해시 테이블 등


ImmutableMap은 null값을 허용하지 않지만 허용 합니다 Collections.unmodifiableMap(). 5 월에는 변경되지 않을 것 UnmodifiableMap입니다. JavaDoc에서 :

반복 순서가있는 변경 불가능한 해시 기반 맵입니다. null 키 또는 값을 허용하지 않습니다.

여전히 변경 될 수있는 별도의 맵 뷰인 Collections.unmodifiableMap (java.util.Map)과 달리 ImmutableMap의 인스턴스는 자체 데이터를 포함하며 절대 변경하지 않습니다. ImmutableMap은 정적 최종 맵 ( "상수 맵")에 편리하며 호출자가 클래스에 제공되는 한 맵의 "방어 복사본"을 쉽게 만들 수 있습니다.

참고 URL : https://stackoverflow.com/questions/22636575/unmodifiablemap-java-collections-vs-immutablemap-google

반응형