码迷,mamicode.com
首页 > 其他好文 > 详细

hashcode

时间:2019-07-02 12:08:00      阅读:115      评论:0      收藏:0      [点我收藏+]

标签:model   exp   增加   this   nmap   dha   block   equals   方法   

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

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

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

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

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类:

但是,**如果我们正确地重写了 equals()hashCode()方法,那么在这个 Map中只会存在一个 Person对象。

但是由于我们没有定义正确的equals()方法,重复的对象会堆积并增加内存,这就是我们在内存中看到多个对象的原因。VisualVM中的堆内存如下所示:技术图片

这里我们使用Person作为关键。由于 Map不允许重复键,因此我们作为键插入的众多重复 Person对象不应增加内存。

 

请记住,Map不能包含重复的键:

现在我们将重复的Person对象插入到使用此键的Map中。

hashcode

标签:model   exp   增加   this   nmap   dha   block   equals   方法   

原文地址:https://www.cnblogs.com/bnbqian/p/11119749.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!