济南网站建设哪家公司好,无屏蔽搜索引擎,如何做电商运营,哈铁工程建设公司网站HashMap对于Java开发人员来说#xff0c;应该是一种非常非常熟悉的数据结构了#xff0c;应用场景相当广泛。 本文重点不在于介绍如何使用HashMap#xff0c;而是关注在使用HashMap过程中#xff0c;可能会导致内存泄露的情况#xff0c;下面将以示例的形式展开具体介绍。… HashMap对于Java开发人员来说应该是一种非常非常熟悉的数据结构了应用场景相当广泛。 本文重点不在于介绍如何使用HashMap而是关注在使用HashMap过程中可能会导致内存泄露的情况下面将以示例的形式展开具体介绍。 为了更快的看到java.lang.OutOfMemoryError我们可以配置下IDEA的JVM参数简单配置下初始堆和最大堆参数为5M-Xms5m -Xmx5m如下图 不重写hashcode、equals
public class Test1 {public static void main(String[] args) {MapPeople, Integer map new HashMapPeople, Integer(1000);int count 0;while (true){People p new People(zhangsan,10);map.put(p,1);count;if (count % 1000 0){System.out.println(map size: map.size());System.out.println(运行count次后可用内存剩余Runtime.getRuntime().freeMemory()/(1024*1024)MB);}}}
}
class People{private String name;private Integer age;public People(String name, Integer age) {this.name name;this.age age;}Overridepublic String toString() {return People{ name name \ , age age };}
} 结果分析Object 的 hashcode 方法是本地方法也就是用 c 或 c 实现的该方法直接返回对象的内存地址让后再转换整数每次new的对象地址都不一样就导致对象越来越多最终触发OutOfMemoryError。 建议:当想要使用对象作为HashMap的key时可以考虑使用不可变对象作为HashMap的key比如常用的String类型或者确保使用不可变的成员属性来生成hashcode
HashMap中数据在数组中的存放位置是取决于Key对象的 hashCode() 方法的。一个对象的hashCode() 方法的值一般来说都是和对象的内容相关的。那么如果Key对象的成员取值变化了它的hashCode() 基本上也会变化。在存放进去的时候和取出数值的时候都是依赖Key 对象的hashCode计算的。 为什么重写equals还要重写hashcode方法 可以参考这篇文章 https://donglin.blog.csdn.net/article/details/129018073