hashcode

3.3 不正确的 equals()hashCode()实现java

在定义新类时,一个很是常见的疏忽是不为 equals()hashCode()方法编写适当的重写方法。this

HashSetHashMap 在许多操做中使用这些方法,若是它们没有被正确覆盖,那么它们可能成为潜在的内存泄漏问题的来源。spa

让咱们以一个简单的 Person 类为例, 并将其用做 HashMap中的键 :code

public class Person {    
 public String name;  
 public Person(String name)
{        
   this.name = name;    
}
}
@Test
public void givenMap_whenEqualsAndHashCodeNotOverridden_thenMemoryLeak() {
   Map<Person, Integer> map = new HashMap<>();
   for (int i = 0; i < 100; i++) {
       map.put(new OrderVO(), i);
  }
   Assert.assertFalse(map.size() == 1);
}
@Test
public void givenMap_whenEqualsAndHashCodeNotOverridden_thenMemoryLeak() {
   Map<OrderVO, Integer> map = new HashMap<>();
   for (int i = 0; i < 100; i++) {
       map.put(new OrderVO(), i);
  }
   Assert.assertTrue(map.size() == 1);
}

在这种状况下,下面的断言将会是true:对象

让咱们看一下正确的实现了 equals()hashCode()Person类:blog

可是,**若是咱们正确地重写了 equals()hashCode()方法,那么在这个 Map中只会存在一个 Person对象。内存

可是因为咱们没有定义正确的equals()方法,重复的对象会堆积并增长内存,这就是咱们在内存中看到多个对象的缘由。VisualVM中的堆内存以下所示:hash

这里咱们使用Person做为关键。因为 Map不容许重复键,所以咱们做为键插入的众多重复 Person对象不该增长内存。class

 

请记住,Map不能包含重复的键:内存泄漏

如今咱们将重复的Person对象插入到使用此键的Map中。

相关文章
相关标签/搜索