黑马程序员—Java中涉及到的哈希存储知识
来源:互联网 发布:新浪股票财经数据接口 编辑:程序博客网 时间:2024/06/08 09:56
最近在论坛里发现好多人都在问hashCode()和内存地址之间的关系?HashMap和HashSet为什么效率很高?刚开始我因为学过数据结构,脑海里对哈希存储有些了解,老师讲的时候我就很轻松过去了,但是在回答问题的过程中我发现,真正表达出来真的不容易,我翻阅了以前的学过的数据结构,总结了好久。准备把自己理解的写下来
下面来一个数据结构中的哈希表存储的标准定义:
以线性表中的每个元素的某个数据项(最好是关键字)Key为自变量,使用一种事先选定的函数H(Key)计算出函数值,将该值解释为一块连续存储空间(如数组空间)的单元地址(如数组的下标),将数据元素存储到该单元中。
例如在a[10]中存入1,2,4,5,7值,哈希表会事先选定一个函数,假设该函数为H(Key)=key*3,即每个要存入的值先乘以3,然后将H(Key)的值再和数组大小求余,找到对应下标将Key存入。这个函数我们可以自己设置(不一定要乘以某个数,可以加入平方,立方,求余,怎么爽怎么来,目的是为了避免两个值对应同一个下标产生冲突),乘以300都没问题,因为和数组求余以后它的值和数组下标是对应的,这个函数值太大不会怎么怎么!
Java中HashCode()实现的就是上面怎么得到数组下标的过程,他返回的就是对应存储方式的单元地址(如数组下标)。
那么如果真的遇到冲突怎么办?(得到的数组下标一样。而且本来那块连续的存储空间就是有限的)
数据结构中提供了两种方法,开放地址法,链接法。Java中采用的就是链接法,用单链表存储,该数组下标中存入的是指向单链表的指针。如下图:
到此,哈希存储的具体原理知道了,可以看到它好像一本书有目录的书一样,在它里面查找时效率非常高,所以哈希法存储结构在数据结构中地位很高。这么牛逼Java中肯定有不少地方用!
---------------------- JavaEE+Android、Java培训、期待与您交流! ----------------------
详细请查看: http://edu.csdn.net
- 黑马程序员—Java中涉及到的哈希存储知识
- 《黑马程序员》String类涉及到的知识深化理解
- 黑马程序员—java入门的知识
- 黑马程序员——.NET中存储过程的好处
- 黑马程序员—Java编程知识GUI知识总结
- 关于android开发中涉及到的Java知识:面向对象(一)
- 关于android开发中涉及到的java知识:面向对象(二)
- 关于android开发中涉及到的java知识:面向对象(三)
- 关于android开发中涉及到的java知识:面向对象(四)
- 关于android开发中涉及到的java知识:面向对象(五)
- 关于android开发中涉及到的java知识:面向对象(六)
- 关于android开发中涉及到的java知识:面向对象(七)
- 关于android开发中涉及到的java知识:面向对象(八)
- 关于android开发中涉及到的java知识:集合类(一)
- 关于android开发中涉及到的java知识:集合类(二)
- 关于android开发中涉及到的java知识:集合类(三)
- 黑马程序员--java 知识回顾
- 黑马程序员-----------java语法知识
- 解决hibernate向mysql插入中文乱码问题
- Python文件操作
- 南阳理工ACM 162 Phone List
- GUI
- 30个能有效使用时间的方法。
- 黑马程序员—Java中涉及到的哈希存储知识
- 和我一起来学iOS(五)负责表现的CALayer
- JAVA入门书籍1(备查)
- hdu 1879 继续畅通工程 (并查集)
- 解决LR11录制不能打开IE8的问题
- TBBT的笑点
- WPF新手实践1:MVVM Light Toolkit(一、下载与安装)
- poj 2533
- makefile中的$@,$<,$^的意思