package class8_3_HashSet_start; import java.util.Collection; import java.util.Iterator; import java.util.LinkedList; import java.util.Set; public class HashSet implements Set { public static void main(String[] args) { String bob = "Bob"; System.out.println("bob: "+bob.hashCode()); } public static final int CAPACITY = 10; private LinkedList[] table = (LinkedList[]) new LinkedList[CAPACITY]; /** * Returns the number of elements in this set (its cardinality). If this * set contains more than {@code Integer.MAX_VALUE} elements, returns * {@code Integer.MAX_VALUE}. * * @return the number of elements in this set (its cardinality) */ @Override public int size() { return 0; } /** * Returns {@code true} if this set contains no elements. * * @return {@code true} if this set contains no elements */ @Override public boolean isEmpty() { return false; } /** * Returns {@code true} if this set contains the specified element. * More formally, returns {@code true} if and only if this set * contains an element {@code e} such that * {@code Objects.equals(o, e)}. * * @param o element whose presence in this set is to be tested * @return {@code true} if this set contains the specified element * @throws ClassCastException if the type of the specified element * is incompatible with this set * (optional) * @throws NullPointerException if the specified element is null and this * set does not permit null elements * (optional) */ @Override public boolean contains(Object o) { return false; } /** * Returns an iterator over the elements in this set. The elements are * returned in no particular order (unless this set is an instance of some * class that provides a guarantee). * * @return an iterator over the elements in this set */ @Override public Iterator iterator() { return null; } /** * Returns an array containing all of the elements in this set. * If this set makes any guarantees as to what order its elements * are returned by its iterator, this method must return the * elements in the same order. * *

The returned array will be "safe" in that no references to it * are maintained by this set. (In other words, this method must * allocate a new array even if this set is backed by an array). * The caller is thus free to modify the returned array. * *

This method acts as bridge between array-based and collection-based * APIs. * * @return an array containing all the elements in this set */ @Override public Object[] toArray() { return new Object[0]; } /** * Returns an array containing all of the elements in this set; the * runtime type of the returned array is that of the specified array. * If the set fits in the specified array, it is returned therein. * Otherwise, a new array is allocated with the runtime type of the * specified array and the size of this set. * *

If this set fits in the specified array with room to spare * (i.e., the array has more elements than this set), the element in * the array immediately following the end of the set is set to * {@code null}. (This is useful in determining the length of this * set only if the caller knows that this set does not contain * any null elements.) * *

If this set makes any guarantees as to what order its elements * are returned by its iterator, this method must return the elements * in the same order. * *

Like the {@link #toArray()} method, this method acts as bridge between * array-based and collection-based APIs. Further, this method allows * precise control over the runtime type of the output array, and may, * under certain circumstances, be used to save allocation costs. * *

Suppose {@code x} is a set known to contain only strings. * The following code can be used to dump the set into a newly allocated * array of {@code String}: * *

     *     String[] y = x.toArray(new String[0]);
*

* Note that {@code toArray(new Object[0])} is identical in function to * {@code toArray()}. * * @param a the array into which the elements of this set are to be * stored, if it is big enough; otherwise, a new array of the same * runtime type is allocated for this purpose. * @return an array containing all the elements in this set * @throws ArrayStoreException if the runtime type of the specified array * is not a supertype of the runtime type of every element in this * set * @throws NullPointerException if the specified array is null */ @Override public T[] toArray(T[] a) { return null; } /** * Adds the specified element to this set if it is not already present * (optional operation). More formally, adds the specified element * {@code e} to this set if the set contains no element {@code e2} * such that * {@code Objects.equals(e, e2)}. * If this set already contains the element, the call leaves the set * unchanged and returns {@code false}. In combination with the * restriction on constructors, this ensures that sets never contain * duplicate elements. * *

The stipulation above does not imply that sets must accept all * elements; sets may refuse to add any particular element, including * {@code null}, and throw an exception, as described in the * specification for {@link Collection#add Collection.add}. * Individual set implementations should clearly document any * restrictions on the elements that they may contain. * * @param e element to be added to this set * @return {@code true} if this set did not already contain the specified * element * @throws UnsupportedOperationException if the {@code add} operation * is not supported by this set * @throws ClassCastException if the class of the specified element * prevents it from being added to this set * @throws NullPointerException if the specified element is null and this * set does not permit null elements * @throws IllegalArgumentException if some property of the specified element * prevents it from being added to this set */ @Override public boolean add(E e) { int hash = e.hashCode(); int index = Math.floorMod(hash,table.length); if(table[index] == null) { table[index] = new LinkedList<>(); } LinkedList entries = table[index]; // WARNING! POTENTIAL BUG! if(!entries.contains(e)) { entries.add(e); return true; // WARNING! POTENTIAL BUG! } else { return false; } } /** * Removes the specified element from this set if it is present * (optional operation). More formally, removes an element {@code e} * such that * {@code Objects.equals(o, e)}, if * this set contains such an element. Returns {@code true} if this set * contained the element (or equivalently, if this set changed as a * result of the call). (This set will not contain the element once the * call returns.) * * @param o object to be removed from this set, if present * @return {@code true} if this set contained the specified element * @throws ClassCastException if the type of the specified element * is incompatible with this set * (optional) * @throws NullPointerException if the specified element is null and this * set does not permit null elements * (optional) * @throws UnsupportedOperationException if the {@code remove} operation * is not supported by this set */ @Override public boolean remove(Object o) { return false; } /** * Returns {@code true} if this set contains all of the elements of the * specified collection. If the specified collection is also a set, this * method returns {@code true} if it is a subset of this set. * * @param c collection to be checked for containment in this set * @return {@code true} if this set contains all of the elements of the * specified collection * @throws ClassCastException if the types of one or more elements * in the specified collection are incompatible with this * set * (optional) * @throws NullPointerException if the specified collection contains one * or more null elements and this set does not permit null * elements * (optional), * or if the specified collection is null * @see #contains(Object) */ @Override public boolean containsAll(Collection c) { return false; } /** * Adds all of the elements in the specified collection to this set if * they're not already present (optional operation). If the specified * collection is also a set, the {@code addAll} operation effectively * modifies this set so that its value is the union of the two * sets. The behavior of this operation is undefined if the specified * collection is modified while the operation is in progress. * * @param c collection containing elements to be added to this set * @return {@code true} if this set changed as a result of the call * @throws UnsupportedOperationException if the {@code addAll} operation * is not supported by this set * @throws ClassCastException if the class of an element of the * specified collection prevents it from being added to this set * @throws NullPointerException if the specified collection contains one * or more null elements and this set does not permit null * elements, or if the specified collection is null * @throws IllegalArgumentException if some property of an element of the * specified collection prevents it from being added to this set * @see #add(Object) */ @Override public boolean addAll(Collection c) { return false; } /** * Retains only the elements in this set that are contained in the * specified collection (optional operation). In other words, removes * from this set all of its elements that are not contained in the * specified collection. If the specified collection is also a set, this * operation effectively modifies this set so that its value is the * intersection of the two sets. * * @param c collection containing elements to be retained in this set * @return {@code true} if this set changed as a result of the call * @throws UnsupportedOperationException if the {@code retainAll} operation * is not supported by this set * @throws ClassCastException if the class of an element of this set * is incompatible with the specified collection * (optional) * @throws NullPointerException if this set contains a null element and the * specified collection does not permit null elements * (optional), * or if the specified collection is null * @see #remove(Object) */ @Override public boolean retainAll(Collection c) { return false; } /** * Removes from this set all of its elements that are contained in the * specified collection (optional operation). If the specified * collection is also a set, this operation effectively modifies this * set so that its value is the asymmetric set difference of * the two sets. * * @param c collection containing elements to be removed from this set * @return {@code true} if this set changed as a result of the call * @throws UnsupportedOperationException if the {@code removeAll} operation * is not supported by this set * @throws ClassCastException if the class of an element of this set * is incompatible with the specified collection * (optional) * @throws NullPointerException if this set contains a null element and the * specified collection does not permit null elements * (optional), * or if the specified collection is null * @see #remove(Object) * @see #contains(Object) */ @Override public boolean removeAll(Collection c) { return false; } /** * Removes all of the elements from this set (optional operation). * The set will be empty after this call returns. * * @throws UnsupportedOperationException if the {@code clear} method * is not supported by this set */ @Override public void clear() { } }