151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski/* 251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * Copyright (c) 1997, 2010, Oracle and/or its affiliates. All rights reserved. 351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. 451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * 551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * This code is free software; you can redistribute it and/or modify it 651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * under the terms of the GNU General Public License version 2 only, as 751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * published by the Free Software Foundation. Oracle designates this 851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * particular file as subject to the "Classpath" exception as provided 951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * by Oracle in the LICENSE file that accompanied this code. 1051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * 1151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * This code is distributed in the hope that it will be useful, but WITHOUT 1251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or 1351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License 1451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * version 2 for more details (a copy is included in the LICENSE file that 1551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * accompanied this code). 1651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * 1751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * You should have received a copy of the GNU General Public License version 1851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * 2 along with this work; if not, write to the Free Software Foundation, 1951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. 2051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * 2151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA 2251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * or visit www.oracle.com if you need additional information or have any 2351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * questions. 2451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski */ 2551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 2651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebskipackage java.util; 2751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebskiimport java.util.Map.Entry; 2851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 2951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski/** 3051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * This class provides a skeletal implementation of the <tt>Map</tt> 3151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * interface, to minimize the effort required to implement this interface. 3251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * 3351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * <p>To implement an unmodifiable map, the programmer needs only to extend this 3451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * class and provide an implementation for the <tt>entrySet</tt> method, which 3551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * returns a set-view of the map's mappings. Typically, the returned set 3651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * will, in turn, be implemented atop <tt>AbstractSet</tt>. This set should 3751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * not support the <tt>add</tt> or <tt>remove</tt> methods, and its iterator 3851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * should not support the <tt>remove</tt> method. 3951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * 4051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * <p>To implement a modifiable map, the programmer must additionally override 4151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * this class's <tt>put</tt> method (which otherwise throws an 4251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * <tt>UnsupportedOperationException</tt>), and the iterator returned by 4351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * <tt>entrySet().iterator()</tt> must additionally implement its 4451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * <tt>remove</tt> method. 4551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * 4651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * <p>The programmer should generally provide a void (no argument) and map 4751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * constructor, as per the recommendation in the <tt>Map</tt> interface 4851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * specification. 4951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * 5051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * <p>The documentation for each non-abstract method in this class describes its 5151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * implementation in detail. Each of these methods may be overridden if the 5251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * map being implemented admits a more efficient implementation. 5351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * 5451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * <p>This class is a member of the 55d2449bb576ad1e3a3877364e5e1ae28625f69e35Yi Kong * <a href="{@docRoot}openjdk-redirect.html?v=8&path=/technotes/guides/collections/index.html"> 5651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * Java Collections Framework</a>. 5751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * 5851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * @param <K> the type of keys maintained by this map 5951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * @param <V> the type of mapped values 6051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * 6151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * @author Josh Bloch 6251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * @author Neal Gafter 6351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * @see Map 6451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * @see Collection 6551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * @since 1.2 6651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski */ 6751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 6851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebskipublic abstract class AbstractMap<K,V> implements Map<K,V> { 6951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski /** 7051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * Sole constructor. (For invocation by subclass constructors, typically 7151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * implicit.) 7251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski */ 7351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski protected AbstractMap() { 7451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 7551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 7651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski // Query Operations 7751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 7851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski /** 7951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * {@inheritDoc} 8051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * 8151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * <p>This implementation returns <tt>entrySet().size()</tt>. 8251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski */ 8351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski public int size() { 8451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski return entrySet().size(); 8551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 8651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 8751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski /** 8851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * {@inheritDoc} 8951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * 9051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * <p>This implementation returns <tt>size() == 0</tt>. 9151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski */ 9251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski public boolean isEmpty() { 9351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski return size() == 0; 9451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 9551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 9651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski /** 9751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * {@inheritDoc} 9851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * 9951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * <p>This implementation iterates over <tt>entrySet()</tt> searching 10051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * for an entry with the specified value. If such an entry is found, 10151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * <tt>true</tt> is returned. If the iteration terminates without 10251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * finding such an entry, <tt>false</tt> is returned. Note that this 10351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * implementation requires linear time in the size of the map. 10451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * 10551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * @throws ClassCastException {@inheritDoc} 10651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * @throws NullPointerException {@inheritDoc} 10751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski */ 10851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski public boolean containsValue(Object value) { 10951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski Iterator<Entry<K,V>> i = entrySet().iterator(); 11051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski if (value==null) { 11151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski while (i.hasNext()) { 11251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski Entry<K,V> e = i.next(); 11351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski if (e.getValue()==null) 11451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski return true; 11551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 11651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } else { 11751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski while (i.hasNext()) { 11851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski Entry<K,V> e = i.next(); 11951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski if (value.equals(e.getValue())) 12051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski return true; 12151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 12251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 12351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski return false; 12451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 12551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 12651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski /** 12751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * {@inheritDoc} 12851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * 12951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * <p>This implementation iterates over <tt>entrySet()</tt> searching 13051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * for an entry with the specified key. If such an entry is found, 13151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * <tt>true</tt> is returned. If the iteration terminates without 13251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * finding such an entry, <tt>false</tt> is returned. Note that this 13351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * implementation requires linear time in the size of the map; many 13451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * implementations will override this method. 13551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * 13651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * @throws ClassCastException {@inheritDoc} 13751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * @throws NullPointerException {@inheritDoc} 13851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski */ 13951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski public boolean containsKey(Object key) { 14051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski Iterator<Map.Entry<K,V>> i = entrySet().iterator(); 14151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski if (key==null) { 14251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski while (i.hasNext()) { 14351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski Entry<K,V> e = i.next(); 14451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski if (e.getKey()==null) 14551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski return true; 14651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 14751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } else { 14851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski while (i.hasNext()) { 14951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski Entry<K,V> e = i.next(); 15051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski if (key.equals(e.getKey())) 15151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski return true; 15251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 15351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 15451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski return false; 15551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 15651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 15751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski /** 15851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * {@inheritDoc} 15951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * 16051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * <p>This implementation iterates over <tt>entrySet()</tt> searching 16151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * for an entry with the specified key. If such an entry is found, 16251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * the entry's value is returned. If the iteration terminates without 16351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * finding such an entry, <tt>null</tt> is returned. Note that this 16451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * implementation requires linear time in the size of the map; many 16551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * implementations will override this method. 16651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * 16751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * @throws ClassCastException {@inheritDoc} 16851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * @throws NullPointerException {@inheritDoc} 16951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski */ 17051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski public V get(Object key) { 17151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski Iterator<Entry<K,V>> i = entrySet().iterator(); 17251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski if (key==null) { 17351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski while (i.hasNext()) { 17451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski Entry<K,V> e = i.next(); 17551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski if (e.getKey()==null) 17651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski return e.getValue(); 17751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 17851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } else { 17951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski while (i.hasNext()) { 18051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski Entry<K,V> e = i.next(); 18151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski if (key.equals(e.getKey())) 18251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski return e.getValue(); 18351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 18451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 18551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski return null; 18651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 18751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 18851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 18951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski // Modification Operations 19051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 19151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski /** 19251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * {@inheritDoc} 19351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * 19451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * <p>This implementation always throws an 19551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * <tt>UnsupportedOperationException</tt>. 19651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * 19751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * @throws UnsupportedOperationException {@inheritDoc} 19851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * @throws ClassCastException {@inheritDoc} 19951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * @throws NullPointerException {@inheritDoc} 20051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * @throws IllegalArgumentException {@inheritDoc} 20151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski */ 20251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski public V put(K key, V value) { 20351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski throw new UnsupportedOperationException(); 20451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 20551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 20651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski /** 20751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * {@inheritDoc} 20851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * 20951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * <p>This implementation iterates over <tt>entrySet()</tt> searching for an 21051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * entry with the specified key. If such an entry is found, its value is 21151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * obtained with its <tt>getValue</tt> operation, the entry is removed 21251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * from the collection (and the backing map) with the iterator's 21351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * <tt>remove</tt> operation, and the saved value is returned. If the 21451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * iteration terminates without finding such an entry, <tt>null</tt> is 21551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * returned. Note that this implementation requires linear time in the 21651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * size of the map; many implementations will override this method. 21751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * 21851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * <p>Note that this implementation throws an 21951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * <tt>UnsupportedOperationException</tt> if the <tt>entrySet</tt> 22051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * iterator does not support the <tt>remove</tt> method and this map 22151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * contains a mapping for the specified key. 22251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * 22351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * @throws UnsupportedOperationException {@inheritDoc} 22451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * @throws ClassCastException {@inheritDoc} 22551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * @throws NullPointerException {@inheritDoc} 22651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski */ 22751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski public V remove(Object key) { 22851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski Iterator<Entry<K,V>> i = entrySet().iterator(); 22951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski Entry<K,V> correctEntry = null; 23051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski if (key==null) { 23151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski while (correctEntry==null && i.hasNext()) { 23251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski Entry<K,V> e = i.next(); 23351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski if (e.getKey()==null) 23451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski correctEntry = e; 23551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 23651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } else { 23751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski while (correctEntry==null && i.hasNext()) { 23851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski Entry<K,V> e = i.next(); 23951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski if (key.equals(e.getKey())) 24051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski correctEntry = e; 24151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 24251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 24351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 24451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski V oldValue = null; 24551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski if (correctEntry !=null) { 24651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski oldValue = correctEntry.getValue(); 24751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski i.remove(); 24851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 24951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski return oldValue; 25051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 25151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 25251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 25351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski // Bulk Operations 25451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 25551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski /** 25651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * {@inheritDoc} 25751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * 25851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * <p>This implementation iterates over the specified map's 25951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * <tt>entrySet()</tt> collection, and calls this map's <tt>put</tt> 26051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * operation once for each entry returned by the iteration. 26151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * 26251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * <p>Note that this implementation throws an 26351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * <tt>UnsupportedOperationException</tt> if this map does not support 26451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * the <tt>put</tt> operation and the specified map is nonempty. 26551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * 26651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * @throws UnsupportedOperationException {@inheritDoc} 26751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * @throws ClassCastException {@inheritDoc} 26851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * @throws NullPointerException {@inheritDoc} 26951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * @throws IllegalArgumentException {@inheritDoc} 27051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski */ 27151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski public void putAll(Map<? extends K, ? extends V> m) { 27251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski for (Map.Entry<? extends K, ? extends V> e : m.entrySet()) 27351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski put(e.getKey(), e.getValue()); 27451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 27551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 27651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski /** 27751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * {@inheritDoc} 27851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * 27951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * <p>This implementation calls <tt>entrySet().clear()</tt>. 28051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * 28151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * <p>Note that this implementation throws an 28251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * <tt>UnsupportedOperationException</tt> if the <tt>entrySet</tt> 28351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * does not support the <tt>clear</tt> operation. 28451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * 28551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * @throws UnsupportedOperationException {@inheritDoc} 28651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski */ 28751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski public void clear() { 28851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski entrySet().clear(); 28951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 29051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 29151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 29251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski // Views 29351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 29451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski /** 29551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * Each of these fields are initialized to contain an instance of the 29651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * appropriate view the first time this view is requested. The views are 29751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * stateless, so there's no reason to create more than one of each. 29851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski */ 29951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski transient volatile Set<K> keySet = null; 30051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski transient volatile Collection<V> values = null; 30151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 30251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski /** 30351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * {@inheritDoc} 30451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * 30551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * <p>This implementation returns a set that subclasses {@link AbstractSet}. 30651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * The subclass's iterator method returns a "wrapper object" over this 30751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * map's <tt>entrySet()</tt> iterator. The <tt>size</tt> method 30851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * delegates to this map's <tt>size</tt> method and the 30951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * <tt>contains</tt> method delegates to this map's 31051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * <tt>containsKey</tt> method. 31151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * 31251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * <p>The set is created the first time this method is called, 31351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * and returned in response to all subsequent calls. No synchronization 31451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * is performed, so there is a slight chance that multiple calls to this 31551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * method will not all return the same set. 31651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski */ 31751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski public Set<K> keySet() { 31851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski if (keySet == null) { 31951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski keySet = new AbstractSet<K>() { 32051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski public Iterator<K> iterator() { 32151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski return new Iterator<K>() { 32251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski private Iterator<Entry<K,V>> i = entrySet().iterator(); 32351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 32451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski public boolean hasNext() { 32551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski return i.hasNext(); 32651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 32751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 32851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski public K next() { 32951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski return i.next().getKey(); 33051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 33151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 33251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski public void remove() { 33351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski i.remove(); 33451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 33551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski }; 33651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 33751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 33851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski public int size() { 33951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski return AbstractMap.this.size(); 34051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 34151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 34251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski public boolean isEmpty() { 34351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski return AbstractMap.this.isEmpty(); 34451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 34551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 34651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski public void clear() { 34751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski AbstractMap.this.clear(); 34851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 34951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 35051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski public boolean contains(Object k) { 35151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski return AbstractMap.this.containsKey(k); 35251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 35351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski }; 35451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 35551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski return keySet; 35651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 35751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 35851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski /** 35951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * {@inheritDoc} 36051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * 36151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * <p>This implementation returns a collection that subclasses {@link 36251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * AbstractCollection}. The subclass's iterator method returns a 36351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * "wrapper object" over this map's <tt>entrySet()</tt> iterator. 36451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * The <tt>size</tt> method delegates to this map's <tt>size</tt> 36551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * method and the <tt>contains</tt> method delegates to this map's 36651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * <tt>containsValue</tt> method. 36751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * 36851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * <p>The collection is created the first time this method is called, and 36951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * returned in response to all subsequent calls. No synchronization is 37051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * performed, so there is a slight chance that multiple calls to this 37151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * method will not all return the same collection. 37251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski */ 37351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski public Collection<V> values() { 37451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski if (values == null) { 37551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski values = new AbstractCollection<V>() { 37651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski public Iterator<V> iterator() { 37751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski return new Iterator<V>() { 37851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski private Iterator<Entry<K,V>> i = entrySet().iterator(); 37951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 38051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski public boolean hasNext() { 38151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski return i.hasNext(); 38251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 38351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 38451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski public V next() { 38551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski return i.next().getValue(); 38651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 38751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 38851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski public void remove() { 38951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski i.remove(); 39051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 39151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski }; 39251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 39351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 39451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski public int size() { 39551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski return AbstractMap.this.size(); 39651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 39751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 39851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski public boolean isEmpty() { 39951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski return AbstractMap.this.isEmpty(); 40051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 40151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 40251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski public void clear() { 40351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski AbstractMap.this.clear(); 40451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 40551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 40651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski public boolean contains(Object v) { 40751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski return AbstractMap.this.containsValue(v); 40851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 40951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski }; 41051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 41151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski return values; 41251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 41351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 41451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski public abstract Set<Entry<K,V>> entrySet(); 41551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 41651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 41751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski // Comparison and hashing 41851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 41951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski /** 42051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * Compares the specified object with this map for equality. Returns 42151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * <tt>true</tt> if the given object is also a map and the two maps 42251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * represent the same mappings. More formally, two maps <tt>m1</tt> and 42351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * <tt>m2</tt> represent the same mappings if 42451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * <tt>m1.entrySet().equals(m2.entrySet())</tt>. This ensures that the 42551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * <tt>equals</tt> method works properly across different implementations 42651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * of the <tt>Map</tt> interface. 42751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * 42851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * <p>This implementation first checks if the specified object is this map; 42951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * if so it returns <tt>true</tt>. Then, it checks if the specified 43051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * object is a map whose size is identical to the size of this map; if 43151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * not, it returns <tt>false</tt>. If so, it iterates over this map's 43251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * <tt>entrySet</tt> collection, and checks that the specified map 43351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * contains each mapping that this map contains. If the specified map 43451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * fails to contain such a mapping, <tt>false</tt> is returned. If the 43551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * iteration completes, <tt>true</tt> is returned. 43651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * 43751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * @param o object to be compared for equality with this map 43851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * @return <tt>true</tt> if the specified object is equal to this map 43951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski */ 44051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski public boolean equals(Object o) { 44151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski if (o == this) 44251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski return true; 44351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 44451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski if (!(o instanceof Map)) 44551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski return false; 44651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski Map<K,V> m = (Map<K,V>) o; 44751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski if (m.size() != size()) 44851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski return false; 44951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 45051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski try { 45151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski Iterator<Entry<K,V>> i = entrySet().iterator(); 45251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski while (i.hasNext()) { 45351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski Entry<K,V> e = i.next(); 45451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski K key = e.getKey(); 45551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski V value = e.getValue(); 45651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski if (value == null) { 45751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski if (!(m.get(key)==null && m.containsKey(key))) 45851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski return false; 45951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } else { 46051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski if (!value.equals(m.get(key))) 46151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski return false; 46251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 46351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 46451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } catch (ClassCastException unused) { 46551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski return false; 46651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } catch (NullPointerException unused) { 46751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski return false; 46851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 46951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 47051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski return true; 47151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 47251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 47351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski /** 47451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * Returns the hash code value for this map. The hash code of a map is 47551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * defined to be the sum of the hash codes of each entry in the map's 47651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * <tt>entrySet()</tt> view. This ensures that <tt>m1.equals(m2)</tt> 47751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * implies that <tt>m1.hashCode()==m2.hashCode()</tt> for any two maps 47851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * <tt>m1</tt> and <tt>m2</tt>, as required by the general contract of 47951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * {@link Object#hashCode}. 48051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * 48151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * <p>This implementation iterates over <tt>entrySet()</tt>, calling 48251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * {@link Map.Entry#hashCode hashCode()} on each element (entry) in the 48351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * set, and adding up the results. 48451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * 48551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * @return the hash code value for this map 48651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * @see Map.Entry#hashCode() 48751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * @see Object#equals(Object) 48851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * @see Set#equals(Object) 48951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski */ 49051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski public int hashCode() { 49151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski int h = 0; 49251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski Iterator<Entry<K,V>> i = entrySet().iterator(); 49351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski while (i.hasNext()) 49451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski h += i.next().hashCode(); 49551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski return h; 49651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 49751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 49851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski /** 49951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * Returns a string representation of this map. The string representation 50051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * consists of a list of key-value mappings in the order returned by the 50151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * map's <tt>entrySet</tt> view's iterator, enclosed in braces 50251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * (<tt>"{}"</tt>). Adjacent mappings are separated by the characters 50351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * <tt>", "</tt> (comma and space). Each key-value mapping is rendered as 50451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * the key followed by an equals sign (<tt>"="</tt>) followed by the 50551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * associated value. Keys and values are converted to strings as by 50651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * {@link String#valueOf(Object)}. 50751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * 50851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * @return a string representation of this map 50951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski */ 51051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski public String toString() { 51151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski Iterator<Entry<K,V>> i = entrySet().iterator(); 51251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski if (! i.hasNext()) 51351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski return "{}"; 51451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 51551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski StringBuilder sb = new StringBuilder(); 51651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski sb.append('{'); 51751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski for (;;) { 51851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski Entry<K,V> e = i.next(); 51951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski K key = e.getKey(); 52051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski V value = e.getValue(); 52151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski sb.append(key == this ? "(this Map)" : key); 52251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski sb.append('='); 52351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski sb.append(value == this ? "(this Map)" : value); 52451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski if (! i.hasNext()) 52551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski return sb.append('}').toString(); 52651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski sb.append(',').append(' '); 52751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 52851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 52951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 53051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski /** 53151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * Returns a shallow copy of this <tt>AbstractMap</tt> instance: the keys 53251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * and values themselves are not cloned. 53351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * 53451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * @return a shallow copy of this map 53551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski */ 53651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski protected Object clone() throws CloneNotSupportedException { 53751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski AbstractMap<K,V> result = (AbstractMap<K,V>)super.clone(); 53851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski result.keySet = null; 53951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski result.values = null; 54051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski return result; 54151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 54251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 54351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski /** 54451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * Utility method for SimpleEntry and SimpleImmutableEntry. 54551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * Test for equality, checking for nulls. 54651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski */ 54751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski private static boolean eq(Object o1, Object o2) { 54851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski return o1 == null ? o2 == null : o1.equals(o2); 54951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 55051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 55151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski // Implementation Note: SimpleEntry and SimpleImmutableEntry 55251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski // are distinct unrelated classes, even though they share 55351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski // some code. Since you can't add or subtract final-ness 55451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski // of a field in a subclass, they can't share representations, 55551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski // and the amount of duplicated code is too small to warrant 55651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski // exposing a common abstract class. 55751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 55851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 55951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski /** 56051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * An Entry maintaining a key and a value. The value may be 56151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * changed using the <tt>setValue</tt> method. This class 56251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * facilitates the process of building custom map 56351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * implementations. For example, it may be convenient to return 56451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * arrays of <tt>SimpleEntry</tt> instances in method 56551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * <tt>Map.entrySet().toArray</tt>. 56651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * 56751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * @since 1.6 56851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski */ 56951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski public static class SimpleEntry<K,V> 57051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski implements Entry<K,V>, java.io.Serializable 57151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski { 57251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski private static final long serialVersionUID = -8499721149061103585L; 57351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 57451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski private final K key; 57551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski private V value; 57651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 57751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski /** 57851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * Creates an entry representing a mapping from the specified 57951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * key to the specified value. 58051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * 58151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * @param key the key represented by this entry 58251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * @param value the value represented by this entry 58351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski */ 58451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski public SimpleEntry(K key, V value) { 58551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski this.key = key; 58651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski this.value = value; 58751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 58851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 58951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski /** 59051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * Creates an entry representing the same mapping as the 59151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * specified entry. 59251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * 59351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * @param entry the entry to copy 59451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski */ 59551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski public SimpleEntry(Entry<? extends K, ? extends V> entry) { 59651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski this.key = entry.getKey(); 59751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski this.value = entry.getValue(); 59851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 59951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 60051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski /** 60151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * Returns the key corresponding to this entry. 60251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * 60351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * @return the key corresponding to this entry 60451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski */ 60551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski public K getKey() { 60651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski return key; 60751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 60851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 60951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski /** 61051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * Returns the value corresponding to this entry. 61151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * 61251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * @return the value corresponding to this entry 61351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski */ 61451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski public V getValue() { 61551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski return value; 61651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 61751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 61851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski /** 61951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * Replaces the value corresponding to this entry with the specified 62051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * value. 62151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * 62251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * @param value new value to be stored in this entry 62351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * @return the old value corresponding to the entry 62451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski */ 62551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski public V setValue(V value) { 62651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski V oldValue = this.value; 62751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski this.value = value; 62851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski return oldValue; 62951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 63051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 63151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski /** 63251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * Compares the specified object with this entry for equality. 63351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * Returns {@code true} if the given object is also a map entry and 63451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * the two entries represent the same mapping. More formally, two 63551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * entries {@code e1} and {@code e2} represent the same mapping 63651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * if<pre> 63751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * (e1.getKey()==null ? 63851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * e2.getKey()==null : 63951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * e1.getKey().equals(e2.getKey())) 64051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * && 64151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * (e1.getValue()==null ? 64251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * e2.getValue()==null : 64351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * e1.getValue().equals(e2.getValue()))</pre> 64451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * This ensures that the {@code equals} method works properly across 64551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * different implementations of the {@code Map.Entry} interface. 64651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * 64751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * @param o object to be compared for equality with this map entry 64851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * @return {@code true} if the specified object is equal to this map 64951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * entry 65051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * @see #hashCode 65151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski */ 65251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski public boolean equals(Object o) { 65351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski if (!(o instanceof Map.Entry)) 65451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski return false; 65551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski Map.Entry e = (Map.Entry)o; 65651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski return eq(key, e.getKey()) && eq(value, e.getValue()); 65751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 65851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 65951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski /** 66051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * Returns the hash code value for this map entry. The hash code 66151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * of a map entry {@code e} is defined to be: <pre> 66251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * (e.getKey()==null ? 0 : e.getKey().hashCode()) ^ 66351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * (e.getValue()==null ? 0 : e.getValue().hashCode())</pre> 66451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * This ensures that {@code e1.equals(e2)} implies that 66551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * {@code e1.hashCode()==e2.hashCode()} for any two Entries 66651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * {@code e1} and {@code e2}, as required by the general 66751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * contract of {@link Object#hashCode}. 66851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * 66951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * @return the hash code value for this map entry 67051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * @see #equals 67151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski */ 67251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski public int hashCode() { 67351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski return (key == null ? 0 : key.hashCode()) ^ 67451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski (value == null ? 0 : value.hashCode()); 67551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 67651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 67751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski /** 67851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * Returns a String representation of this map entry. This 67951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * implementation returns the string representation of this 68051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * entry's key followed by the equals character ("<tt>=</tt>") 68151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * followed by the string representation of this entry's value. 68251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * 68351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * @return a String representation of this map entry 68451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski */ 68551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski public String toString() { 68651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski return key + "=" + value; 68751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 68851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 68951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 69051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 69151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski /** 69251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * An Entry maintaining an immutable key and value. This class 69351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * does not support method <tt>setValue</tt>. This class may be 69451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * convenient in methods that return thread-safe snapshots of 69551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * key-value mappings. 69651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * 69751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * @since 1.6 69851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski */ 69951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski public static class SimpleImmutableEntry<K,V> 70051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski implements Entry<K,V>, java.io.Serializable 70151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski { 70251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski private static final long serialVersionUID = 7138329143949025153L; 70351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 70451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski private final K key; 70551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski private final V value; 70651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 70751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski /** 70851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * Creates an entry representing a mapping from the specified 70951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * key to the specified value. 71051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * 71151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * @param key the key represented by this entry 71251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * @param value the value represented by this entry 71351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski */ 71451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski public SimpleImmutableEntry(K key, V value) { 71551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski this.key = key; 71651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski this.value = value; 71751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 71851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 71951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski /** 72051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * Creates an entry representing the same mapping as the 72151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * specified entry. 72251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * 72351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * @param entry the entry to copy 72451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski */ 72551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski public SimpleImmutableEntry(Entry<? extends K, ? extends V> entry) { 72651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski this.key = entry.getKey(); 72751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski this.value = entry.getValue(); 72851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 72951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 73051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski /** 73151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * Returns the key corresponding to this entry. 73251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * 73351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * @return the key corresponding to this entry 73451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski */ 73551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski public K getKey() { 73651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski return key; 73751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 73851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 73951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski /** 74051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * Returns the value corresponding to this entry. 74151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * 74251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * @return the value corresponding to this entry 74351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski */ 74451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski public V getValue() { 74551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski return value; 74651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 74751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 74851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski /** 74951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * Replaces the value corresponding to this entry with the specified 75051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * value (optional operation). This implementation simply throws 75151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * <tt>UnsupportedOperationException</tt>, as this class implements 75251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * an <i>immutable</i> map entry. 75351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * 75451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * @param value new value to be stored in this entry 75551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * @return (Does not return) 75651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * @throws UnsupportedOperationException always 75751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski */ 75851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski public V setValue(V value) { 75951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski throw new UnsupportedOperationException(); 76051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 76151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 76251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski /** 76351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * Compares the specified object with this entry for equality. 76451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * Returns {@code true} if the given object is also a map entry and 76551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * the two entries represent the same mapping. More formally, two 76651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * entries {@code e1} and {@code e2} represent the same mapping 76751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * if<pre> 76851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * (e1.getKey()==null ? 76951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * e2.getKey()==null : 77051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * e1.getKey().equals(e2.getKey())) 77151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * && 77251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * (e1.getValue()==null ? 77351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * e2.getValue()==null : 77451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * e1.getValue().equals(e2.getValue()))</pre> 77551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * This ensures that the {@code equals} method works properly across 77651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * different implementations of the {@code Map.Entry} interface. 77751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * 77851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * @param o object to be compared for equality with this map entry 77951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * @return {@code true} if the specified object is equal to this map 78051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * entry 78151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * @see #hashCode 78251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski */ 78351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski public boolean equals(Object o) { 78451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski if (!(o instanceof Map.Entry)) 78551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski return false; 78651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski Map.Entry e = (Map.Entry)o; 78751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski return eq(key, e.getKey()) && eq(value, e.getValue()); 78851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 78951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 79051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski /** 79151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * Returns the hash code value for this map entry. The hash code 79251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * of a map entry {@code e} is defined to be: <pre> 79351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * (e.getKey()==null ? 0 : e.getKey().hashCode()) ^ 79451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * (e.getValue()==null ? 0 : e.getValue().hashCode())</pre> 79551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * This ensures that {@code e1.equals(e2)} implies that 79651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * {@code e1.hashCode()==e2.hashCode()} for any two Entries 79751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * {@code e1} and {@code e2}, as required by the general 79851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * contract of {@link Object#hashCode}. 79951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * 80051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * @return the hash code value for this map entry 80151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * @see #equals 80251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski */ 80351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski public int hashCode() { 80451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski return (key == null ? 0 : key.hashCode()) ^ 80551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski (value == null ? 0 : value.hashCode()); 80651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 80751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 80851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski /** 80951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * Returns a String representation of this map entry. This 81051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * implementation returns the string representation of this 81151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * entry's key followed by the equals character ("<tt>=</tt>") 81251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * followed by the string representation of this entry's value. 81351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * 81451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * @return a String representation of this map entry 81551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski */ 81651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski public String toString() { 81751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski return key + "=" + value; 81851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 81951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 82051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 82151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 82251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski} 823