`

String.hashcode()的算法规则

    博客分类:
  • JAVA
 
阅读更多

在java中每一个对象都会有一个hashcode 例如:object,Map,List,String等,如果两个对象,字符串,map所对应的value调用equals()相等  那个比较双方的hashcode一定相等,反之hashcode相等的不一定两个比较值相等,这就是所谓的hash冲突,具体可看map中的实现, String对象的hashcode生成的规则是

 

我们创建一个JunitCase 类名为 TestHashcodeCase来测试

 

public class TestHashcodeCase {

	@Test
	public void testGetOrginHashcode(){
		String test = "Test";
		System.out.println(" 调用原生的 String生成方法" + test.hashCode());
	}

}
   
输出结果是:2603186
   

 

     

String类中的hashcode源码

    public int hashCode() {
	int h = hash;
        int len = count;
	if (h == 0 && len > 0) {
	    int off = offset;
	    char val[] = value;

            for (int i = 0; i < len; i++) {
                h = 31*h + val[off++];
            }
            hash = h;
        }
        return h;
    }
 

 

那源码中的计算规则,我们通过几个示例来说明

 

 

@Test
public void testGetHashcodeByCharArray(){
      String test = "Test";
      System.out.println(" 调用原生的 String生成方法" + testGetHashcodeByCharArray(test));
}

public int testGetHashcodeByCharArray(String str) {
	 int h = 0;
	 int len = str.length();
	 int hash = 0;
		if (h == 0 && len > 0) {
		    int off = 0;
		    char[] val = str.toCharArray();
	         for (int i = 0; i < len; i++) {
	             h = 31*h + val[off++];
	          }
	         hash = h;
	     }
	 return h;
}
 

 

    

代码: h = 31*h + val[off++];  是把val[off++]转换成ASCII来做的计算,如何转换请参考上一篇介绍

 

    我们以一种更明显的方式来说明:

   

@Test
public void getHashcodeByIntArray(){
      String test = "Test";
      System.out.println(" 调用原生的 String生成方法" + getHashcodeByIntArray(test));
	}

   public int getHashcodeByIntArray(String str) {
		int h = 0;
		int len = str.length();
		int hash = 0;
		if (h == 0 && len > 0) {
		    int off = 0;
		    int val[] = strToAscii(str) ;
		        for (int i = 0; i < len; i++) {
		            h = 31*h + val[off++];
		         }
		        hash = h;
		    }
		    return h;
   }

   private  int[]  strToAscii(String str){
 		char[] chars = str.toCharArray();
 		
 		int[] ascillCode = new int[chars.length];
  		
 		for(int i=0;i<chars.length;i++){
			System.out.println(""+chars[i]+" = " + (int)chars[i]);
		ascillCode[i] = (int)chars[i];
	}
	return ascillCode;
}


代码: int val[] = strToAscii(str)调用的方式把字节转换为ASCII的数组
转换代码为 : ascillCode[i] = (int)chars[i];

 

输出的结果都是:2603186

 

总结:算法规则是:h = 31*h + value;  也就是h每次的每次得到的结果作为下一次的参数代入

四次迭代结果分解如下:
 h = 31*h + value;
            //第一遍迭代
            value = 84;
            h = 31*0+84;
            h = 84;
            //第二遍迭代
            value = 101;
            h = 31*84+101;
            h = 2705;
            //第三遍迭代
            value = 115;
            h = 31*2705+115;
            h = 83970;
            //第四遍迭代
            value = 116;
            h = 31*83970+116;
            h=2603186;
得到的结果与我们预期的一致

 

    

话说每个string变量或者对象都有hashcode,这个hashcode用来做啥作用的呢?是否与map中的hashcode的作用一样呢?我们带着问题去找答案

 

 

 

 

   

 

 

分享到:
评论

相关推荐

    javascript中实现兼容JAVA的hashCode算法代码分享

    7. **代码兼容性**:实现兼容Java的hashCode算法意味着需要确保JavaScript中的实现能够在不同的运行环境中,无论是在浏览器还是服务器端JavaScript环境中,都能得到一致的输出结果。 8. **实际应用示例**:文件中的...

    HashMap模块源码—— 高效随机存取数据结构 ,文本索引必备

    哈希函数用的是java中String.hashCode()算法(经实际验证其碰撞率极低且相近的文本散列值相邻,存取的效率更高.)。可自动无限增加容量(内存允许)。3、连续10万次不同内容存取效率为,存10万次共耗时约280ms ,取10万次...

    java中的哈希算法和hashcode深入讲解1

    在String类中,哈希算法的实现主要体现在hashCode()方法中。hashCode()方法的源代码如下所示: ```java public int hashCode() { int h = hash; if (h == 0) { int off = offset; char val[] = value; int len...

    Java17道面试题及答案

    String z = new String("string"); System.out.println(x==y);//true System.out.println(x==z);//false System.out.println(x.equals(y));//true System.out.println(x.equals(z));//true 代码解读:因为 x 和 y ...

    hashcode和equals的分析

    在Java中,`hashCode`方法实现的就是这样的哈希算法。 #### 1.2 `hashCode`方法的实际应用 当向`Set`集合添加元素时,首先会调用元素的`hashCode`方法。根据返回的哈希码值,Java能够快速定位元素应该存放的位置。...

    java 中HashCode重复的可能性

    Java 中HashCode重复的可能性 Java 中的 HashCode 重复可能性是 Java 开发中一个常见的问题。 HashCode 是 Java 中一个重要的概念,它用于标识对象的唯一性。然而,Hash Code 有可能重复,这会导致程序出错。下面...

    易语言-HashMap模块源码—— 高效随机存取数据结构 ,文本索引必备

    哈希函数用的是java中String.hashCode()算法(经实际验证其碰撞率极低且相近的文本散列值相邻,存取的效率更高.) 可自动无限增加容量(内存允许) 3、连续10万次不同内容存取效率为,存10万次共耗时约280ms ,取10万次共...

    hashcode与eqault比较

    3. **考虑效率**:在实现`hashCode`时,应该尽可能地让不同的对象生成不同的哈希码,但同时也需要考虑算法的效率。 综上所述,正确理解和使用`equals`和`hashCode`方法对于编写高质量的Java程序至关重要。通过对这...

    银联订单号永远不会重复的生成算法分析与示例

    return String.format("%04d", machineId) + UUID.randomUUID().toString().hashCode(); } ``` 这里,`%04d`用于在machineId前补零,使其始终为4位数字。 为了测试和验证这些算法,可以创建一个数据库表,将订单...

    文件打散算法

    其中,“文件打散算法”是一种常用的策略,用于将文件按照特定规则分布存储到不同的物理路径下,从而达到负载均衡、提高访问速度的目的。 #### 二、算法原理 本篇文章主要介绍了一种基于位运算的文件打散算法。该...

    数据结构与算法1

    如果自定义类重写了equals(),为了保持一致性,通常也需要重写hashcode(),以确保符合哈希表的规则。 总结,了解和熟练掌握数据结构如Map及其遍历方式,以及字符串处理类的性能特点,以及equals()和hashcode()的...

    几种简单的负载均衡算法及java实现1

    int hash = clientIp.hashCode(); String server = null; for (String ip : IpMap.serverWeightMap.keySet()) { if (hash % IpMap.serverWeightMap.size() == IpMap.serverWeightMap.get(ip)) { server = ip; ...

    重写equals方法

    这是因为哈希算法需要使用 hashCode 方法来计算对象的哈希值,而 equals 方法用于判断两个对象是否相等。 如何重写 equals 方法? ------------------------- 重写 equals 方法需要遵循以下规则: 1. 参数类型和...

    用Java语言实现RSA加密算法

    BigInteger temp_val = BigInteger.valueOf(temp_str.hashCode()); BigInteger temp_val0 = temp_val.modPow(BigInteger.valueOf(pub_key), BigInteger.valueOf(M)); result[i] = temp_val0.toString(); } ...

    深入理解Java中HashCode方法

    同时,Java还提供了一些工具类和方法来帮助开发者实现hashCode方法,例如,Guava库中的Hashing类,它提供了多种hashCode算法,例如,MD5、SHA-1等。 Java中的hashCode方法是非常重要的,它直接影响着对象的比较和...

    hashcode使用方法

    2. **性能考虑**:应尽可能减少碰撞(不同的对象具有相同的哈希码),同时保持算法简单,以提高效率。 3. **与equals方法一致性**:如果两个对象通过 `equals` 方法被认为是相等的,那么它们的 `hashCode` 方法必须...

    数据结构(Java语言描述) 案例13 学生成绩排名.docx

    3. **实现排序算法**:可以采用多种排序算法实现上述功能,如冒泡排序、直接选择排序、直接插入排序、希尔排序和快速排序等。 #### 4. 算法实现 ##### 4.1 学生类的定义 ```java public class Student implements ...

    Java memcache缓存实现for Windows.docx

    - `setHashingAlg(int alg)`: 设置哈希算法,`alg=0`使用JDK默认的`String.hashCode()`,但可能会与其他客户端不兼容,建议选择其他算法。 - `setCompressEnable(boolean compressEnable)`: 启用或禁用数据压缩,...

    Object类和Scanner类

    - 哈希码值是由哈希算法计算得出的一个整数值,与对象的实际内存地址相关联但不等同于内存地址。 - 在Java中,两个不同的对象即使具有相同的逻辑内容也可能有不同的哈希码值。 - 示例代码展示了如何获取两个不同 ...

Global site tag (gtag.js) - Google Analytics