【变量】: 程序向系统申请一块内存区域存储特定数据类型,这个区域就是变量
【变量名】:是变量所在内存区域的标识符,变量有自己的内存地址为了方便开发者使用变量而引入变量名作为内存地址的别称
A hash function is any function that can be used to map data of arbitrary size to fixed-size values. 【The values returned by a hash function are called hash values, hash codes】, digests, or simply hashes. The values are usually used to index a fixed-size table called a hash table. Use of a hash function to index a hash table is called hashing or scatter storage addressing. --- 维基百科
哈希码(HashCode)是将【任意数据】通过【哈希算法】转换成【固定大小、不规则的值】.
HashCode是用于查找使用的,而equals是用于比较两个对象是否相等的
=====> 通过利用哈希码和哈希表可以迅速查找目标数据。
Java中hashCode方法主要作用是配合基于散列集合一起正常运行,eg: HashSet、Hashtable以及HashMap
当向集合中插入对象时,判别集合中是否已经有该对象了?(set是无序、不可重复)
假设集合中有1000个元素,现在添加1个元素:
为了保证集合无重复元素,需要将每个元素与新添加的元素比较,在1000次equals方法之后,如果新添加的元素
和集合中的元素没有重复值则直接将元素添加到集合中且在哈希表中但equals()方法的代价太大,可以通过哈希表和哈希码减少equals()方法的调用。
在Java中每创建一个对象就会根据这个对象通过哈希算法生成哈希码并与该对象在内存开辟的空间地址组合为【key(哈希码):value(持有该哈希码的内存地址)】放入哈希表中。
拉链法:对于hash冲突在这个Hash key的地方产生一个链表,将所有产生相同HashCode的对象放到这个单链表上去,串在一起。
String s01; // 在栈内存中声明一个名称为s01的引用变量可以执行任何String类型的堆内存
String s02 = "Hello World";
[String s02 = "Hello World"]在编译器,JVM会主动到常量池中查找是否存在存在"Hello World"如果存在直接返回该区域的内存地址,否则在常量池中放入"Hello World";
String s03 = new String("Hello World");
[String s03 = "Hello World"]在编译期,JVM会主动到常量池中查找是否存在"Hello World"如果存在直接在堆内存空间开辟内存放入"Hello World"并引用非常量池中的内存空间否则需要在创建堆内存上的
内容之后再常量池中再创建"Hello World"
[intern()]-> 无论String是通过字面量创建还是通过new创建最终都要引用字符串常量池中的数据
参考:https://blog.csdn.net/SEU_Calvin/article/details/52094115
原文:https://www.cnblogs.com/openmind-ink/p/14716230.html