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中。

相關文章
相關標籤/搜索