2012-11-01 2 views
0

아래의 키/값 목록에서 "val3"이 다른 키에 대해 반복됩니다. 어떤지도가 그러한 유형의 목록에 가장 적합합니다.사용할 맵/컬렉션은 무엇입니까?

"val3"을 가리키는 키가 여러 개인 경우 한 번만 저장해야합니다.

KEY1 ----> VAL1
키 2 ----> val3
KEY3 ----> val3
key5 ----> val5
key6 ----> val3
key7 ----> val6
key8 ----> val3
key9 ----> 모든 Map 구현 할 것 val3

+1

"* 단 한번만 저장 하시겠습니까?"라는 것을 정확히 말합니까? –

+0

"val3"은 각 키의 메모리에서 반복해서는 안됩니다 – Vasant

+0

완전한 개체 또는 참조일까요? 그게 제가 "정확히"찾고있는 것입니다. Java에서 참조 및 객체가 작동하는 방식을 이해하고 실제 객체가 아닌 * 참조 만 포함하는지도 알고 있다고 가정합니다. –

답변

2

. 모든 Java 콜렉션은 실제 오브젝트가 아닌 참조 만 보유합니다. 따라서 동일한 오브젝트를 맵에 여러 번 넣으면 모든 값이 동일한 오브젝트를 가리 킵니다. 다른 말로하면 val3에서 key2 조회까지의 변경 사항은 val3을 가리키는 다른 키를 조회 할 때 반영됩니다.

는 간단한 예를 생각해

VeryLarge v = new VeryLarge(); 
Map<Integer, VeryLarge> map = new HashMap<>(); 
map.put(1, v); 
map.put(2, v); 
map.put(3, v); 

단일 VeryLarge 인스턴스는 모든 1, 23 키에 의해 참조됩니다.

+0

@thomasz 문자열 s1 = 새로운 문자열 ("str1") 및 문자열 s2 = 새로운 문자열 ("str1") 어떻게 이것을 달성? 값은 동일하지만 다른 인스턴스입니다! – Vasant

+0

@Vasant :'s1 = "str1"; s2 = "str1"'- 이제는 동일합니다. http://nurkiewicz.blogspot.no/2012/07/string-memory-internals.html –

1

만큼 당신이 당신이 clone 작업을 통해 값을 가져하지 않거나 값이 캐싱 떨어져 String 리터럴 또는 -128 127-Integer.valueOf() (값에서 불변 객체 (있습니다 없습니다 다시 캐시에서 반환 보장으로) 이는 예외입니다.), 당신은 같은 관련 참조를 가리키는 여러 개의 키로 끝날 것입니다.

예를 들어 @Tomasz Nurkiewicz가 추천 한대로 HashMap을 사용할 수 있습니다.

관련 문제