hashcode存在的作用和价值

研究思路

      hashcode是解决方案,任何解决方案都是为了解决某个特定场景下的特定问题,找到其对应的场景中的问题后,hashcode的价值便显而易见,甚至还可以找到多种能够替代hashcode的其它解决方案

作用场景:

       java语言支持四种类型的数据:接口(interface)、类(class)、数组(array)和基本类型(primitive);

      若是每种类型的数据均单个使用,那么没有任何问题需要解决;但若是需要处理一堆某种类型的数据,便需要使用容器装这些数据,并通过对容器的增删改查来逐一处理这些数据。

       java中的容器可以分为线性表示的集合(如list)和非线性表示的集合(如HashSet、HashMap和HashTable等基于散列的集合)两大类;若是线性集合,存放在集合中的元素是否重复无关紧要;若是非线性集合,则要求存放其中的元素不能重复。要保证元素不重复,就得将新添加得元素跟已添加得元素集进行逐一对比,对比手段便是使用该元素的equals方法。若是集合很小,该对比工作开销不大没什么问题;但是若集合很大,越到后面,新增一个元素需要对比的次数就非常多(比如集合已有10000个元素,再新增一个元素需要进行10000次对比),新增元素的性能将会逐步下降。有没有什么解决方案能够减少新增元素的对比次数呢?当然有,但是只能减少,很难做到完全杜绝对比

解决方案:

       要确保新增元素唯一,无论是调用equals方法,还是使用其它解决方法,总之是需要跟已存在的所有元素进行对比才行。唯一能够降低对比成本的地方就是将每次对比的开销降到最低。

       hashcode给出了一种解决方法,思路是尽可能地为每个元素生成一个不重复的int值(只是尽可能不重复,重复率越低效果越好),然后维护一个table表存放集合中所有元素的hashcode值,当新增元素时,先获得该元素的hashcode值,再到存放hashcode值的表中检查是否存在,若不存在,则确定是需要新增的元素,不再进行equals比较;若是存在,并不能说明该元素已存在,因为不同元素的hashcode值是有可能相同的,那么再进行equals比较。

       提高效率的点就在于将所有类型的元素比较全部转换成int类型的比较,显然开销降低很多,因为有些元素比如很复杂的类型,占用的内存和equals比较的内容会很多。提升效率的关键决定点就在于生成的散列值重复率要低,因为若两个元素hashcode值不一样,一定不相等(生成hashcode的方法必须保证满足这一点),但是两个hashcode值相等,却不能肯定两个元素就一定相等,需要通过equals进行二次比较确认。若是hashcode值重复率很高,反而会降低新增元素的性能,因为先进性hashcode值比较后发现一样,还得按最初的方式进行equals比较,反而工作量增加了。

你可能感兴趣的:(java编程思想)