 <p>First of all <code>equals()</code> should determine whether two objects are <em>logically equal</em>. If these objects are logically equal when their <code>str1</code> fields are equal then you may go with equals and use methods defined for the collections. In this case <code>equals()</code> contract (defined in the java.lang.Object) is worth reading.</p> <p>If I were working with your code I would prefer if you solve your problem with iteration instead of defining incorrect <code>equals()</code> method (Warning: not tested code):</p> <pre><code>Set&lt;String&gt; strings = new HashSet&lt;String&gt;(listOne.size()); for(Test t : listOne){ strings.add(t.getStr1()); } Iterator&lt;Test&gt; it = listTwo.iterator(); while(it.hasNext()){ Test t = it.next(); if(strings.contains(t.getStr1()) it.remove(); } </code></pre>