HashSet的储存方式以及内存泄露的原因

1.HashSet

单链表集合框架中,有两大体系,一个是Set,一个是List,简单来说一个是线性的一个是非线性的

1.1 LinkedList,ArrayList,HashSet

ArrayList:集合的升级版(顺序表)

HashSet的储存方式以及内存泄露的原因
从上面可以看到我们初始化一个ArrayList对象就会包装一个长度为10的Object的数组
LinkedList :链式表HashSet的储存方式以及内存泄露的原因
这上面我们可以看出来这个是通过内部类封装Node,以及通过泛型来实现保存对象
ArrayList我们去查找已经保存的对象根据索引查找会特别快,而LinkedList由于是链式结构,只能保存下一个和上一个的信息,所以查找会相对比较慢,但是ArrayList的删除和增加会特别慢,由于删除或则增加一个对象会影响后面所有对象的位置,而LinkedList进行删除或者增加只会影响他前面和后面的对象
HashSet:简单来说就是顺表表(数组)加上链式表
HashSet的储存方式以及内存泄露的原因
而它的具体功能的实现是靠着HashMap的实现

1.2HashSet到底怎么储存

HashSet它进行储存对象时,先根据对象的hash值来确定它的位置区域,然后通过equals去和相同hash值的对象去比较,如果为true则不进行储存,如果是false,则进行链式储存,为什么要这样来进行储存呢?由于HashSet储存的是不同的对象,假设已经有了1000个对象,再添加一个对象,我们需要比较一千次,极为麻烦,我们可以直接的通过hash值和equals来比较是否对象满足我们相同的条件HashSet的储存方式以及内存泄露的原因
HashSet的储存方式以及内存泄露的原因

上面可以看到bean1和bean4对象不同但是他们的hash值和equals所以没有储存进去,他的删除方式也是一样,先根据hash值去找相应的区域,再比较equals

HashSet的储存方式以及内存泄露的原因

1.3内存的泄露问题


当我们已经把对象储存到hashSet对象后,如果我们改变属性值(这个属性值影响hash值),导致我们在hashSet对象找不到相应的对象最后导致内存溢出,因为对象无法被清理(有对应的指针)。HashSet的储存方式以及内存泄露的原因
因为改变了属性找不到对应的hash值,而确定不了对象的位置