| /* |
| * Licensed to the Apache Software Foundation (ASF) under one or more |
| * contributor license agreements. See the NOTICE file distributed with |
| * this work for additional information regarding copyright ownership. |
| * The ASF licenses this file to You under the Apache License, Version 2.0 |
| * (the "License"); you may not use this file except in compliance with |
| * the License. You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, software |
| * distributed under the License is distributed on an "AS IS" BASIS, |
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| * See the License for the specific language governing permissions and |
| * limitations under the License. |
| */ |
| |
| package java.util; |
| |
| /** |
| * An AbstractSet is an abstract implementation of the Set interface. This |
| * implementation does not support adding. A subclass must implement the |
| * abstract methods iterator() and size(). |
| * |
| * @since 1.2 |
| */ |
| public abstract class AbstractSet<E> extends AbstractCollection<E> implements |
| Set<E> { |
| |
| /** |
| * Constructs a new instance of this AbstractSet. |
| */ |
| protected AbstractSet() { |
| } |
| |
| /** |
| * Compares the specified object to this Set and returns true if they are |
| * equal. The object must be an instance of Set and contain the same |
| * objects. |
| * |
| * @param object |
| * the object to compare with this set. |
| * @return {@code true} if the specified object is equal to this set, |
| * {@code false} otherwise |
| * @see #hashCode |
| */ |
| @Override |
| public boolean equals(Object object) { |
| if (this == object) { |
| return true; |
| } |
| if (object instanceof Set) { |
| Set<?> s = (Set<?>) object; |
| |
| try { |
| return size() == s.size() && containsAll(s); |
| } catch (NullPointerException ignored) { |
| return false; |
| } catch (ClassCastException ignored) { |
| return false; |
| } |
| } |
| return false; |
| } |
| |
| /** |
| * Returns the hash code for this set. Two set which are equal must return |
| * the same value. This implementation calculates the hash code by adding |
| * each element's hash code. |
| * |
| * @return the hash code of this set. |
| * @see #equals |
| */ |
| @Override |
| public int hashCode() { |
| int result = 0; |
| Iterator<?> it = iterator(); |
| while (it.hasNext()) { |
| Object next = it.next(); |
| result += next == null ? 0 : next.hashCode(); |
| } |
| return result; |
| } |
| |
| /** |
| * Removes all occurrences in this collection which are contained in the |
| * specified collection. |
| * |
| * @param collection |
| * the collection of objects to remove. |
| * @return {@code true} if this collection was modified, {@code false} |
| * otherwise. |
| * @throws UnsupportedOperationException |
| * if removing from this collection is not supported. |
| */ |
| @Override |
| public boolean removeAll(Collection<?> collection) { |
| boolean result = false; |
| if (size() <= collection.size()) { |
| Iterator<?> it = iterator(); |
| while (it.hasNext()) { |
| if (collection.contains(it.next())) { |
| it.remove(); |
| result = true; |
| } |
| } |
| } else { |
| Iterator<?> it = collection.iterator(); |
| while (it.hasNext()) { |
| result = remove(it.next()) || result; |
| } |
| } |
| return result; |
| } |
| } |