< prev index next >

src/java.base/share/classes/java/util/Map.java

Print this page
rev 47476 : 8177290: add copy factory methods for unmodifiable List, Set, Map
8184690: add Collectors for collecting into unmodifiable List, Set, and Map
Reviewed-by: alanb, dholmes, rriggs, scolebourne


  93  * only if this map contains a mapping for a key {@code k} such that
  94  * {@code (key==null ? k==null : key.equals(k))}." This specification should
  95  * <i>not</i> be construed to imply that invoking {@code Map.containsKey}
  96  * with a non-null argument {@code key} will cause {@code key.equals(k)} to
  97  * be invoked for any key {@code k}.  Implementations are free to
  98  * implement optimizations whereby the {@code equals} invocation is avoided,
  99  * for example, by first comparing the hash codes of the two keys.  (The
 100  * {@link Object#hashCode()} specification guarantees that two objects with
 101  * unequal hash codes cannot be equal.)  More generally, implementations of
 102  * the various Collections Framework interfaces are free to take advantage of
 103  * the specified behavior of underlying {@link Object} methods wherever the
 104  * implementor deems it appropriate.
 105  *
 106  * <p>Some map operations which perform recursive traversal of the map may fail
 107  * with an exception for self-referential instances where the map directly or
 108  * indirectly contains itself. This includes the {@code clone()},
 109  * {@code equals()}, {@code hashCode()} and {@code toString()} methods.
 110  * Implementations may optionally handle the self-referential scenario, however
 111  * most current implementations do not do so.
 112  *
 113  * <h2><a id="immutable">Immutable Map Static Factory Methods</a></h2>
 114  * <p>The {@link Map#of() Map.of()} and
 115  * {@link Map#ofEntries(Map.Entry...) Map.ofEntries()}
 116  * static factory methods provide a convenient way to create immutable maps.

 117  * The {@code Map}
 118  * instances created by these methods have the following characteristics:
 119  *
 120  * <ul>
 121  * <li>They are <em>structurally immutable</em>. Keys and values cannot be added,
 122  * removed, or updated. Calling any mutator method will always cause
 123  * {@code UnsupportedOperationException} to be thrown.
 124  * However, if the contained keys or values are themselves mutable, this may cause the
 125  * Map to behave inconsistently or its contents to appear to change.
 126  * <li>They disallow {@code null} keys and values. Attempts to create them with
 127  * {@code null} keys or values result in {@code NullPointerException}.
 128  * <li>They are serializable if all keys and values are serializable.
 129  * <li>They reject duplicate keys at creation time. Duplicate keys
 130  * passed to a static factory method result in {@code IllegalArgumentException}.
 131  * <li>The iteration order of mappings is unspecified and is subject to change.
 132  * <li>They are <a href="../lang/doc-files/ValueBased.html">value-based</a>.
 133  * Callers should make no assumptions about the identity of the returned instances.
 134  * Factories are free to create new instances or reuse existing ones. Therefore,
 135  * identity-sensitive operations on these instances (reference equality ({@code ==}),
 136  * identity hash code, and synchronization) are unreliable and should be avoided.
 137  * <li>They are serialized as specified on the
 138  * <a href="{@docRoot}/serialized-form.html#java.util.CollSer">Serialized Form</a>
 139  * page.
 140  * </ul>
 141  *
 142  * <p>This interface is a member of the
 143  * <a href="{@docRoot}/java/util/package-summary.html#CollectionsFramework">


1259      *         does not support null keys or the value or remappingFunction is
1260      *         null
1261      * @since 1.8
1262      */
1263     default V merge(K key, V value,
1264             BiFunction<? super V, ? super V, ? extends V> remappingFunction) {
1265         Objects.requireNonNull(remappingFunction);
1266         Objects.requireNonNull(value);
1267         V oldValue = get(key);
1268         V newValue = (oldValue == null) ? value :
1269                    remappingFunction.apply(oldValue, value);
1270         if (newValue == null) {
1271             remove(key);
1272         } else {
1273             put(key, newValue);
1274         }
1275         return newValue;
1276     }
1277 
1278     /**
1279      * Returns an immutable map containing zero mappings.
1280      * See <a href="#immutable">Immutable Map Static Factory Methods</a> for details.
1281      *
1282      * @param <K> the {@code Map}'s key type
1283      * @param <V> the {@code Map}'s value type
1284      * @return an empty {@code Map}
1285      *
1286      * @since 9
1287      */
1288     static <K, V> Map<K, V> of() {
1289         return ImmutableCollections.Map0.instance();
1290     }
1291 
1292     /**
1293      * Returns an immutable map containing a single mapping.
1294      * See <a href="#immutable">Immutable Map Static Factory Methods</a> for details.
1295      *
1296      * @param <K> the {@code Map}'s key type
1297      * @param <V> the {@code Map}'s value type
1298      * @param k1 the mapping's key
1299      * @param v1 the mapping's value
1300      * @return a {@code Map} containing the specified mapping
1301      * @throws NullPointerException if the key or the value is {@code null}
1302      *
1303      * @since 9
1304      */
1305     static <K, V> Map<K, V> of(K k1, V v1) {
1306         return new ImmutableCollections.Map1<>(k1, v1);
1307     }
1308 
1309     /**
1310      * Returns an immutable map containing two mappings.
1311      * See <a href="#immutable">Immutable Map Static Factory Methods</a> for details.
1312      *
1313      * @param <K> the {@code Map}'s key type
1314      * @param <V> the {@code Map}'s value type
1315      * @param k1 the first mapping's key
1316      * @param v1 the first mapping's value
1317      * @param k2 the second mapping's key
1318      * @param v2 the second mapping's value
1319      * @return a {@code Map} containing the specified mappings
1320      * @throws IllegalArgumentException if the keys are duplicates
1321      * @throws NullPointerException if any key or value is {@code null}
1322      *
1323      * @since 9
1324      */
1325     static <K, V> Map<K, V> of(K k1, V v1, K k2, V v2) {
1326         return new ImmutableCollections.MapN<>(k1, v1, k2, v2);
1327     }
1328 
1329     /**
1330      * Returns an immutable map containing three mappings.
1331      * See <a href="#immutable">Immutable Map Static Factory Methods</a> for details.
1332      *
1333      * @param <K> the {@code Map}'s key type
1334      * @param <V> the {@code Map}'s value type
1335      * @param k1 the first mapping's key
1336      * @param v1 the first mapping's value
1337      * @param k2 the second mapping's key
1338      * @param v2 the second mapping's value
1339      * @param k3 the third mapping's key
1340      * @param v3 the third mapping's value
1341      * @return a {@code Map} containing the specified mappings
1342      * @throws IllegalArgumentException if there are any duplicate keys
1343      * @throws NullPointerException if any key or value is {@code null}
1344      *
1345      * @since 9
1346      */
1347     static <K, V> Map<K, V> of(K k1, V v1, K k2, V v2, K k3, V v3) {
1348         return new ImmutableCollections.MapN<>(k1, v1, k2, v2, k3, v3);
1349     }
1350 
1351     /**
1352      * Returns an immutable map containing four mappings.
1353      * See <a href="#immutable">Immutable Map Static Factory Methods</a> for details.
1354      *
1355      * @param <K> the {@code Map}'s key type
1356      * @param <V> the {@code Map}'s value type
1357      * @param k1 the first mapping's key
1358      * @param v1 the first mapping's value
1359      * @param k2 the second mapping's key
1360      * @param v2 the second mapping's value
1361      * @param k3 the third mapping's key
1362      * @param v3 the third mapping's value
1363      * @param k4 the fourth mapping's key
1364      * @param v4 the fourth mapping's value
1365      * @return a {@code Map} containing the specified mappings
1366      * @throws IllegalArgumentException if there are any duplicate keys
1367      * @throws NullPointerException if any key or value is {@code null}
1368      *
1369      * @since 9
1370      */
1371     static <K, V> Map<K, V> of(K k1, V v1, K k2, V v2, K k3, V v3, K k4, V v4) {
1372         return new ImmutableCollections.MapN<>(k1, v1, k2, v2, k3, v3, k4, v4);
1373     }
1374 
1375     /**
1376      * Returns an immutable map containing five mappings.
1377      * See <a href="#immutable">Immutable Map Static Factory Methods</a> for details.
1378      *
1379      * @param <K> the {@code Map}'s key type
1380      * @param <V> the {@code Map}'s value type
1381      * @param k1 the first mapping's key
1382      * @param v1 the first mapping's value
1383      * @param k2 the second mapping's key
1384      * @param v2 the second mapping's value
1385      * @param k3 the third mapping's key
1386      * @param v3 the third mapping's value
1387      * @param k4 the fourth mapping's key
1388      * @param v4 the fourth mapping's value
1389      * @param k5 the fifth mapping's key
1390      * @param v5 the fifth mapping's value
1391      * @return a {@code Map} containing the specified mappings
1392      * @throws IllegalArgumentException if there are any duplicate keys
1393      * @throws NullPointerException if any key or value is {@code null}
1394      *
1395      * @since 9
1396      */
1397     static <K, V> Map<K, V> of(K k1, V v1, K k2, V v2, K k3, V v3, K k4, V v4, K k5, V v5) {
1398         return new ImmutableCollections.MapN<>(k1, v1, k2, v2, k3, v3, k4, v4, k5, v5);
1399     }
1400 
1401     /**
1402      * Returns an immutable map containing six mappings.
1403      * See <a href="#immutable">Immutable Map Static Factory Methods</a> for details.
1404      *
1405      * @param <K> the {@code Map}'s key type
1406      * @param <V> the {@code Map}'s value type
1407      * @param k1 the first mapping's key
1408      * @param v1 the first mapping's value
1409      * @param k2 the second mapping's key
1410      * @param v2 the second mapping's value
1411      * @param k3 the third mapping's key
1412      * @param v3 the third mapping's value
1413      * @param k4 the fourth mapping's key
1414      * @param v4 the fourth mapping's value
1415      * @param k5 the fifth mapping's key
1416      * @param v5 the fifth mapping's value
1417      * @param k6 the sixth mapping's key
1418      * @param v6 the sixth mapping's value
1419      * @return a {@code Map} containing the specified mappings
1420      * @throws IllegalArgumentException if there are any duplicate keys
1421      * @throws NullPointerException if any key or value is {@code null}
1422      *
1423      * @since 9
1424      */
1425     static <K, V> Map<K, V> of(K k1, V v1, K k2, V v2, K k3, V v3, K k4, V v4, K k5, V v5,
1426                                K k6, V v6) {
1427         return new ImmutableCollections.MapN<>(k1, v1, k2, v2, k3, v3, k4, v4, k5, v5,
1428                                                k6, v6);
1429     }
1430 
1431     /**
1432      * Returns an immutable map containing seven mappings.
1433      * See <a href="#immutable">Immutable Map Static Factory Methods</a> for details.
1434      *
1435      * @param <K> the {@code Map}'s key type
1436      * @param <V> the {@code Map}'s value type
1437      * @param k1 the first mapping's key
1438      * @param v1 the first mapping's value
1439      * @param k2 the second mapping's key
1440      * @param v2 the second mapping's value
1441      * @param k3 the third mapping's key
1442      * @param v3 the third mapping's value
1443      * @param k4 the fourth mapping's key
1444      * @param v4 the fourth mapping's value
1445      * @param k5 the fifth mapping's key
1446      * @param v5 the fifth mapping's value
1447      * @param k6 the sixth mapping's key
1448      * @param v6 the sixth mapping's value
1449      * @param k7 the seventh mapping's key
1450      * @param v7 the seventh mapping's value
1451      * @return a {@code Map} containing the specified mappings
1452      * @throws IllegalArgumentException if there are any duplicate keys
1453      * @throws NullPointerException if any key or value is {@code null}
1454      *
1455      * @since 9
1456      */
1457     static <K, V> Map<K, V> of(K k1, V v1, K k2, V v2, K k3, V v3, K k4, V v4, K k5, V v5,
1458                                K k6, V v6, K k7, V v7) {
1459         return new ImmutableCollections.MapN<>(k1, v1, k2, v2, k3, v3, k4, v4, k5, v5,
1460                                                k6, v6, k7, v7);
1461     }
1462 
1463     /**
1464      * Returns an immutable map containing eight mappings.
1465      * See <a href="#immutable">Immutable Map Static Factory Methods</a> for details.
1466      *
1467      * @param <K> the {@code Map}'s key type
1468      * @param <V> the {@code Map}'s value type
1469      * @param k1 the first mapping's key
1470      * @param v1 the first mapping's value
1471      * @param k2 the second mapping's key
1472      * @param v2 the second mapping's value
1473      * @param k3 the third mapping's key
1474      * @param v3 the third mapping's value
1475      * @param k4 the fourth mapping's key
1476      * @param v4 the fourth mapping's value
1477      * @param k5 the fifth mapping's key
1478      * @param v5 the fifth mapping's value
1479      * @param k6 the sixth mapping's key
1480      * @param v6 the sixth mapping's value
1481      * @param k7 the seventh mapping's key
1482      * @param v7 the seventh mapping's value
1483      * @param k8 the eighth mapping's key
1484      * @param v8 the eighth mapping's value
1485      * @return a {@code Map} containing the specified mappings
1486      * @throws IllegalArgumentException if there are any duplicate keys
1487      * @throws NullPointerException if any key or value is {@code null}
1488      *
1489      * @since 9
1490      */
1491     static <K, V> Map<K, V> of(K k1, V v1, K k2, V v2, K k3, V v3, K k4, V v4, K k5, V v5,
1492                                K k6, V v6, K k7, V v7, K k8, V v8) {
1493         return new ImmutableCollections.MapN<>(k1, v1, k2, v2, k3, v3, k4, v4, k5, v5,
1494                                                k6, v6, k7, v7, k8, v8);
1495     }
1496 
1497     /**
1498      * Returns an immutable map containing nine mappings.
1499      * See <a href="#immutable">Immutable Map Static Factory Methods</a> for details.
1500      *
1501      * @param <K> the {@code Map}'s key type
1502      * @param <V> the {@code Map}'s value type
1503      * @param k1 the first mapping's key
1504      * @param v1 the first mapping's value
1505      * @param k2 the second mapping's key
1506      * @param v2 the second mapping's value
1507      * @param k3 the third mapping's key
1508      * @param v3 the third mapping's value
1509      * @param k4 the fourth mapping's key
1510      * @param v4 the fourth mapping's value
1511      * @param k5 the fifth mapping's key
1512      * @param v5 the fifth mapping's value
1513      * @param k6 the sixth mapping's key
1514      * @param v6 the sixth mapping's value
1515      * @param k7 the seventh mapping's key
1516      * @param v7 the seventh mapping's value
1517      * @param k8 the eighth mapping's key
1518      * @param v8 the eighth mapping's value
1519      * @param k9 the ninth mapping's key
1520      * @param v9 the ninth mapping's value
1521      * @return a {@code Map} containing the specified mappings
1522      * @throws IllegalArgumentException if there are any duplicate keys
1523      * @throws NullPointerException if any key or value is {@code null}
1524      *
1525      * @since 9
1526      */
1527     static <K, V> Map<K, V> of(K k1, V v1, K k2, V v2, K k3, V v3, K k4, V v4, K k5, V v5,
1528                                K k6, V v6, K k7, V v7, K k8, V v8, K k9, V v9) {
1529         return new ImmutableCollections.MapN<>(k1, v1, k2, v2, k3, v3, k4, v4, k5, v5,
1530                                                k6, v6, k7, v7, k8, v8, k9, v9);
1531     }
1532 
1533     /**
1534      * Returns an immutable map containing ten mappings.
1535      * See <a href="#immutable">Immutable Map Static Factory Methods</a> for details.
1536      *
1537      * @param <K> the {@code Map}'s key type
1538      * @param <V> the {@code Map}'s value type
1539      * @param k1 the first mapping's key
1540      * @param v1 the first mapping's value
1541      * @param k2 the second mapping's key
1542      * @param v2 the second mapping's value
1543      * @param k3 the third mapping's key
1544      * @param v3 the third mapping's value
1545      * @param k4 the fourth mapping's key
1546      * @param v4 the fourth mapping's value
1547      * @param k5 the fifth mapping's key
1548      * @param v5 the fifth mapping's value
1549      * @param k6 the sixth mapping's key
1550      * @param v6 the sixth mapping's value
1551      * @param k7 the seventh mapping's key
1552      * @param v7 the seventh mapping's value
1553      * @param k8 the eighth mapping's key
1554      * @param v8 the eighth mapping's value
1555      * @param k9 the ninth mapping's key
1556      * @param v9 the ninth mapping's value
1557      * @param k10 the tenth mapping's key
1558      * @param v10 the tenth mapping's value
1559      * @return a {@code Map} containing the specified mappings
1560      * @throws IllegalArgumentException if there are any duplicate keys
1561      * @throws NullPointerException if any key or value is {@code null}
1562      *
1563      * @since 9
1564      */
1565     static <K, V> Map<K, V> of(K k1, V v1, K k2, V v2, K k3, V v3, K k4, V v4, K k5, V v5,
1566                                K k6, V v6, K k7, V v7, K k8, V v8, K k9, V v9, K k10, V v10) {
1567         return new ImmutableCollections.MapN<>(k1, v1, k2, v2, k3, v3, k4, v4, k5, v5,
1568                                                k6, v6, k7, v7, k8, v8, k9, v9, k10, v10);
1569     }
1570 
1571     /**
1572      * Returns an immutable map containing keys and values extracted from the given entries.
1573      * The entries themselves are not stored in the map.
1574      * See <a href="#immutable">Immutable Map Static Factory Methods</a> for details.
1575      *
1576      * @apiNote
1577      * It is convenient to create the map entries using the {@link Map#entry Map.entry()} method.
1578      * For example,
1579      *
1580      * <pre>{@code
1581      *     import static java.util.Map.entry;
1582      *
1583      *     Map<Integer,String> map = Map.ofEntries(
1584      *         entry(1, "a"),
1585      *         entry(2, "b"),
1586      *         entry(3, "c"),
1587      *         ...
1588      *         entry(26, "z"));
1589      * }</pre>
1590      *
1591      * @param <K> the {@code Map}'s key type
1592      * @param <V> the {@code Map}'s value type
1593      * @param entries {@code Map.Entry}s containing the keys and values from which the map is populated
1594      * @return a {@code Map} containing the specified mappings
1595      * @throws IllegalArgumentException if there are any duplicate keys
1596      * @throws NullPointerException if any entry, key, or value is {@code null}, or if
1597      *         the {@code entries} array is {@code null}
1598      *
1599      * @see Map#entry Map.entry()
1600      * @since 9
1601      */
1602     @SafeVarargs
1603     @SuppressWarnings("varargs")
1604     static <K, V> Map<K, V> ofEntries(Entry<? extends K, ? extends V>... entries) {
1605         if (entries.length == 0) { // implicit null check of entries
1606             return ImmutableCollections.Map0.instance();
1607         } else if (entries.length == 1) {

1608             return new ImmutableCollections.Map1<>(entries[0].getKey(),
1609                                                    entries[0].getValue());
1610         } else {
1611             Object[] kva = new Object[entries.length << 1];
1612             int a = 0;
1613             for (Entry<? extends K, ? extends V> entry : entries) {

1614                 kva[a++] = entry.getKey();
1615                 kva[a++] = entry.getValue();
1616             }
1617             return new ImmutableCollections.MapN<>(kva);
1618         }
1619     }
1620 
1621     /**
1622      * Returns an immutable {@link Entry} containing the given key and value.
1623      * These entries are suitable for populating {@code Map} instances using the
1624      * {@link Map#ofEntries Map.ofEntries()} method.
1625      * The {@code Entry} instances created by this method have the following characteristics:
1626      *
1627      * <ul>
1628      * <li>They disallow {@code null} keys and values. Attempts to create them using a {@code null}
1629      * key or value result in {@code NullPointerException}.
1630      * <li>They are immutable. Calls to {@link Entry#setValue Entry.setValue()}
1631      * on a returned {@code Entry} result in {@code UnsupportedOperationException}.
1632      * <li>They are not serializable.
1633      * <li>They are <a href="../lang/doc-files/ValueBased.html">value-based</a>.
1634      * Callers should make no assumptions about the identity of the returned instances.
1635      * This method is free to create new instances or reuse existing ones. Therefore,
1636      * identity-sensitive operations on these instances (reference equality ({@code ==}),
1637      * identity hash code, and synchronization) are unreliable and should be avoided.
1638      * </ul>
1639      *
1640      * @apiNote
1641      * For a serializable {@code Entry}, see {@link AbstractMap.SimpleEntry} or
1642      * {@link AbstractMap.SimpleImmutableEntry}.
1643      *
1644      * @param <K> the key's type
1645      * @param <V> the value's type
1646      * @param k the key
1647      * @param v the value
1648      * @return an {@code Entry} containing the specified key and value
1649      * @throws NullPointerException if the key or value is {@code null}
1650      *
1651      * @see Map#ofEntries Map.ofEntries()
1652      * @since 9
1653      */
1654     static <K, V> Entry<K, V> entry(K k, V v) {
1655         // KeyValueHolder checks for nulls
1656         return new KeyValueHolder<>(k, v);
1657     }






















1658 }


  93  * only if this map contains a mapping for a key {@code k} such that
  94  * {@code (key==null ? k==null : key.equals(k))}." This specification should
  95  * <i>not</i> be construed to imply that invoking {@code Map.containsKey}
  96  * with a non-null argument {@code key} will cause {@code key.equals(k)} to
  97  * be invoked for any key {@code k}.  Implementations are free to
  98  * implement optimizations whereby the {@code equals} invocation is avoided,
  99  * for example, by first comparing the hash codes of the two keys.  (The
 100  * {@link Object#hashCode()} specification guarantees that two objects with
 101  * unequal hash codes cannot be equal.)  More generally, implementations of
 102  * the various Collections Framework interfaces are free to take advantage of
 103  * the specified behavior of underlying {@link Object} methods wherever the
 104  * implementor deems it appropriate.
 105  *
 106  * <p>Some map operations which perform recursive traversal of the map may fail
 107  * with an exception for self-referential instances where the map directly or
 108  * indirectly contains itself. This includes the {@code clone()},
 109  * {@code equals()}, {@code hashCode()} and {@code toString()} methods.
 110  * Implementations may optionally handle the self-referential scenario, however
 111  * most current implementations do not do so.
 112  *
 113  * <h2><a id="immutable">Unmodifiable Maps</a></h2>
 114  * <p>The {@link Map#of() Map.of},
 115  * {@link Map#ofEntries(Map.Entry...) Map.ofEntries}, and
 116  * {@link Map#copyOf Map.copyOf}
 117  * static factory methods provide a convenient way to create unmodifiable maps.
 118  * The {@code Map}
 119  * instances created by these methods have the following characteristics:
 120  *
 121  * <ul>
 122  * <li>They are <a href="Collection.html#unmodifiable"><i>unmodifiable</i></a>. Keys and values
 123  * cannot be added, removed, or updated. Calling any mutator method on the Map
 124  * will always cause {@code UnsupportedOperationException} to be thrown.
 125  * However, if the contained keys or values are themselves mutable, this may cause the
 126  * Map to behave inconsistently or its contents to appear to change.
 127  * <li>They disallow {@code null} keys and values. Attempts to create them with
 128  * {@code null} keys or values result in {@code NullPointerException}.
 129  * <li>They are serializable if all keys and values are serializable.
 130  * <li>They reject duplicate keys at creation time. Duplicate keys
 131  * passed to a static factory method result in {@code IllegalArgumentException}.
 132  * <li>The iteration order of mappings is unspecified and is subject to change.
 133  * <li>They are <a href="../lang/doc-files/ValueBased.html">value-based</a>.
 134  * Callers should make no assumptions about the identity of the returned instances.
 135  * Factories are free to create new instances or reuse existing ones. Therefore,
 136  * identity-sensitive operations on these instances (reference equality ({@code ==}),
 137  * identity hash code, and synchronization) are unreliable and should be avoided.
 138  * <li>They are serialized as specified on the
 139  * <a href="{@docRoot}/serialized-form.html#java.util.CollSer">Serialized Form</a>
 140  * page.
 141  * </ul>
 142  *
 143  * <p>This interface is a member of the
 144  * <a href="{@docRoot}/java/util/package-summary.html#CollectionsFramework">


1260      *         does not support null keys or the value or remappingFunction is
1261      *         null
1262      * @since 1.8
1263      */
1264     default V merge(K key, V value,
1265             BiFunction<? super V, ? super V, ? extends V> remappingFunction) {
1266         Objects.requireNonNull(remappingFunction);
1267         Objects.requireNonNull(value);
1268         V oldValue = get(key);
1269         V newValue = (oldValue == null) ? value :
1270                    remappingFunction.apply(oldValue, value);
1271         if (newValue == null) {
1272             remove(key);
1273         } else {
1274             put(key, newValue);
1275         }
1276         return newValue;
1277     }
1278 
1279     /**
1280      * Returns an unmodifiable map containing zero mappings.
1281      * See <a href="#unmodifiable">Unmodifiable Maps</a> for details.
1282      *
1283      * @param <K> the {@code Map}'s key type
1284      * @param <V> the {@code Map}'s value type
1285      * @return an empty {@code Map}
1286      *
1287      * @since 9
1288      */
1289     static <K, V> Map<K, V> of() {
1290         return ImmutableCollections.Map0.instance();
1291     }
1292 
1293     /**
1294      * Returns an unmodifiable map containing a single mapping.
1295      * See <a href="#unmodifiable">Unmodifiable Maps</a> for details.
1296      *
1297      * @param <K> the {@code Map}'s key type
1298      * @param <V> the {@code Map}'s value type
1299      * @param k1 the mapping's key
1300      * @param v1 the mapping's value
1301      * @return a {@code Map} containing the specified mapping
1302      * @throws NullPointerException if the key or the value is {@code null}
1303      *
1304      * @since 9
1305      */
1306     static <K, V> Map<K, V> of(K k1, V v1) {
1307         return new ImmutableCollections.Map1<>(k1, v1);
1308     }
1309 
1310     /**
1311      * Returns an unmodifiable map containing two mappings.
1312      * See <a href="#unmodifiable">Unmodifiable Maps</a> for details.
1313      *
1314      * @param <K> the {@code Map}'s key type
1315      * @param <V> the {@code Map}'s value type
1316      * @param k1 the first mapping's key
1317      * @param v1 the first mapping's value
1318      * @param k2 the second mapping's key
1319      * @param v2 the second mapping's value
1320      * @return a {@code Map} containing the specified mappings
1321      * @throws IllegalArgumentException if the keys are duplicates
1322      * @throws NullPointerException if any key or value is {@code null}
1323      *
1324      * @since 9
1325      */
1326     static <K, V> Map<K, V> of(K k1, V v1, K k2, V v2) {
1327         return new ImmutableCollections.MapN<>(k1, v1, k2, v2);
1328     }
1329 
1330     /**
1331      * Returns an unmodifiable map containing three mappings.
1332      * See <a href="#unmodifiable">Unmodifiable Maps</a> for details.
1333      *
1334      * @param <K> the {@code Map}'s key type
1335      * @param <V> the {@code Map}'s value type
1336      * @param k1 the first mapping's key
1337      * @param v1 the first mapping's value
1338      * @param k2 the second mapping's key
1339      * @param v2 the second mapping's value
1340      * @param k3 the third mapping's key
1341      * @param v3 the third mapping's value
1342      * @return a {@code Map} containing the specified mappings
1343      * @throws IllegalArgumentException if there are any duplicate keys
1344      * @throws NullPointerException if any key or value is {@code null}
1345      *
1346      * @since 9
1347      */
1348     static <K, V> Map<K, V> of(K k1, V v1, K k2, V v2, K k3, V v3) {
1349         return new ImmutableCollections.MapN<>(k1, v1, k2, v2, k3, v3);
1350     }
1351 
1352     /**
1353      * Returns an unmodifiable map containing four mappings.
1354      * See <a href="#unmodifiable">Unmodifiable Maps</a> for details.
1355      *
1356      * @param <K> the {@code Map}'s key type
1357      * @param <V> the {@code Map}'s value type
1358      * @param k1 the first mapping's key
1359      * @param v1 the first mapping's value
1360      * @param k2 the second mapping's key
1361      * @param v2 the second mapping's value
1362      * @param k3 the third mapping's key
1363      * @param v3 the third mapping's value
1364      * @param k4 the fourth mapping's key
1365      * @param v4 the fourth mapping's value
1366      * @return a {@code Map} containing the specified mappings
1367      * @throws IllegalArgumentException if there are any duplicate keys
1368      * @throws NullPointerException if any key or value is {@code null}
1369      *
1370      * @since 9
1371      */
1372     static <K, V> Map<K, V> of(K k1, V v1, K k2, V v2, K k3, V v3, K k4, V v4) {
1373         return new ImmutableCollections.MapN<>(k1, v1, k2, v2, k3, v3, k4, v4);
1374     }
1375 
1376     /**
1377      * Returns an unmodifiable map containing five mappings.
1378      * See <a href="#unmodifiable">Unmodifiable Maps</a> for details.
1379      *
1380      * @param <K> the {@code Map}'s key type
1381      * @param <V> the {@code Map}'s value type
1382      * @param k1 the first mapping's key
1383      * @param v1 the first mapping's value
1384      * @param k2 the second mapping's key
1385      * @param v2 the second mapping's value
1386      * @param k3 the third mapping's key
1387      * @param v3 the third mapping's value
1388      * @param k4 the fourth mapping's key
1389      * @param v4 the fourth mapping's value
1390      * @param k5 the fifth mapping's key
1391      * @param v5 the fifth mapping's value
1392      * @return a {@code Map} containing the specified mappings
1393      * @throws IllegalArgumentException if there are any duplicate keys
1394      * @throws NullPointerException if any key or value is {@code null}
1395      *
1396      * @since 9
1397      */
1398     static <K, V> Map<K, V> of(K k1, V v1, K k2, V v2, K k3, V v3, K k4, V v4, K k5, V v5) {
1399         return new ImmutableCollections.MapN<>(k1, v1, k2, v2, k3, v3, k4, v4, k5, v5);
1400     }
1401 
1402     /**
1403      * Returns an unmodifiable map containing six mappings.
1404      * See <a href="#unmodifiable">Unmodifiable Maps</a> for details.
1405      *
1406      * @param <K> the {@code Map}'s key type
1407      * @param <V> the {@code Map}'s value type
1408      * @param k1 the first mapping's key
1409      * @param v1 the first mapping's value
1410      * @param k2 the second mapping's key
1411      * @param v2 the second mapping's value
1412      * @param k3 the third mapping's key
1413      * @param v3 the third mapping's value
1414      * @param k4 the fourth mapping's key
1415      * @param v4 the fourth mapping's value
1416      * @param k5 the fifth mapping's key
1417      * @param v5 the fifth mapping's value
1418      * @param k6 the sixth mapping's key
1419      * @param v6 the sixth mapping's value
1420      * @return a {@code Map} containing the specified mappings
1421      * @throws IllegalArgumentException if there are any duplicate keys
1422      * @throws NullPointerException if any key or value is {@code null}
1423      *
1424      * @since 9
1425      */
1426     static <K, V> Map<K, V> of(K k1, V v1, K k2, V v2, K k3, V v3, K k4, V v4, K k5, V v5,
1427                                K k6, V v6) {
1428         return new ImmutableCollections.MapN<>(k1, v1, k2, v2, k3, v3, k4, v4, k5, v5,
1429                                                k6, v6);
1430     }
1431 
1432     /**
1433      * Returns an unmodifiable map containing seven mappings.
1434      * See <a href="#unmodifiable">Unmodifiable Maps</a> for details.
1435      *
1436      * @param <K> the {@code Map}'s key type
1437      * @param <V> the {@code Map}'s value type
1438      * @param k1 the first mapping's key
1439      * @param v1 the first mapping's value
1440      * @param k2 the second mapping's key
1441      * @param v2 the second mapping's value
1442      * @param k3 the third mapping's key
1443      * @param v3 the third mapping's value
1444      * @param k4 the fourth mapping's key
1445      * @param v4 the fourth mapping's value
1446      * @param k5 the fifth mapping's key
1447      * @param v5 the fifth mapping's value
1448      * @param k6 the sixth mapping's key
1449      * @param v6 the sixth mapping's value
1450      * @param k7 the seventh mapping's key
1451      * @param v7 the seventh mapping's value
1452      * @return a {@code Map} containing the specified mappings
1453      * @throws IllegalArgumentException if there are any duplicate keys
1454      * @throws NullPointerException if any key or value is {@code null}
1455      *
1456      * @since 9
1457      */
1458     static <K, V> Map<K, V> of(K k1, V v1, K k2, V v2, K k3, V v3, K k4, V v4, K k5, V v5,
1459                                K k6, V v6, K k7, V v7) {
1460         return new ImmutableCollections.MapN<>(k1, v1, k2, v2, k3, v3, k4, v4, k5, v5,
1461                                                k6, v6, k7, v7);
1462     }
1463 
1464     /**
1465      * Returns an unmodifiable map containing eight mappings.
1466      * See <a href="#unmodifiable">Unmodifiable Maps</a> for details.
1467      *
1468      * @param <K> the {@code Map}'s key type
1469      * @param <V> the {@code Map}'s value type
1470      * @param k1 the first mapping's key
1471      * @param v1 the first mapping's value
1472      * @param k2 the second mapping's key
1473      * @param v2 the second mapping's value
1474      * @param k3 the third mapping's key
1475      * @param v3 the third mapping's value
1476      * @param k4 the fourth mapping's key
1477      * @param v4 the fourth mapping's value
1478      * @param k5 the fifth mapping's key
1479      * @param v5 the fifth mapping's value
1480      * @param k6 the sixth mapping's key
1481      * @param v6 the sixth mapping's value
1482      * @param k7 the seventh mapping's key
1483      * @param v7 the seventh mapping's value
1484      * @param k8 the eighth mapping's key
1485      * @param v8 the eighth mapping's value
1486      * @return a {@code Map} containing the specified mappings
1487      * @throws IllegalArgumentException if there are any duplicate keys
1488      * @throws NullPointerException if any key or value is {@code null}
1489      *
1490      * @since 9
1491      */
1492     static <K, V> Map<K, V> of(K k1, V v1, K k2, V v2, K k3, V v3, K k4, V v4, K k5, V v5,
1493                                K k6, V v6, K k7, V v7, K k8, V v8) {
1494         return new ImmutableCollections.MapN<>(k1, v1, k2, v2, k3, v3, k4, v4, k5, v5,
1495                                                k6, v6, k7, v7, k8, v8);
1496     }
1497 
1498     /**
1499      * Returns an unmodifiable map containing nine mappings.
1500      * See <a href="#unmodifiable">Unmodifiable Maps</a> for details.
1501      *
1502      * @param <K> the {@code Map}'s key type
1503      * @param <V> the {@code Map}'s value type
1504      * @param k1 the first mapping's key
1505      * @param v1 the first mapping's value
1506      * @param k2 the second mapping's key
1507      * @param v2 the second mapping's value
1508      * @param k3 the third mapping's key
1509      * @param v3 the third mapping's value
1510      * @param k4 the fourth mapping's key
1511      * @param v4 the fourth mapping's value
1512      * @param k5 the fifth mapping's key
1513      * @param v5 the fifth mapping's value
1514      * @param k6 the sixth mapping's key
1515      * @param v6 the sixth mapping's value
1516      * @param k7 the seventh mapping's key
1517      * @param v7 the seventh mapping's value
1518      * @param k8 the eighth mapping's key
1519      * @param v8 the eighth mapping's value
1520      * @param k9 the ninth mapping's key
1521      * @param v9 the ninth mapping's value
1522      * @return a {@code Map} containing the specified mappings
1523      * @throws IllegalArgumentException if there are any duplicate keys
1524      * @throws NullPointerException if any key or value is {@code null}
1525      *
1526      * @since 9
1527      */
1528     static <K, V> Map<K, V> of(K k1, V v1, K k2, V v2, K k3, V v3, K k4, V v4, K k5, V v5,
1529                                K k6, V v6, K k7, V v7, K k8, V v8, K k9, V v9) {
1530         return new ImmutableCollections.MapN<>(k1, v1, k2, v2, k3, v3, k4, v4, k5, v5,
1531                                                k6, v6, k7, v7, k8, v8, k9, v9);
1532     }
1533 
1534     /**
1535      * Returns an unmodifiable map containing ten mappings.
1536      * See <a href="#unmodifiable">Unmodifiable Maps</a> for details.
1537      *
1538      * @param <K> the {@code Map}'s key type
1539      * @param <V> the {@code Map}'s value type
1540      * @param k1 the first mapping's key
1541      * @param v1 the first mapping's value
1542      * @param k2 the second mapping's key
1543      * @param v2 the second mapping's value
1544      * @param k3 the third mapping's key
1545      * @param v3 the third mapping's value
1546      * @param k4 the fourth mapping's key
1547      * @param v4 the fourth mapping's value
1548      * @param k5 the fifth mapping's key
1549      * @param v5 the fifth mapping's value
1550      * @param k6 the sixth mapping's key
1551      * @param v6 the sixth mapping's value
1552      * @param k7 the seventh mapping's key
1553      * @param v7 the seventh mapping's value
1554      * @param k8 the eighth mapping's key
1555      * @param v8 the eighth mapping's value
1556      * @param k9 the ninth mapping's key
1557      * @param v9 the ninth mapping's value
1558      * @param k10 the tenth mapping's key
1559      * @param v10 the tenth mapping's value
1560      * @return a {@code Map} containing the specified mappings
1561      * @throws IllegalArgumentException if there are any duplicate keys
1562      * @throws NullPointerException if any key or value is {@code null}
1563      *
1564      * @since 9
1565      */
1566     static <K, V> Map<K, V> of(K k1, V v1, K k2, V v2, K k3, V v3, K k4, V v4, K k5, V v5,
1567                                K k6, V v6, K k7, V v7, K k8, V v8, K k9, V v9, K k10, V v10) {
1568         return new ImmutableCollections.MapN<>(k1, v1, k2, v2, k3, v3, k4, v4, k5, v5,
1569                                                k6, v6, k7, v7, k8, v8, k9, v9, k10, v10);
1570     }
1571 
1572     /**
1573      * Returns an unmodifiable map containing keys and values extracted from the given entries.
1574      * The entries themselves are not stored in the map.
1575      * See <a href="#unmodifiable">Unmodifiable Maps</a> for details.
1576      *
1577      * @apiNote
1578      * It is convenient to create the map entries using the {@link Map#entry Map.entry()} method.
1579      * For example,
1580      *
1581      * <pre>{@code
1582      *     import static java.util.Map.entry;
1583      *
1584      *     Map<Integer,String> map = Map.ofEntries(
1585      *         entry(1, "a"),
1586      *         entry(2, "b"),
1587      *         entry(3, "c"),
1588      *         ...
1589      *         entry(26, "z"));
1590      * }</pre>
1591      *
1592      * @param <K> the {@code Map}'s key type
1593      * @param <V> the {@code Map}'s value type
1594      * @param entries {@code Map.Entry}s containing the keys and values from which the map is populated
1595      * @return a {@code Map} containing the specified mappings
1596      * @throws IllegalArgumentException if there are any duplicate keys
1597      * @throws NullPointerException if any entry, key, or value is {@code null}, or if
1598      *         the {@code entries} array is {@code null}
1599      *
1600      * @see Map#entry Map.entry()
1601      * @since 9
1602      */
1603     @SafeVarargs
1604     @SuppressWarnings("varargs")
1605     static <K, V> Map<K, V> ofEntries(Entry<? extends K, ? extends V>... entries) {
1606         if (entries.length == 0) { // implicit null check of entries array
1607             return ImmutableCollections.Map0.instance();
1608         } else if (entries.length == 1) {
1609             // implicit null check of the array slot
1610             return new ImmutableCollections.Map1<>(entries[0].getKey(),
1611                                                    entries[0].getValue());
1612         } else {
1613             Object[] kva = new Object[entries.length << 1];
1614             int a = 0;
1615             for (Entry<? extends K, ? extends V> entry : entries) {
1616                 // implicit null checks of each array slot
1617                 kva[a++] = entry.getKey();
1618                 kva[a++] = entry.getValue();
1619             }
1620             return new ImmutableCollections.MapN<>(kva);
1621         }
1622     }
1623 
1624     /**
1625      * Returns an unmodifiable {@link Entry} containing the given key and value.
1626      * These entries are suitable for populating {@code Map} instances using the
1627      * {@link Map#ofEntries Map.ofEntries()} method.
1628      * The {@code Entry} instances created by this method have the following characteristics:
1629      *
1630      * <ul>
1631      * <li>They disallow {@code null} keys and values. Attempts to create them using a {@code null}
1632      * key or value result in {@code NullPointerException}.
1633      * <li>They are unmodifiable. Calls to {@link Entry#setValue Entry.setValue()}
1634      * on a returned {@code Entry} result in {@code UnsupportedOperationException}.
1635      * <li>They are not serializable.
1636      * <li>They are <a href="../lang/doc-files/ValueBased.html">value-based</a>.
1637      * Callers should make no assumptions about the identity of the returned instances.
1638      * This method is free to create new instances or reuse existing ones. Therefore,
1639      * identity-sensitive operations on these instances (reference equality ({@code ==}),
1640      * identity hash code, and synchronization) are unreliable and should be avoided.
1641      * </ul>
1642      *
1643      * @apiNote
1644      * For a serializable {@code Entry}, see {@link AbstractMap.SimpleEntry} or
1645      * {@link AbstractMap.SimpleImmutableEntry}.
1646      *
1647      * @param <K> the key's type
1648      * @param <V> the value's type
1649      * @param k the key
1650      * @param v the value
1651      * @return an {@code Entry} containing the specified key and value
1652      * @throws NullPointerException if the key or value is {@code null}
1653      *
1654      * @see Map#ofEntries Map.ofEntries()
1655      * @since 9
1656      */
1657     static <K, V> Entry<K, V> entry(K k, V v) {
1658         // KeyValueHolder checks for nulls
1659         return new KeyValueHolder<>(k, v);
1660     }
1661 
1662     /**
1663      * Returns an <a href="#unmodifiable">unmodifiable Map</a> containing the entries
1664      * of the given Map. the given Map must not be null, and it must not contain any
1665      * null keys or values. If the given Map is subsequently modified, the returned
1666      * Map will not reflect such modifications.
1667      *
1668      * @param <K> the {@code Map}'s key type
1669      * @param <V> the {@code Map}'s value type
1670      * @param map the map from which entries are drawn, must be non-null
1671      * @return the new {@code Map}
1672      * @throws NullPointerException if map is null, or if it contains any null keys or values
1673      * @since 10
1674      */
1675     @SuppressWarnings({"rawtypes","unchecked"})
1676     static <K, V> Map<K, V> copyOf(Map<? extends K, ? extends V> map) {
1677         if (map instanceof ImmutableCollections.AbstractImmutableMap) {
1678             return (Map<K,V>)map;
1679         } else {
1680             return (Map<K,V>)Map.ofEntries(map.entrySet().toArray(new Entry[0]));
1681         }
1682     }
1683 }
< prev index next >