title: Java Hash Table Search Function
body: <p>I have a hash table created but I seem to be stuck on one problem. I have data in the hash table and when searching for the data it returns as expected. However, if I search for something that is not in the table but still hashes out to an element that is present, it does not return false. </p>
  
  <p>For example: I have Hello as a key in my hash table, lets say element 15. I then do a search for World and it hashes the same as Hello, just for example. </p>
  
  <p>What I expect my code to do is return null because even though the key's hashed the same, they are not equal. But my code below, will return the key/data (record) for Hello instead. </p>
  
  <pre><code> @SuppressWarnings("rawtypes")
  public Record search(T k) {
      int i = hash(k);//Assign the computed hash value (combination of Record Class hashCode and Table's hash function above) to i.
      if (a[i] == null || a[i].record.equals(k)) { 
          return null; 
      } else if (!a[i].record.equals(i) &amp;&amp; a[i].record.getKey() != k) {//otherwise, the record is found and if the key stored does not equal the key being searched return null
          return a[i].record;
      } else { //otherwise the record is not the first record in the linked list
          cursor = a[i]; //set cursor to equal the entire list of records sorted a the hash key reference
          if (cursor.record.getKey() != k) { //if the key at cursor.record does not equal key (k), then move onto the cursor.next
              return cursor.next.record;
          }
      }
      return null;
  }
  </code></pre>
  
  <p>Record class</p>
  
  <pre><code>public class Record&lt;T, U&gt; {
  
  private T key;//Contacts name, and the value that is ultimately hashed. It is then inserted, searched and deleted
  private U data;//This data is the Contacts address, when the key is hashed, nothing is done to this value except that it is 
  //either stored or retrieved from the hash table when the key is used
  
  public T getKey() {
      return key;//returns the value stored as a key
  }
  
  public void setKey(T k) {
      this.key = k;//used during the insert operation to set key's value.
  }
  
  public U getData(T k) {//retrieve the data that is stored with an associated key that has been updated, searhed or is being written to a file
      return data;
  }
  
  public void setData(U data) {//adds the data to the records data element
      this.data = data;
  }
  
  public int hashCode(T k) {//When this hash code function is called, it returns a mathematical representation of the key, that was passed to it
      //it returns the absolute value of the generic hashCode() function. Further computations are required in the Table class, since the hash created here
      //can be very large and would throw and exception.  For example, the hash for "Chris" after this computation has been performed is 94639767, which is
      //much larger than our array. So this will cause an IndexOutOfBoundsException().
      return Math.abs(k.hashCode());
  }
  
  public boolean equals(Record&lt;T, U&gt; r) {
      //this equals method, doesn't override the generic equals() method provided by Java. Instead, this method is created to use instead of the generic
      //equals method. When this is called, the has value computed above, with the additional math from the Table class, is compared to all of the elements
      //in the array. If a match is found, this returns true
      return key.equals(r.key);
  }
  }
  </code></pre>