关于Hash集合以及Java中的内存泄漏

 

<学习笔记>关于Hash集合以及Java中的内存泄漏

标签: 学习笔记内存泄露hash
 分类:

Hash集合主要有HashMap、HashTable以及HashSet,前两者的区别在于HashMap允许null值且unsynchronized,而最后一个为Set。Hash集合的特点在于其通过哈希算法在内存中存储以及检索元素。这么做的目的在于将分配给该集合的内存区域划分为若干份(bucket),然后通过hashCode方法为每一个集合元素获取一个哈希码,根据哈希码将元素存储于特定的内存区域,在检索时也可以根据检索对象的哈希码,先确定所在区域,之后遍历查找,从而提升效率。HashMap的构造方法中的参数有两个,一个为initial capacity,一个为load factor。

几个需要注意的小问题:

1)哈希集合的元素一旦添加后,一般不要更改集合元素中的参与了hashCode方法计算的字段的值,否则,哈希码值会发生变化,从而导致无法检索到原对象,会引起内存泄漏(MemoryLeak);

2)哈希集合中的contains/remove/put(或add)等方法底层都依赖于equals方法;

3)equals与hashcode的关系:两个对象a1.equals(a2)==true则必能推出a1.hashCode()==a2.hashCode(),而反之则不一定,比如String对象“BB"与"Aa"二者的哈希码都是2112,但二者明显不相等;

4)关于内存泄漏:

1、概念:用动态存储分配函数开辟的内存空间在使用完毕后未释放,一直占据内存空间直至程序结束。动态分配存储地址是堆heap内存常用的内存分配方式。

2、Java中有垃圾回收器机制(Garbage Collection)会及时回收内存空间,不必程序员手动处理,简化了编程工作,减轻了程序员的操作难度,但同时也增加了程序运行的时间,因为GC需要一直监视某个对象在程序中的状态,以决定是否回收。GC的回收策略也有多种,可以根据情况选择,比如内存使用到达某个量值后开始回收,定时回收,平缓回收等等。

 
 
posted @ 2016-08-19 16:32  wwfy  阅读(655)  评论(0编辑  收藏  举报