2
+ − 1
/*
+ − 2
* Copyright 1997-2006 Sun Microsystems, Inc. All Rights Reserved.
+ − 3
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ − 4
*
+ − 5
* This code is free software; you can redistribute it and/or modify it
+ − 6
* under the terms of the GNU General Public License version 2 only, as
+ − 7
* published by the Free Software Foundation. Sun designates this
+ − 8
* particular file as subject to the "Classpath" exception as provided
+ − 9
* by Sun in the LICENSE file that accompanied this code.
+ − 10
*
+ − 11
* This code is distributed in the hope that it will be useful, but WITHOUT
+ − 12
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ − 13
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+ − 14
* version 2 for more details (a copy is included in the LICENSE file that
+ − 15
* accompanied this code).
+ − 16
*
+ − 17
* You should have received a copy of the GNU General Public License version
+ − 18
* 2 along with this work; if not, write to the Free Software Foundation,
+ − 19
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ − 20
*
+ − 21
* Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
+ − 22
* CA 95054 USA or visit www.sun.com if you need additional information or
+ − 23
* have any questions.
+ − 24
*/
+ − 25
+ − 26
package java.util;
+ − 27
+ − 28
/**
+ − 29
* An object that maps keys to values. A map cannot contain duplicate keys;
+ − 30
* each key can map to at most one value.
+ − 31
*
+ − 32
* <p>This interface takes the place of the <tt>Dictionary</tt> class, which
+ − 33
* was a totally abstract class rather than an interface.
+ − 34
*
+ − 35
* <p>The <tt>Map</tt> interface provides three <i>collection views</i>, which
+ − 36
* allow a map's contents to be viewed as a set of keys, collection of values,
+ − 37
* or set of key-value mappings. The <i>order</i> of a map is defined as
+ − 38
* the order in which the iterators on the map's collection views return their
+ − 39
* elements. Some map implementations, like the <tt>TreeMap</tt> class, make
+ − 40
* specific guarantees as to their order; others, like the <tt>HashMap</tt>
+ − 41
* class, do not.
+ − 42
*
+ − 43
* <p>Note: great care must be exercised if mutable objects are used as map
+ − 44
* keys. The behavior of a map is not specified if the value of an object is
+ − 45
* changed in a manner that affects <tt>equals</tt> comparisons while the
+ − 46
* object is a key in the map. A special case of this prohibition is that it
+ − 47
* is not permissible for a map to contain itself as a key. While it is
+ − 48
* permissible for a map to contain itself as a value, extreme caution is
+ − 49
* advised: the <tt>equals</tt> and <tt>hashCode</tt> methods are no longer
+ − 50
* well defined on such a map.
+ − 51
*
+ − 52
* <p>All general-purpose map implementation classes should provide two
+ − 53
* "standard" constructors: a void (no arguments) constructor which creates an
+ − 54
* empty map, and a constructor with a single argument of type <tt>Map</tt>,
+ − 55
* which creates a new map with the same key-value mappings as its argument.
+ − 56
* In effect, the latter constructor allows the user to copy any map,
+ − 57
* producing an equivalent map of the desired class. There is no way to
+ − 58
* enforce this recommendation (as interfaces cannot contain constructors) but
+ − 59
* all of the general-purpose map implementations in the JDK comply.
+ − 60
*
+ − 61
* <p>The "destructive" methods contained in this interface, that is, the
+ − 62
* methods that modify the map on which they operate, are specified to throw
+ − 63
* <tt>UnsupportedOperationException</tt> if this map does not support the
+ − 64
* operation. If this is the case, these methods may, but are not required
+ − 65
* to, throw an <tt>UnsupportedOperationException</tt> if the invocation would
+ − 66
* have no effect on the map. For example, invoking the {@link #putAll(Map)}
+ − 67
* method on an unmodifiable map may, but is not required to, throw the
+ − 68
* exception if the map whose mappings are to be "superimposed" is empty.
+ − 69
*
+ − 70
* <p>Some map implementations have restrictions on the keys and values they
+ − 71
* may contain. For example, some implementations prohibit null keys and
+ − 72
* values, and some have restrictions on the types of their keys. Attempting
+ − 73
* to insert an ineligible key or value throws an unchecked exception,
+ − 74
* typically <tt>NullPointerException</tt> or <tt>ClassCastException</tt>.
+ − 75
* Attempting to query the presence of an ineligible key or value may throw an
+ − 76
* exception, or it may simply return false; some implementations will exhibit
+ − 77
* the former behavior and some will exhibit the latter. More generally,
+ − 78
* attempting an operation on an ineligible key or value whose completion
+ − 79
* would not result in the insertion of an ineligible element into the map may
+ − 80
* throw an exception or it may succeed, at the option of the implementation.
+ − 81
* Such exceptions are marked as "optional" in the specification for this
+ − 82
* interface.
+ − 83
*
+ − 84
* <p>This interface is a member of the
+ − 85
* <a href="{@docRoot}/../technotes/guides/collections/index.html">
+ − 86
* Java Collections Framework</a>.
+ − 87
*
+ − 88
* <p>Many methods in Collections Framework interfaces are defined
+ − 89
* in terms of the {@link Object#equals(Object) equals} method. For
+ − 90
* example, the specification for the {@link #containsKey(Object)
+ − 91
* containsKey(Object key)} method says: "returns <tt>true</tt> if and
+ − 92
* only if this map contains a mapping for a key <tt>k</tt> such that
+ − 93
* <tt>(key==null ? k==null : key.equals(k))</tt>." This specification should
+ − 94
* <i>not</i> be construed to imply that invoking <tt>Map.containsKey</tt>
+ − 95
* with a non-null argument <tt>key</tt> will cause <tt>key.equals(k)</tt> to
+ − 96
* be invoked for any key <tt>k</tt>. Implementations are free to
+ − 97
* implement optimizations whereby the <tt>equals</tt> invocation is avoided,
+ − 98
* for example, by first comparing the hash codes of the two keys. (The
+ − 99
* {@link Object#hashCode()} specification guarantees that two objects with
+ − 100
* unequal hash codes cannot be equal.) More generally, implementations of
+ − 101
* the various Collections Framework interfaces are free to take advantage of
+ − 102
* the specified behavior of underlying {@link Object} methods wherever the
+ − 103
* implementor deems it appropriate.
+ − 104
*
+ − 105
* @param <K> the type of keys maintained by this map
+ − 106
* @param <V> the type of mapped values
+ − 107
*
+ − 108
* @author Josh Bloch
+ − 109
* @see HashMap
+ − 110
* @see TreeMap
+ − 111
* @see Hashtable
+ − 112
* @see SortedMap
+ − 113
* @see Collection
+ − 114
* @see Set
+ − 115
* @since 1.2
+ − 116
*/
+ − 117
public interface Map<K,V> {
+ − 118
// Query Operations
+ − 119
+ − 120
/**
+ − 121
* Returns the number of key-value mappings in this map. If the
+ − 122
* map contains more than <tt>Integer.MAX_VALUE</tt> elements, returns
+ − 123
* <tt>Integer.MAX_VALUE</tt>.
+ − 124
*
+ − 125
* @return the number of key-value mappings in this map
+ − 126
*/
+ − 127
int size();
+ − 128
+ − 129
/**
+ − 130
* Returns <tt>true</tt> if this map contains no key-value mappings.
+ − 131
*
+ − 132
* @return <tt>true</tt> if this map contains no key-value mappings
+ − 133
*/
+ − 134
boolean isEmpty();
+ − 135
+ − 136
/**
+ − 137
* Returns <tt>true</tt> if this map contains a mapping for the specified
+ − 138
* key. More formally, returns <tt>true</tt> if and only if
+ − 139
* this map contains a mapping for a key <tt>k</tt> such that
+ − 140
* <tt>(key==null ? k==null : key.equals(k))</tt>. (There can be
+ − 141
* at most one such mapping.)
+ − 142
*
+ − 143
* @param key key whose presence in this map is to be tested
+ − 144
* @return <tt>true</tt> if this map contains a mapping for the specified
+ − 145
* key
+ − 146
* @throws ClassCastException if the key is of an inappropriate type for
+ − 147
* this map (optional)
+ − 148
* @throws NullPointerException if the specified key is null and this map
+ − 149
* does not permit null keys (optional)
+ − 150
*/
+ − 151
boolean containsKey(Object key);
+ − 152
+ − 153
/**
+ − 154
* Returns <tt>true</tt> if this map maps one or more keys to the
+ − 155
* specified value. More formally, returns <tt>true</tt> if and only if
+ − 156
* this map contains at least one mapping to a value <tt>v</tt> such that
+ − 157
* <tt>(value==null ? v==null : value.equals(v))</tt>. This operation
+ − 158
* will probably require time linear in the map size for most
+ − 159
* implementations of the <tt>Map</tt> interface.
+ − 160
*
+ − 161
* @param value value whose presence in this map is to be tested
+ − 162
* @return <tt>true</tt> if this map maps one or more keys to the
+ − 163
* specified value
+ − 164
* @throws ClassCastException if the value is of an inappropriate type for
+ − 165
* this map (optional)
+ − 166
* @throws NullPointerException if the specified value is null and this
+ − 167
* map does not permit null values (optional)
+ − 168
*/
+ − 169
boolean containsValue(Object value);
+ − 170
+ − 171
/**
+ − 172
* Returns the value to which the specified key is mapped,
+ − 173
* or {@code null} if this map contains no mapping for the key.
+ − 174
*
+ − 175
* <p>More formally, if this map contains a mapping from a key
+ − 176
* {@code k} to a value {@code v} such that {@code (key==null ? k==null :
+ − 177
* key.equals(k))}, then this method returns {@code v}; otherwise
+ − 178
* it returns {@code null}. (There can be at most one such mapping.)
+ − 179
*
+ − 180
* <p>If this map permits null values, then a return value of
+ − 181
* {@code null} does not <i>necessarily</i> indicate that the map
+ − 182
* contains no mapping for the key; it's also possible that the map
+ − 183
* explicitly maps the key to {@code null}. The {@link #containsKey
+ − 184
* containsKey} operation may be used to distinguish these two cases.
+ − 185
*
+ − 186
* @param key the key whose associated value is to be returned
+ − 187
* @return the value to which the specified key is mapped, or
+ − 188
* {@code null} if this map contains no mapping for the key
+ − 189
* @throws ClassCastException if the key is of an inappropriate type for
+ − 190
* this map (optional)
+ − 191
* @throws NullPointerException if the specified key is null and this map
+ − 192
* does not permit null keys (optional)
+ − 193
*/
+ − 194
V get(Object key);
+ − 195
+ − 196
// Modification Operations
+ − 197
+ − 198
/**
+ − 199
* Associates the specified value with the specified key in this map
+ − 200
* (optional operation). If the map previously contained a mapping for
+ − 201
* the key, the old value is replaced by the specified value. (A map
+ − 202
* <tt>m</tt> is said to contain a mapping for a key <tt>k</tt> if and only
+ − 203
* if {@link #containsKey(Object) m.containsKey(k)} would return
+ − 204
* <tt>true</tt>.)
+ − 205
*
+ − 206
* @param key key with which the specified value is to be associated
+ − 207
* @param value value to be associated with the specified key
+ − 208
* @return the previous value associated with <tt>key</tt>, or
+ − 209
* <tt>null</tt> if there was no mapping for <tt>key</tt>.
+ − 210
* (A <tt>null</tt> return can also indicate that the map
+ − 211
* previously associated <tt>null</tt> with <tt>key</tt>,
+ − 212
* if the implementation supports <tt>null</tt> values.)
+ − 213
* @throws UnsupportedOperationException if the <tt>put</tt> operation
+ − 214
* is not supported by this map
+ − 215
* @throws ClassCastException if the class of the specified key or value
+ − 216
* prevents it from being stored in this map
+ − 217
* @throws NullPointerException if the specified key or value is null
+ − 218
* and this map does not permit null keys or values
+ − 219
* @throws IllegalArgumentException if some property of the specified key
+ − 220
* or value prevents it from being stored in this map
+ − 221
*/
+ − 222
V put(K key, V value);
+ − 223
+ − 224
/**
+ − 225
* Removes the mapping for a key from this map if it is present
+ − 226
* (optional operation). More formally, if this map contains a mapping
+ − 227
* from key <tt>k</tt> to value <tt>v</tt> such that
+ − 228
* <code>(key==null ? k==null : key.equals(k))</code>, that mapping
+ − 229
* is removed. (The map can contain at most one such mapping.)
+ − 230
*
+ − 231
* <p>Returns the value to which this map previously associated the key,
+ − 232
* or <tt>null</tt> if the map contained no mapping for the key.
+ − 233
*
+ − 234
* <p>If this map permits null values, then a return value of
+ − 235
* <tt>null</tt> does not <i>necessarily</i> indicate that the map
+ − 236
* contained no mapping for the key; it's also possible that the map
+ − 237
* explicitly mapped the key to <tt>null</tt>.
+ − 238
*
+ − 239
* <p>The map will not contain a mapping for the specified key once the
+ − 240
* call returns.
+ − 241
*
+ − 242
* @param key key whose mapping is to be removed from the map
+ − 243
* @return the previous value associated with <tt>key</tt>, or
+ − 244
* <tt>null</tt> if there was no mapping for <tt>key</tt>.
+ − 245
* @throws UnsupportedOperationException if the <tt>remove</tt> operation
+ − 246
* is not supported by this map
+ − 247
* @throws ClassCastException if the key is of an inappropriate type for
+ − 248
* this map (optional)
+ − 249
* @throws NullPointerException if the specified key is null and this
+ − 250
* map does not permit null keys (optional)
+ − 251
*/
+ − 252
V remove(Object key);
+ − 253
+ − 254
+ − 255
// Bulk Operations
+ − 256
+ − 257
/**
+ − 258
* Copies all of the mappings from the specified map to this map
+ − 259
* (optional operation). The effect of this call is equivalent to that
+ − 260
* of calling {@link #put(Object,Object) put(k, v)} on this map once
+ − 261
* for each mapping from key <tt>k</tt> to value <tt>v</tt> in the
+ − 262
* specified map. The behavior of this operation is undefined if the
+ − 263
* specified map is modified while the operation is in progress.
+ − 264
*
+ − 265
* @param m mappings to be stored in this map
+ − 266
* @throws UnsupportedOperationException if the <tt>putAll</tt> operation
+ − 267
* is not supported by this map
+ − 268
* @throws ClassCastException if the class of a key or value in the
+ − 269
* specified map prevents it from being stored in this map
+ − 270
* @throws NullPointerException if the specified map is null, or if
+ − 271
* this map does not permit null keys or values, and the
+ − 272
* specified map contains null keys or values
+ − 273
* @throws IllegalArgumentException if some property of a key or value in
+ − 274
* the specified map prevents it from being stored in this map
+ − 275
*/
+ − 276
void putAll(Map<? extends K, ? extends V> m);
+ − 277
+ − 278
/**
+ − 279
* Removes all of the mappings from this map (optional operation).
+ − 280
* The map will be empty after this call returns.
+ − 281
*
+ − 282
* @throws UnsupportedOperationException if the <tt>clear</tt> operation
+ − 283
* is not supported by this map
+ − 284
*/
+ − 285
void clear();
+ − 286
+ − 287
+ − 288
// Views
+ − 289
+ − 290
/**
+ − 291
* Returns a {@link Set} view of the keys contained in this map.
+ − 292
* The set is backed by the map, so changes to the map are
+ − 293
* reflected in the set, and vice-versa. If the map is modified
+ − 294
* while an iteration over the set is in progress (except through
+ − 295
* the iterator's own <tt>remove</tt> operation), the results of
+ − 296
* the iteration are undefined. The set supports element removal,
+ − 297
* which removes the corresponding mapping from the map, via the
+ − 298
* <tt>Iterator.remove</tt>, <tt>Set.remove</tt>,
+ − 299
* <tt>removeAll</tt>, <tt>retainAll</tt>, and <tt>clear</tt>
+ − 300
* operations. It does not support the <tt>add</tt> or <tt>addAll</tt>
+ − 301
* operations.
+ − 302
*
+ − 303
* @return a set view of the keys contained in this map
+ − 304
*/
+ − 305
Set<K> keySet();
+ − 306
+ − 307
/**
+ − 308
* Returns a {@link Collection} view of the values contained in this map.
+ − 309
* The collection is backed by the map, so changes to the map are
+ − 310
* reflected in the collection, and vice-versa. If the map is
+ − 311
* modified while an iteration over the collection is in progress
+ − 312
* (except through the iterator's own <tt>remove</tt> operation),
+ − 313
* the results of the iteration are undefined. The collection
+ − 314
* supports element removal, which removes the corresponding
+ − 315
* mapping from the map, via the <tt>Iterator.remove</tt>,
+ − 316
* <tt>Collection.remove</tt>, <tt>removeAll</tt>,
+ − 317
* <tt>retainAll</tt> and <tt>clear</tt> operations. It does not
+ − 318
* support the <tt>add</tt> or <tt>addAll</tt> operations.
+ − 319
*
+ − 320
* @return a collection view of the values contained in this map
+ − 321
*/
+ − 322
Collection<V> values();
+ − 323
+ − 324
/**
+ − 325
* Returns a {@link Set} view of the mappings contained in this map.
+ − 326
* The set is backed by the map, so changes to the map are
+ − 327
* reflected in the set, and vice-versa. If the map is modified
+ − 328
* while an iteration over the set is in progress (except through
+ − 329
* the iterator's own <tt>remove</tt> operation, or through the
+ − 330
* <tt>setValue</tt> operation on a map entry returned by the
+ − 331
* iterator) the results of the iteration are undefined. The set
+ − 332
* supports element removal, which removes the corresponding
+ − 333
* mapping from the map, via the <tt>Iterator.remove</tt>,
+ − 334
* <tt>Set.remove</tt>, <tt>removeAll</tt>, <tt>retainAll</tt> and
+ − 335
* <tt>clear</tt> operations. It does not support the
+ − 336
* <tt>add</tt> or <tt>addAll</tt> operations.
+ − 337
*
+ − 338
* @return a set view of the mappings contained in this map
+ − 339
*/
+ − 340
Set<Map.Entry<K, V>> entrySet();
+ − 341
+ − 342
/**
+ − 343
* A map entry (key-value pair). The <tt>Map.entrySet</tt> method returns
+ − 344
* a collection-view of the map, whose elements are of this class. The
+ − 345
* <i>only</i> way to obtain a reference to a map entry is from the
+ − 346
* iterator of this collection-view. These <tt>Map.Entry</tt> objects are
+ − 347
* valid <i>only</i> for the duration of the iteration; more formally,
+ − 348
* the behavior of a map entry is undefined if the backing map has been
+ − 349
* modified after the entry was returned by the iterator, except through
+ − 350
* the <tt>setValue</tt> operation on the map entry.
+ − 351
*
+ − 352
* @see Map#entrySet()
+ − 353
* @since 1.2
+ − 354
*/
+ − 355
interface Entry<K,V> {
+ − 356
/**
+ − 357
* Returns the key corresponding to this entry.
+ − 358
*
+ − 359
* @return the key corresponding to this entry
+ − 360
* @throws IllegalStateException implementations may, but are not
+ − 361
* required to, throw this exception if the entry has been
+ − 362
* removed from the backing map.
+ − 363
*/
+ − 364
K getKey();
+ − 365
+ − 366
/**
+ − 367
* Returns the value corresponding to this entry. If the mapping
+ − 368
* has been removed from the backing map (by the iterator's
+ − 369
* <tt>remove</tt> operation), the results of this call are undefined.
+ − 370
*
+ − 371
* @return the value corresponding to this entry
+ − 372
* @throws IllegalStateException implementations may, but are not
+ − 373
* required to, throw this exception if the entry has been
+ − 374
* removed from the backing map.
+ − 375
*/
+ − 376
V getValue();
+ − 377
+ − 378
/**
+ − 379
* Replaces the value corresponding to this entry with the specified
+ − 380
* value (optional operation). (Writes through to the map.) The
+ − 381
* behavior of this call is undefined if the mapping has already been
+ − 382
* removed from the map (by the iterator's <tt>remove</tt> operation).
+ − 383
*
+ − 384
* @param value new value to be stored in this entry
+ − 385
* @return old value corresponding to the entry
+ − 386
* @throws UnsupportedOperationException if the <tt>put</tt> operation
+ − 387
* is not supported by the backing map
+ − 388
* @throws ClassCastException if the class of the specified value
+ − 389
* prevents it from being stored in the backing map
+ − 390
* @throws NullPointerException if the backing map does not permit
+ − 391
* null values, and the specified value is null
+ − 392
* @throws IllegalArgumentException if some property of this value
+ − 393
* prevents it from being stored in the backing map
+ − 394
* @throws IllegalStateException implementations may, but are not
+ − 395
* required to, throw this exception if the entry has been
+ − 396
* removed from the backing map.
+ − 397
*/
+ − 398
V setValue(V value);
+ − 399
+ − 400
/**
+ − 401
* Compares the specified object with this entry for equality.
+ − 402
* Returns <tt>true</tt> if the given object is also a map entry and
+ − 403
* the two entries represent the same mapping. More formally, two
+ − 404
* entries <tt>e1</tt> and <tt>e2</tt> represent the same mapping
+ − 405
* if<pre>
+ − 406
* (e1.getKey()==null ?
+ − 407
* e2.getKey()==null : e1.getKey().equals(e2.getKey())) &&
+ − 408
* (e1.getValue()==null ?
+ − 409
* e2.getValue()==null : e1.getValue().equals(e2.getValue()))
+ − 410
* </pre>
+ − 411
* This ensures that the <tt>equals</tt> method works properly across
+ − 412
* different implementations of the <tt>Map.Entry</tt> interface.
+ − 413
*
+ − 414
* @param o object to be compared for equality with this map entry
+ − 415
* @return <tt>true</tt> if the specified object is equal to this map
+ − 416
* entry
+ − 417
*/
+ − 418
boolean equals(Object o);
+ − 419
+ − 420
/**
+ − 421
* Returns the hash code value for this map entry. The hash code
+ − 422
* of a map entry <tt>e</tt> is defined to be: <pre>
+ − 423
* (e.getKey()==null ? 0 : e.getKey().hashCode()) ^
+ − 424
* (e.getValue()==null ? 0 : e.getValue().hashCode())
+ − 425
* </pre>
+ − 426
* This ensures that <tt>e1.equals(e2)</tt> implies that
+ − 427
* <tt>e1.hashCode()==e2.hashCode()</tt> for any two Entries
+ − 428
* <tt>e1</tt> and <tt>e2</tt>, as required by the general
+ − 429
* contract of <tt>Object.hashCode</tt>.
+ − 430
*
+ − 431
* @return the hash code value for this map entry
+ − 432
* @see Object#hashCode()
+ − 433
* @see Object#equals(Object)
+ − 434
* @see #equals(Object)
+ − 435
*/
+ − 436
int hashCode();
+ − 437
}
+ − 438
+ − 439
// Comparison and hashing
+ − 440
+ − 441
/**
+ − 442
* Compares the specified object with this map for equality. Returns
+ − 443
* <tt>true</tt> if the given object is also a map and the two maps
+ − 444
* represent the same mappings. More formally, two maps <tt>m1</tt> and
+ − 445
* <tt>m2</tt> represent the same mappings if
+ − 446
* <tt>m1.entrySet().equals(m2.entrySet())</tt>. This ensures that the
+ − 447
* <tt>equals</tt> method works properly across different implementations
+ − 448
* of the <tt>Map</tt> interface.
+ − 449
*
+ − 450
* @param o object to be compared for equality with this map
+ − 451
* @return <tt>true</tt> if the specified object is equal to this map
+ − 452
*/
+ − 453
boolean equals(Object o);
+ − 454
+ − 455
/**
+ − 456
* Returns the hash code value for this map. The hash code of a map is
+ − 457
* defined to be the sum of the hash codes of each entry in the map's
+ − 458
* <tt>entrySet()</tt> view. This ensures that <tt>m1.equals(m2)</tt>
+ − 459
* implies that <tt>m1.hashCode()==m2.hashCode()</tt> for any two maps
+ − 460
* <tt>m1</tt> and <tt>m2</tt>, as required by the general contract of
+ − 461
* {@link Object#hashCode}.
+ − 462
*
+ − 463
* @return the hash code value for this map
+ − 464
* @see Map.Entry#hashCode()
+ − 465
* @see Object#equals(Object)
+ − 466
* @see #equals(Object)
+ − 467
*/
+ − 468
int hashCode();
+ − 469
}