JAVA-初步认识-常用对象API(集合框架-哈希表1)

 一.

到底什么是哈希表?哈希是一种算法,这种算法它会算出来很多的值,这些值都存储起来叫做哈希表。这个表有什么特点,它有对应关系。

哈希表里面全是数组,最终存储完是以它为主的,只是哈希这种算法对数组进行了优化。演示一下,

上图是一个数组,里面是数组元素。如果想要对数组中的元素进行查询,应该怎么查?它牛就牛在它是一个连续的空间。查询起来比较快,

真要查一元素,还是要挨个去比。数组搜获,我想知道元素的位置,就是在遍历数组,拿来判断,还是比较慢。有人说不是还有折半么?

折半是有前提的。哈希这种算法就把查找给优化了,哈希这种性能是非常稳定和高效的。

以前是按着角标把数据存进来了,查询的时候就是挨个进行比较。现在该另外一种方式了。

首先,有一个元素,什么都可以,数值或者字符串....现在以字符串"ab"为例子,按理说直接往0角标放就可以了,可是这种查找起来就比较慢。

怎么来提高效率呢?我在存的时候,就根据存的元素的特点,来确定它在数组中的位置,(不一定存储在0角标了),数据往哪里存放,有说法。

我们根据元素自身的特点,来获取其数组中的位置。

怎么算出ab的位置呢?定义一个方法或者说函数,你把元素给我,方法体里面是一个算法,计算出位置。给我元素,我算出位置给你。

这种方式的好处是什么?如果你想查找ab在数组中的位置,我就不需要遍历了,直接拿这个ab再用一次算法,拿着这个位置再去数组中去找,是不是ab。

(由于是根据元素自身的特点来算出其存储的位置,这就要限制元素之间必须是不相同的)

整个过程的核心在于算法,这个算法就是所谓的哈希算法。

每个对象都有哈希值(这里说的对象是被存储的元素),因为它们都是object的子类,而object的方法中就有hashcode方法,只要用对象调用这个方法,就能获取哈希值。这个方法走了底层了,是windows实现的。

咱自己对象的方法可以自己写,也就是覆盖,可以建立我们对象自身的哈希值。

看着,如果我们确定存储的是字符串。字符串是由字符组成的,字符都有对应的数字

算法有很多种,最常见的就是取余。通过一个算法得到的值都很大,加减乘除运算出来的结果很多很大。值很大不怕,只要一取余就行了。

什么叫取余?

现在有九个格子,如果想把元素放到格子中来,必须在9角标之内。只要模以数组的长度,结果都在规定之内,无论这个数多大。

(会不会出现,不同的数模出来相同的余数呢?)这个时候,ab就有自己的位置,这个位置是根据谁算出来的?是根据算法算出来的,是根据ab的自身特点算出来的。

这种存储方式的好处就在查找起来非常迅速,就是两步走,计算和判断,跳出了一个一个不断比较的过程。这个表里面是不能有重复的,意味查询靠的就是唯一性。

如果已经添加了ab,现在还想再添加ab怎么办呢?第二次再存储ab时,先计算得到相应的位置,然后去相应位置上进行判断,如果已存的元素和现存的元素一样,那就不存。已经有了,干嘛还要存,存进来就将我覆盖掉了,把我覆盖掉,再存进来,这样操作是没有意义的。

哈希算法的出现提高了效率,但是它有弊端,就是不能重复。

 

posted @ 2018-01-17 10:07  前锋营  阅读(187)  评论(0编辑  收藏  举报