Source Code Cross Referenced for HashSet.java in  » 6.0-JDK-Core » Collections-Jar-Zip-Logging-regex » java » util » Java Source Code / Java DocumentationJava Source Code and Java Documentation

Home
Java Source Code / Java Documentation
1.6.0 JDK Core
2.6.0 JDK Modules
3.6.0 JDK Modules com.sun
4.6.0 JDK Modules com.sun.java
5.6.0 JDK Modules sun
6.6.0 JDK Platform
7.Ajax
8.Apache Harmony Java SE
9.Aspect oriented
10.Authentication Authorization
11.Blogger System
12.Build
13.Byte Code
14.Cache
15.Chart
16.Chat
17.Code Analyzer
18.Collaboration
19.Content Management System
20.Database Client
21.Database DBMS
22.Database JDBC Connection Pool
23.Database ORM
24.Development
25.EJB Server
26.ERP CRM Financial
27.ESB
28.Forum
29.Game
30.GIS
31.Graphic 3D
32.Graphic Library
33.Groupware
34.HTML Parser
35.IDE
36.IDE Eclipse
37.IDE Netbeans
38.Installer
39.Internationalization Localization
40.Inversion of Control
41.Issue Tracking
42.J2EE
43.J2ME
44.JBoss
45.JMS
46.JMX
47.Library
48.Mail Clients
49.Music
50.Net
51.Parser
52.PDF
53.Portal
54.Profiler
55.Project Management
56.Report
57.RSS RDF
58.Rule Engine
59.Science
60.Scripting
61.Search Engine
62.Security
63.Sevlet Container
64.Source Control
65.Swing Library
66.Template Engine
67.Test Coverage
68.Testing
69.UML
70.Web Crawler
71.Web Framework
72.Web Mail
73.Web Server
74.Web Services
75.Web Services apache cxf 2.2.6
76.Web Services AXIS2
77.Wiki Engine
78.Workflow Engines
79.XML
80.XML UI
Java Source Code / Java Documentation » 6.0 JDK Core » Collections Jar Zip Logging regex » java.util 
Source Cross Referenced  Class Diagram Java Document (Java Doc) 


001        /*
002         * Copyright 1997-2006 Sun Microsystems, Inc.  All Rights Reserved.
003         * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
004         *
005         * This code is free software; you can redistribute it and/or modify it
006         * under the terms of the GNU General Public License version 2 only, as
007         * published by the Free Software Foundation.  Sun designates this
008         * particular file as subject to the "Classpath" exception as provided
009         * by Sun in the LICENSE file that accompanied this code.
010         *
011         * This code is distributed in the hope that it will be useful, but WITHOUT
012         * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
013         * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
014         * version 2 for more details (a copy is included in the LICENSE file that
015         * accompanied this code).
016         *
017         * You should have received a copy of the GNU General Public License version
018         * 2 along with this work; if not, write to the Free Software Foundation,
019         * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
020         *
021         * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
022         * CA 95054 USA or visit www.sun.com if you need additional information or
023         * have any questions.
024         */
025
026        package java.util;
027
028        /**
029         * This class implements the <tt>Set</tt> interface, backed by a hash table
030         * (actually a <tt>HashMap</tt> instance).  It makes no guarantees as to the
031         * iteration order of the set; in particular, it does not guarantee that the
032         * order will remain constant over time.  This class permits the <tt>null</tt>
033         * element.
034         *
035         * <p>This class offers constant time performance for the basic operations
036         * (<tt>add</tt>, <tt>remove</tt>, <tt>contains</tt> and <tt>size</tt>),
037         * assuming the hash function disperses the elements properly among the
038         * buckets.  Iterating over this set requires time proportional to the sum of
039         * the <tt>HashSet</tt> instance's size (the number of elements) plus the
040         * "capacity" of the backing <tt>HashMap</tt> instance (the number of
041         * buckets).  Thus, it's very important not to set the initial capacity too
042         * high (or the load factor too low) if iteration performance is important.
043         *
044         * <p><strong>Note that this implementation is not synchronized.</strong>
045         * If multiple threads access a hash set concurrently, and at least one of
046         * the threads modifies the set, it <i>must</i> be synchronized externally.
047         * This is typically accomplished by synchronizing on some object that
048         * naturally encapsulates the set.
049         *
050         * If no such object exists, the set should be "wrapped" using the
051         * {@link Collections#synchronizedSet Collections.synchronizedSet}
052         * method.  This is best done at creation time, to prevent accidental
053         * unsynchronized access to the set:<pre>
054         *   Set s = Collections.synchronizedSet(new HashSet(...));</pre>
055         *
056         * <p>The iterators returned by this class's <tt>iterator</tt> method are
057         * <i>fail-fast</i>: if the set is modified at any time after the iterator is
058         * created, in any way except through the iterator's own <tt>remove</tt>
059         * method, the Iterator throws a {@link ConcurrentModificationException}.
060         * Thus, in the face of concurrent modification, the iterator fails quickly
061         * and cleanly, rather than risking arbitrary, non-deterministic behavior at
062         * an undetermined time in the future.
063         *
064         * <p>Note that the fail-fast behavior of an iterator cannot be guaranteed
065         * as it is, generally speaking, impossible to make any hard guarantees in the
066         * presence of unsynchronized concurrent modification.  Fail-fast iterators
067         * throw <tt>ConcurrentModificationException</tt> on a best-effort basis.
068         * Therefore, it would be wrong to write a program that depended on this
069         * exception for its correctness: <i>the fail-fast behavior of iterators
070         * should be used only to detect bugs.</i>
071         *
072         * <p>This class is a member of the
073         * <a href="{@docRoot}/../technotes/guides/collections/index.html">
074         * Java Collections Framework</a>.
075         *
076         * @param <E> the type of elements maintained by this set
077         *
078         * @author  Josh Bloch
079         * @author  Neal Gafter
080         * @version 1.43, 05/05/07
081         * @see	    Collection
082         * @see	    Set
083         * @see	    TreeSet
084         * @see	    HashMap
085         * @since   1.2
086         */
087
088        public class HashSet<E> extends AbstractSet<E> implements  Set<E>,
089                Cloneable, java.io.Serializable {
090            static final long serialVersionUID = -5024744406713321676L;
091
092            private transient HashMap<E, Object> map;
093
094            // Dummy value to associate with an Object in the backing Map
095            private static final Object PRESENT = new Object();
096
097            /**
098             * Constructs a new, empty set; the backing <tt>HashMap</tt> instance has
099             * default initial capacity (16) and load factor (0.75).
100             */
101            public HashSet() {
102                map = new HashMap<E, Object>();
103            }
104
105            /**
106             * Constructs a new set containing the elements in the specified
107             * collection.  The <tt>HashMap</tt> is created with default load factor
108             * (0.75) and an initial capacity sufficient to contain the elements in
109             * the specified collection.
110             *
111             * @param c the collection whose elements are to be placed into this set
112             * @throws NullPointerException if the specified collection is null
113             */
114            public HashSet(Collection<? extends E> c) {
115                map = new HashMap<E, Object>(Math.max(
116                        (int) (c.size() / .75f) + 1, 16));
117                addAll(c);
118            }
119
120            /**
121             * Constructs a new, empty set; the backing <tt>HashMap</tt> instance has
122             * the specified initial capacity and the specified load factor.
123             *
124             * @param      initialCapacity   the initial capacity of the hash map
125             * @param      loadFactor        the load factor of the hash map
126             * @throws     IllegalArgumentException if the initial capacity is less
127             *             than zero, or if the load factor is nonpositive
128             */
129            public HashSet(int initialCapacity, float loadFactor) {
130                map = new HashMap<E, Object>(initialCapacity, loadFactor);
131            }
132
133            /**
134             * Constructs a new, empty set; the backing <tt>HashMap</tt> instance has
135             * the specified initial capacity and default load factor (0.75).
136             *
137             * @param      initialCapacity   the initial capacity of the hash table
138             * @throws     IllegalArgumentException if the initial capacity is less
139             *             than zero
140             */
141            public HashSet(int initialCapacity) {
142                map = new HashMap<E, Object>(initialCapacity);
143            }
144
145            /**
146             * Constructs a new, empty linked hash set.  (This package private
147             * constructor is only used by LinkedHashSet.) The backing
148             * HashMap instance is a LinkedHashMap with the specified initial
149             * capacity and the specified load factor.
150             *
151             * @param      initialCapacity   the initial capacity of the hash map
152             * @param      loadFactor        the load factor of the hash map
153             * @param      dummy             ignored (distinguishes this
154             *             constructor from other int, float constructor.)
155             * @throws     IllegalArgumentException if the initial capacity is less
156             *             than zero, or if the load factor is nonpositive
157             */
158            HashSet(int initialCapacity, float loadFactor, boolean dummy) {
159                map = new LinkedHashMap<E, Object>(initialCapacity, loadFactor);
160            }
161
162            /**
163             * Returns an iterator over the elements in this set.  The elements
164             * are returned in no particular order.
165             *
166             * @return an Iterator over the elements in this set
167             * @see ConcurrentModificationException
168             */
169            public Iterator<E> iterator() {
170                return map.keySet().iterator();
171            }
172
173            /**
174             * Returns the number of elements in this set (its cardinality).
175             *
176             * @return the number of elements in this set (its cardinality)
177             */
178            public int size() {
179                return map.size();
180            }
181
182            /**
183             * Returns <tt>true</tt> if this set contains no elements.
184             *
185             * @return <tt>true</tt> if this set contains no elements
186             */
187            public boolean isEmpty() {
188                return map.isEmpty();
189            }
190
191            /**
192             * Returns <tt>true</tt> if this set contains the specified element.
193             * More formally, returns <tt>true</tt> if and only if this set
194             * contains an element <tt>e</tt> such that
195             * <tt>(o==null&nbsp;?&nbsp;e==null&nbsp;:&nbsp;o.equals(e))</tt>.
196             *
197             * @param o element whose presence in this set is to be tested
198             * @return <tt>true</tt> if this set contains the specified element
199             */
200            public boolean contains(Object o) {
201                return map.containsKey(o);
202            }
203
204            /**
205             * Adds the specified element to this set if it is not already present.
206             * More formally, adds the specified element <tt>e</tt> to this set if
207             * this set contains no element <tt>e2</tt> such that
208             * <tt>(e==null&nbsp;?&nbsp;e2==null&nbsp;:&nbsp;e.equals(e2))</tt>.
209             * If this set already contains the element, the call leaves the set
210             * unchanged and returns <tt>false</tt>.
211             *
212             * @param e element to be added to this set
213             * @return <tt>true</tt> if this set did not already contain the specified
214             * element
215             */
216            public boolean add(E e) {
217                return map.put(e, PRESENT) == null;
218            }
219
220            /**
221             * Removes the specified element from this set if it is present.
222             * More formally, removes an element <tt>e</tt> such that
223             * <tt>(o==null&nbsp;?&nbsp;e==null&nbsp;:&nbsp;o.equals(e))</tt>,
224             * if this set contains such an element.  Returns <tt>true</tt> if
225             * this set contained the element (or equivalently, if this set
226             * changed as a result of the call).  (This set will not contain the
227             * element once the call returns.)
228             *
229             * @param o object to be removed from this set, if present
230             * @return <tt>true</tt> if the set contained the specified element
231             */
232            public boolean remove(Object o) {
233                return map.remove(o) == PRESENT;
234            }
235
236            /**
237             * Removes all of the elements from this set.
238             * The set will be empty after this call returns.
239             */
240            public void clear() {
241                map.clear();
242            }
243
244            /**
245             * Returns a shallow copy of this <tt>HashSet</tt> instance: the elements
246             * themselves are not cloned.
247             *
248             * @return a shallow copy of this set
249             */
250            public Object clone() {
251                try {
252                    HashSet<E> newSet = (HashSet<E>) super .clone();
253                    newSet.map = (HashMap<E, Object>) map.clone();
254                    return newSet;
255                } catch (CloneNotSupportedException e) {
256                    throw new InternalError();
257                }
258            }
259
260            /**
261             * Save the state of this <tt>HashSet</tt> instance to a stream (that is,
262             * serialize it).
263             *
264             * @serialData The capacity of the backing <tt>HashMap</tt> instance
265             *		   (int), and its load factor (float) are emitted, followed by
266             *		   the size of the set (the number of elements it contains)
267             *		   (int), followed by all of its elements (each an Object) in
268             *             no particular order.
269             */
270            private void writeObject(java.io.ObjectOutputStream s)
271                    throws java.io.IOException {
272                // Write out any hidden serialization magic
273                s.defaultWriteObject();
274
275                // Write out HashMap capacity and load factor
276                s.writeInt(map.capacity());
277                s.writeFloat(map.loadFactor());
278
279                // Write out size
280                s.writeInt(map.size());
281
282                // Write out all elements in the proper order.
283                for (Iterator i = map.keySet().iterator(); i.hasNext();)
284                    s.writeObject(i.next());
285            }
286
287            /**
288             * Reconstitute the <tt>HashSet</tt> instance from a stream (that is,
289             * deserialize it).
290             */
291            private void readObject(java.io.ObjectInputStream s)
292                    throws java.io.IOException, ClassNotFoundException {
293                // Read in any hidden serialization magic
294                s.defaultReadObject();
295
296                // Read in HashMap capacity and load factor and create backing HashMap
297                int capacity = s.readInt();
298                float loadFactor = s.readFloat();
299                map = (((HashSet) this ) instanceof  LinkedHashSet ? new LinkedHashMap<E, Object>(
300                        capacity, loadFactor)
301                        : new HashMap<E, Object>(capacity, loadFactor));
302
303                // Read in size
304                int size = s.readInt();
305
306                // Read in all elements in the proper order.
307                for (int i = 0; i < size; i++) {
308                    E e = (E) s.readObject();
309                    map.put(e, PRESENT);
310                }
311            }
312        }
www.java2java.com | Contact Us
Copyright 2009 - 12 Demo Source and Support. All rights reserved.
All other trademarks are property of their respective owners.