title: equals - symmetric contract in java seems to be giving issue
body: <p>I'm testing the symmetric contract of object Equals method mentioned in the Effective Java 2nd Edition Book.</p>
  
  <blockquote>
    <p>Symmetric: For any non-null reference values x and y, x.equals(y) must return
    true if and only if y.equals(x) returns true.</p>
  </blockquote>
  
  <p>Can you explain me - why <code>list.contains(s)</code> still returns false in the below code.   </p>
  
  <pre><code>public final class CaseInsensitiveString {
      private final String s;
  
      public CaseInsensitiveString(String s) {
          if (s == null)
              throw new NullPointerException();
          this.s = s;
      }
  
      // Broken - violates symmetry!
      /*
       * @Override public boolean equals(Object o) {
       *  if (o instanceof  CaseInsensitiveString)
       *   return s.equalsIgnoreCase(((CaseInsensitiveString) o).s); 
       *   if (o instanceof String) // One-way  interoperability
       *    return s.equalsIgnoreCase((String) o); return false; 
       *    }
       */
  
      @Override
      public boolean equals(Object o) {
          return o instanceof CaseInsensitiveString
                  &amp;&amp; ((CaseInsensitiveString) o).s.equalsIgnoreCase(s);
      }
  
      public int hashcode() {
          return 0;
      }
  
      public static void main(String[] args) {
  
          CaseInsensitiveString cis = new CaseInsensitiveString("Polish");
          String s = "polish";
          // System.out.println(cis.equals(s));
          // System.out.println(s.equals(cis));
          List&lt;CaseInsensitiveString&gt; list = new ArrayList&lt;CaseInsensitiveString&gt;();
          list.add(cis);
          System.out.println(list.contains(s));
      }
  
  }
  </code></pre>