HashSet的储存方式以及内存泄露的原因
来源:互联网 发布:飞思卡尔k60单片机 编辑:程序博客网 时间:2024/06/05 11:16
1.HashSet
在单链表集合框架中,有两大体系,一个是Set,一个是List,简单来说一个是线性的一个是非线性的
1.1 LinkedList,ArrayList,HashSet
ArrayList:集合的升级版(顺序表)
从上面可以看到我们初始化一个ArrayList对象就会包装一个长度为10的Object的数组
LinkedList :链式表
这上面我们可以看出来这个是通过内部类封装Node,以及通过泛型来实现保存对象
ArrayList我们去查找已经保存的对象根据索引查找会特别快,而LinkedList由于是链式结构,只能保存下一个和上一个的信息,所以查找会相对比较慢,但是ArrayList的删除和增加会特别慢,由于删除或则增加一个对象会影响后面所有对象的位置,而LinkedList进行删除或者增加只会影响他前面和后面的对象
HashSet:简单来说就是顺表表(数组)加上链式表
而它的具体功能的实现是靠着HashMap的实现
1.2HashSet到底怎么储存
HashSet它进行储存对象时,先根据对象的hash值来确定它的位置区域,然后通过equals去和相同hash值的对象去比较,如果为true则不进行储存,如果是false,则进行链式储存,为什么要这样来进行储存呢?由于HashSet储存的是不同的对象,假设已经有了1000个对象,再添加一个对象,我们需要比较一千次,极为麻烦,我们可以直接的通过hash值和equals来比较是否对象满足我们相同的条件
上面可以看到bean1和bean4对象不同但是他们的hash值和equals所以没有储存进去,他的删除方式也是一样,先根据hash值去找相应的区域,再比较equals
1.3内存的泄露问题
当我们已经把对象储存到hashSet对象后,如果我们改变属性值(这个属性值影响hash值),导致我们在hashSet对象找不到相应的对象最后导致内存溢出,因为对象无法被清理(有对应的指针)。
因为改变了属性找不到对应的hash值,而确定不了对象的位置
阅读全文
3 0
- HashSet的储存方式以及内存泄露的原因
- ArrayList与HashSet的比较,以及HashCode分析, 内存泄露
- 内存泄露的原因
- 内存泄露的原因
- 内存泄露的原因
- 内存泄露的原因
- 内存泄露的原因
- Eclipse Memory Analyzer以及内存泄露的原因
- Android 产生内存泄露的原因以及解决办法
- java内存泄露的原因
- android内存泄露的原因
- android内存泄露的原因
- 软件内存泄露的原因
- Android内存泄露的原因
- Java内存泄露的原因
- Android内存泄露的原因
- Android内存泄露的原因
- Andriod内存泄露的原因
- EL表达式、标签
- CCF 分蛋糕 20170301
- PullToRefreshLayout
- java程序员的大数据之路(5):HDFS压缩与解压缩
- Oracle 存储过程
- HashSet的储存方式以及内存泄露的原因
- android的m、mm、mmm编译命令的使用
- Hive之 hive的三种使用方式(CLI、HWI、Thrift)
- Visualizing what ConvNets learn
- web.xml 配置中classpath: 与classpath*:的区别
- Struts2获得表单数据
- poj_2406_kmp_入门_精华操作_解释
- 数据结构上机2
- Bootstrap 栅格系统分析