### Question:
AbstractNameValueExpression implements NameValueExpression<T> { @Override public int hashCode() { int result = (isCaseSensitiveName() ? this.name.hashCode() : this.name.toLowerCase().hashCode()); result = 31 * result + (this.value != null ? this.value.hashCode() : 0); result = 31 * result + (this.negated ? 1 : 0); return result; } AbstractNameValueExpression(String expression); @Override String getName(); @Override T getValue(); @Override boolean isNegated(); final boolean match(HttpRequest request); @Override boolean equals(Object other); @Override int hashCode(); @Override String toString();  }### Answer:
@Test public void testEqualsAndHashCode() { Assert.assertEquals(createExpression("a"), createExpression("a")); Assert.assertEquals(createExpression("a").hashCode(), createExpression("a").hashCode()); Assert.assertEquals(createExpression("a=1"), createExpression("a = 1 ")); Assert.assertEquals(createExpression("a=1").hashCode(), createExpression("a = 1 ").hashCode()); Assert.assertNotEquals(createExpression("a"), createExpression("b")); Assert.assertNotEquals(createExpression("a").hashCode(), createExpression("b").hashCode()); }