|
JavaTM Platform Standard Ed. 6 |
|||||||||
앞의 클래스 다음의 클래스 | 프레임 있어 프레임 없음 | |||||||||
개요 : 상자 | 필드 | 생성자 | 메소드 | 상세: 필드 | 생성자 | 메소드 |
java.lang.Objectjava.util.AbstractMap <K, V>
java.util.IdentityHashMap<K, V>
public class IdentityHashMap<K, V>
이 클래스는, 키와 값을 비교할 때에 객체의 동일성 대신에 레퍼런스의 동일성을 사용해, 해시 테이블을 가지는 Map 인스턴스를 구현합니다. 즉,IdentityHashMap 에서는,(k1==k2) 의 경우에 한해 2 개의 키 k1 와 k2 가 동등하다라고 보입니다. 일반적으로은,HashMap 와 같은 Map 구현에서는,(k1==null ? k2==null :k1.equals(k2)) 의 경우에 한해, 2 개의 키 k1 와 k2 는 동등하다라고 보입니다.
이 클래스는, 범용의 Map 구현이 아닙니다. 이 클래스가 Map 인터페이스를 구현하고 있으면(자), 객체의 비교시에 equals 메소드의 사용을 요구하는 Map 의 일반적인 규약에 의도적으로 위반을 합니다. 이 클래스는, 참조의 동일성의 시멘틱스가 요구되었을 경우에게만 사용되도록(듯이) 설계되고 있습니다.
이 클래스의 일반적으로의 사용에서는, 직렬화 또는 딥 카피 등, 위상기하학을 보관 유지하는 객체 그래프 변환을 실시합니다. 이러한 변환을 실행하기 위해서, 프로그램은, 벌써 처리된 모든 객체 참조를 추적하는 「노드 테이블」을 보관 유지할 필요가 있습니다. 별개의 객체가 동일한 경우에서도, 노드 테이블은 그 객체를 동등시 해서는 안됩니다. 이 클래스의 또 하나의 사용법은, 「프록시 객체」를 유지하는 것입니다. 예를 들어, 디버그 기능은, 디버그 된 프로그램으로 각 객체의 프록시 객체를 유지할 수 있습니다.
이 클래스는, 임의의 맵 오퍼레이션을 모두 제공해,null 치 및 null 키를 허용 합니다. 이 클래스는 맵의 순서를 보증하지 않습니다. 특히, 그 순서를 항상 일정에 유지하는 것을 보증하지 않습니다.
이 클래스는, 시스템 아이덴티티 해쉬 함수 (System.identityHashCode(Object)
)가 복수의 버킷에 요소를 적절히 분산시키면(자) 가정해, 기본 오퍼레이션 (get 및 put)에 일정시간의 퍼포먼스를 제공합니다.
이 클래스에는 튜닝 파라미터가 하나 있습니다. 튜닝 파라미터는 시멘틱스는 아니고, 퍼포먼스에 영향을 줍니다. 즉, 「예상 최대 사이즈」입니다. 이 파라미터는, 맵이 보관 유지된다고 예상되는 키치 매핑의 최대수입니다. 이 파라미터를 사용해, 해시 테이블을 초기 구성하는 버킷의 수를 산출합니다. 예상된 최대 사이즈와 버킷수와의 정확한 관계는 지정되고 있지 않습니다.
맵의 사이즈 (키와 값의 매핑의 수)가, 예상 최대 사이즈를 큰폭으로 넘었을 경우, 버킷수가 증가됩니다. 버킷수 (해시의 재시도)를 증가시키면(자) 꽤 코스트가 들기 (위해)때문에, 충분히 큰 예상 최대 사이즈의 아이덴티티 해시 맵을 작성하는 편이 적절합니다. 한편, 코레크션뷰의 반복은, 해시 테이블의 버킷수 에 비례한 시간을 요구합니다. 그 때문에 반복의 퍼포먼스 또는 메모리 사용에 특히 염려가 있는 경우는, 예상 최대 사이즈를 그다지 크게 하지 않게 합니다.
이 구현은 동기화 되지 않습니다. 복수의 thread가 동시에 이 아이덴티티 해시 맵에 액세스 해, 그러한 thread의 적어도 1 개(살)이 구조적으로 맵을 변경하는 경우에는, 외부에서 동기를 잡을 필요가 있습니다. 구조적인 변경이란, 1 개(살) 이상의 매핑을 추가 또는 삭제하는 오퍼레이션입니다. 벌써 인스턴스에 포함되고 있는 키에 관련지을 수 있었던 값을 변경하는 것은 구조적인 변경이 아닙니다. 일반적으로, 구조적인 변경은, 맵을 자연스럽게 캡슐화하는 특정의 객체로 동기를 잡는 것에 의해 달성됩니다.
이런 종류의 객체가 없는 경우에는,Collections.synchronizedMap
메소드를 사용해 맵을 「랩」할 필요가 있습니다. 맵에의 우발적인 비동기 액세스를 막기 위해서(때문에), 작성시에 실시하는 것이 최적입니다.
Map m = Collections.synchronizedMap(new IdentityHashMap(...));
이 클래스의 모든 「코레크션뷰메소드」에 의해 반환되는 컬렉션의 iterator 메소드에 의해 반환되는 반복자는, 「fail-fast」입니다. 반복자의 작성 후에, 반복자 자체의 remove 메소드 이외 방법으로 맵이 구조적으로 변경되면(자), 반복자는 ConcurrentModificationException
를 throw 합니다. 이와 같이, 병행해 변경을 하면(자), 반복자는, 장래의 예측할 수 없는 시점에 있어 예측할 수 없는 동작이 발생하는 위험을 회피하기 위해서, 즉시 한편 솜씨 자주(잘) 예외를 throw 합니다.
일반적으로, 비동기의 병행 변경이 있는 경우, 확실한 보증을 실시하는 것은 불가능해서, 반복자의 fail-fast의 동작을 보증할 수 없습니다. fail-fast 반복자는 최선 노력 원칙에 근거해,ConcurrentModificationException 를 throw 합니다. 따라서, 정확을 기하기 위해서 이 예외에 의존하는 프로그램을 쓰는 것은 잘못입니다. 「fail-fast의 반복자는 버그를 검출하기 위해서 사용해야 합니다.」
구현상의 주의 :Sedgewick 와 Knuth 의 텍스트의 예로 설명한 것처럼, fail-fast 반복자는, 단순한 「선형 프로브」의 해시 테이블입니다. 그 배열은, 키와 값의 보관 유지를 교대로 실시합니다. 개별의 배열을 사용해 실시하는 것보다도, 큰 테이블에 대해보다 적절한 국소성이 있습니다. 많은 JRE 구현과 오퍼레이션 믹스에서는, 이 클래스는, (선형 프로브는 아니고 체인에 사용한다) HashMap
보다 고성능의 퍼포먼스를 가져옵니다.
이 클래스는,Java Collections Framework 의 멤버입니다.
System.identityHashCode(Object)
,
Object.hashCode()
,
Collection
,
Map
,
HashMap
,
TreeMap
,
직렬화 된 형식 상자의 클래스의 개요 |
---|
클래스 java.util. AbstractMap 로부터 상속된 상자의 클래스/인터페이스 |
---|
AbstractMap.SimpleEntry <K ,V >, AbstractMap.SimpleImmutableEntry <K ,V > |
인터페이스 java.util. Map 로부터 상속된 상자의 클래스/인터페이스 |
---|
Map.Entry <K ,V > |
생성자 의 개요 | |
---|---|
IdentityHashMap ()
디폴트의 예상 최대 사이즈 (21)로, 새로운 빈 상태(empty)의 아이덴티티 해시 맵을 구축합니다. |
|
IdentityHashMap (int expectedMaxSize)
지정한 예상 최대 사이즈로, 새로운 빈 상태(empty)의 맵을 구축합니다. |
|
IdentityHashMap (Map <? extends K ,? extends V > m)
지정된 맵의 키와 값의 매핑을 포함한 새로운 아이덴티티 해시 맵을 구축합니다. |
메소드의 개요 | |
---|---|
void |
clear ()
모든 매핑을 맵으로부터 삭제합니다. |
Object |
clone ()
아이덴티티 해시 맵의 shallow 복사를 돌려줍니다. |
boolean |
containsKey (Object key)
지정된 객체 참조가, 이 아이덴티티 해시 맵의 키인가 어떤가를 판정합니다. |
boolean |
containsValue (Object value)
지정된 객체 참조가, 이 아이덴티티 해시 맵의 키인가 어떤가를 판정합니다. |
Set <Map.Entry <K ,V >> |
entrySet ()
이 맵에 포함되는 맵 Set 뷰를 돌려줍니다. |
boolean |
equals (Object o)
지정된 객체가 이 맵과 동일한지 어떤지를 비교합니다. |
V |
get (Object key)
지정된 키가 맵 되고 있는 값을 돌려줍니다. |
int |
hashCode ()
맵의 해시 코드값를 돌려줍니다. |
boolean |
isEmpty ()
아이덴티티 해시 맵에 키와 값의 매핑이 포함되지 않는 경우에 true 를 돌려줍니다. |
Set <K > |
keySet ()
맵에 포함되고 있는 키의 아이덴티티 베이스의 셋트뷰를 돌려줍니다. |
V |
put (K key,
V value)
지정된 값과 지정된 키를 이 아이덴티티 해시 맵에 관련짓습니다. |
void |
putAll (Map <? extends K ,? extends V > m)
지정된 맵으로부터 모든 매핑을 맵에 카피합니다. |
V |
remove (Object key)
키에 대한 매핑이 있으면, 그 키를 맵으로부터 삭제합니다. |
int |
size ()
이 아이덴티티 해시 맵내의 키와 값의 매핑의 수를 돌려줍니다. |
Collection <V > |
values ()
이 맵에 포함되는 값 Collection 뷰를 돌려줍니다. |
클래스 java.util. AbstractMap 로부터 상속된 메소드 |
---|
toString |
클래스 java.lang. Object 로부터 상속된 메소드 |
---|
finalize , getClass , notify , notifyAll , wait , wait , wait |
생성자 의 상세 |
---|
public IdentityHashMap()
public IdentityHashMap(int expectedMaxSize)
expectedMaxSize
- 맵의 예상 최대 사이즈
IllegalArgumentException
- expectedMaxSize 가 부의 경우public IdentityHashMap(Map <? extends K ,? extends V > m)
m
- 매핑이 이 맵에 배치되는 맵
NullPointerException
- 지정된 맵이 null 의 경우메소드의 상세 |
---|
public int size()
Map <K ,V >
내의 size
AbstractMap <K ,V >
내의 size
public boolean isEmpty()
Map <K ,V >
내의 isEmpty
AbstractMap <K ,V >
내의 isEmpty
public V get(Object key)
null
를 돌려줍니다.
즉, 이 메소드는,(key == k)
되는 키 k
로부터 값 v
에의 매핑이 이 맵에 포함되는 경우는 v
를 돌려주어, 그 이외의 경우는 null
를 돌려줍니다. 이러한 매핑이 1 개만 있습니다.
반환값의 null
는, 맵이 키의 매핑을 보관 유지하고 있지 않는 것을 나타낸다고는인가 선. 즉, 맵이 명시적으로 키를 null
에 맵 하는 일도 있습니다. containsKey
오퍼레이션을 사용하면(자), 이 2 개의 경우를 구별할 수 있습니다.
Map <K ,V >
내의 get
AbstractMap <K ,V >
내의 get
key
- 관련지을 수 있었던 값이 반환되는 키
null
put(Object, Object)
public boolean containsKey(Object key)
Map <K ,V >
내의 containsKey
AbstractMap <K ,V >
내의 containsKey
key
- 가능한 키
true
containsValue(Object)
public boolean containsValue(Object value)
Map <K ,V >
내의 containsValue
AbstractMap <K ,V >
내의 containsValue
value
- 맵에 있을지 어떨지를 판정되는 값
containsKey(Object)
public V put(K key, V value)
Map <K ,V >
내의 put
AbstractMap <K ,V >
내의 put
key
- 지정된 값을 관련지을 수 있는 키value
- 지정된 키에 관련지을 수 있는 값
Object.equals(Object)
,
get(Object)
,
containsKey(Object)
public void putAll(Map <? extends K ,? extends V > m)
Map <K ,V >
내의 putAll
AbstractMap <K ,V >
내의 putAll
m
- 맵에 포함되는 매핑
NullPointerException
- 지정된 맵이 null 의 경우public V remove(Object key)
Map <K ,V >
내의 remove
AbstractMap <K ,V >
내의 remove
key
- 매핑이 맵으로부터 삭제되는 키
public void clear()
Map <K ,V >
내의 clear
AbstractMap <K ,V >
내의 clear
public boolean equals(Object o)
이 맵이 일반적으로의 맵이라고 비교되는 경우, 이 맵의 참조 동일성 베이스의 시멘틱스에 의해,Object.equals 규약의 신메트리와 이행의 요건에 위반할 수가 있습니다. 다만,Object.equals 규약은, 복수의 IdentityHashMap 인스턴스간 으로 유지하는 것이 보증되고 있습니다.
Map <K ,V >
내의 equals
AbstractMap <K ,V >
내의 equals
o
- 이 맵과 동일한지 어떤지를 비교하는 객체
Object.equals(Object)
public int hashCode()
Object.hashCode()
의 일반 규약이 요구하도록(듯이), 임의의 2 개의 IdentityHashMap 인스턴스 m1 와 m2 에 대해 m1.equals(m2) 이면,m1.hashCode() ==m2.hashCode() 가 되는 것이 보증됩니다.
비교되고 있는 2 개의 객체가 각각 IdentityHashMap 인스턴스와 일반적으로의 맵인 경우는, 이 맵의 entrySet 메소드에 의해 반환된 세트내에 있는 Map.Entry 인스턴스의 참조 동일성 베이스의 시멘틱스에 의해, 전의 단락으로 설명되고 있던 Object.hashCode 의 규약상의 요건에 위반할 수가 있습니다.
Map <K ,V >
내의 hashCode
AbstractMap <K ,V >
내의 hashCode
Object.equals(Object)
,
equals(Object)
public Object clone()
AbstractMap <K ,V >
내의 clone
Cloneable
public Set <K > keySet()
이 메소드가 돌려준 객체가,Set 인터페이스를 구현하고 있는 동안, 객체는,Set 의 일반 규약에는 따르지 않습니다. 객체의 바탕으로 되는 맵과 같이, 이 메소드가 돌려준 세트는, 객체의 동일성이 아니고, 참조의 동일성으로서 요소의 동일성을 정의합니다. 이것은, 객체의 contains,remove,containsAll,equals, 및 hashCode 메소드의 동작에 영향을 줍니다.
지정된 객체가, 반환된 세트와 완전히 같은 객체 참조를 포함한 세트인 경우에 한해, 반환된 세트의 equals 메소드는 true 를 돌려줍니다. 이 메소드에 의해 반환된 세트가 일반적으로세트라고 비교되는 경우,Object.equals 규약의 신메트리와 이행의 요건에 위반하는 경우가 있습니다. 다만,Object.equals 규약은, 이 메소드에 의해 반환된 세트간 으로 유지하는 것이 보증되고 있습니다.
반환된 세트의 hashCode 메소드는, 요소의 해시 코드의 합계는 아니고, 세트내의 요소의 「아이덴티티 해시 코드」의 합계를 돌려줍니다. 이것은, 이 메소드가 돌려준 복수세트에,Object.hashCode 메소드의 일반 규약을 적용하기 위해서,equals 메소드의 시멘틱스의 변경에 의해 요구됩니다.
Map <K ,V >
내의 keySet
AbstractMap <K ,V >
내의 keySet
Object.equals(Object)
,
System.identityHashCode(Object)
public Collection <V > values()
Collection
뷰를 돌려줍니다. 컬렉션은 맵과 연동하고 있으므로, 맵에 대한 변경은 컬렉션에 반영되어 또 컬렉션에 대한 변경은 맵에 반영됩니다. 컬렉션에서의 반복 처리의 진행중으로 맵이 변경되었을 경우, 반복 처리의 결과는 정의되지 않습니다. 컬렉션은 요소의 삭제를 지원하고 있어, 대응하는 매핑을 맵으로부터 삭제할 수가 있습니다. 삭제는,Iterator.remove,Collection.remove,removeAll,retainAll, 및 clear 의 각 메소드를 통해 실시합니다. add 메소드와 addAll 메소드는, 세트에서는 지원되고 있지 않습니다.
이 메소드가 돌려준 객체가,Collection 인터페이스를 구현하고 있는 동안, 객체는,Collection 의 일반 규약에는 결코 따르지 않습니다. 객체의 바탕으로 되는 맵과 같이, 이 메소드가 돌려주는 컬렉션은, 객체의 동일성이 아니고, 참조의 동일성으로서 요소의 동일성을 정의합니다. 이것은, 객체의 contains,remove 및 containsAll 메소드의 동작에 영향을 줍니다.
Map <K ,V >
내의 values
AbstractMap <K ,V >
내의 values
public Set <Map.Entry <K ,V >> entrySet()
Set
뷰를 돌려줍니다. 반환되는 세트내의 각 요소는 참조 동일성 베이스의 Map.Entry 입니다. 세트는 맵과 연동하고 있으므로, 맵에 대한 변경은 세트에 반영되어 또, 세트에 대한 변경은 맵에 반영됩니다. 세트의 반복 처리중으로 맵이 변경되었을 경우는, 반복 처리의 결과는 정의되지 않습니다. 세트는 요소의 삭제를 지원하고 있어, 대응하는 매핑을 맵으로부터 삭제할 수가 있습니다. 삭제는,Iterator.remove,Set.remove,removeAll,retainAll, 및 clear 의 각 메소드를 통해 실시합니다. add 메소드와 addAll 메소드는, 세트에서는 지원되고 있지 않습니다.
원이 되는 맵과 같이, 이 메소드에 의해 반환된 세트내의 Map.Entry 객체는, 객체의 동일성이 아니고, 참조의 동일성으로서 키와 값의 동일성을 정의합니다. 이것은,Map.Entry 객체의 equals 및 hashCode 메소드의 동작에 영향을 줍니다. 참조 동일성 베이스의 Map.Entry e 는,o 가 Map.Entry 및 e.getKey() ==o.getKey() && e.getValue() ==o.getValue() 인 경우에 한해 o 객체에 동일해집니다. 이러한 동일한 시멘틱스에 대응하기 위해서,hashCode 메소드는,System.identityHashCode(e.getKey()) ^ System.identityHashCode(e.getValue()) 를 돌려줍니다.
세트의 엔트리를 일반적으로의 맵 엔트리와 비교했을 경우, 또는, 이 메소드가 돌려준 세트를 일반적으로의 맵 엔트리 (일반적으로의 맵에 이 메소드를 호출하는 것으로 돌려주어지고 있다)세트와 비교했을 경우에, 이 메소드에 의해 반환된 세트내의,Map.Entry 인스턴스의 참조 동일성 베이스의 시멘틱스에 의해,Object.equals(Object)
규약의 신메트리와 이행의 요건에 위반할 수 있습니다. 다만,Object.equals 규약은, 복수의 아이덴티티 베이스의 맵 엔트리, 및 이러한 엔트리의 복수세트간 으로 유지하는 것이 보증되고 있습니다.
Map <K ,V >
내의 entrySet
AbstractMap <K ,V >
내의 entrySet
|
JavaTM Platform Standard Ed. 6 |
|||||||||
앞의 클래스 다음의 클래스 | 프레임 있어 프레임 없음 | |||||||||
개요 : 상자 | 필드 | 생성자 | 메소드 | 상세: 필드 | 생성자 | 메소드 |
Copyright 2006 Sun Microsystems, Inc. All rights reserved. Use is subject to license terms . Documentation Redistribution Policy 도 참조해 주세요.