在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的作用一样呢?我们带着问题去找答案
相关推荐
7. **代码兼容性**:实现兼容Java的hashCode算法意味着需要确保JavaScript中的实现能够在不同的运行环境中,无论是在浏览器还是服务器端JavaScript环境中,都能得到一致的输出结果。 8. **实际应用示例**:文件中的...
哈希函数用的是java中String.hashCode()算法(经实际验证其碰撞率极低且相近的文本散列值相邻,存取的效率更高.)。可自动无限增加容量(内存允许)。3、连续10万次不同内容存取效率为,存10万次共耗时约280ms ,取10万次...
在String类中,哈希算法的实现主要体现在hashCode()方法中。hashCode()方法的源代码如下所示: ```java public int hashCode() { int h = hash; if (h == 0) { int off = offset; char val[] = value; int len...
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 ...
在Java中,`hashCode`方法实现的就是这样的哈希算法。 #### 1.2 `hashCode`方法的实际应用 当向`Set`集合添加元素时,首先会调用元素的`hashCode`方法。根据返回的哈希码值,Java能够快速定位元素应该存放的位置。...
Java 中HashCode重复的可能性 Java 中的 HashCode 重复可能性是 Java 开发中一个常见的问题。 HashCode 是 Java 中一个重要的概念,它用于标识对象的唯一性。然而,Hash Code 有可能重复,这会导致程序出错。下面...
哈希函数用的是java中String.hashCode()算法(经实际验证其碰撞率极低且相近的文本散列值相邻,存取的效率更高.) 可自动无限增加容量(内存允许) 3、连续10万次不同内容存取效率为,存10万次共耗时约280ms ,取10万次共...
3. **考虑效率**:在实现`hashCode`时,应该尽可能地让不同的对象生成不同的哈希码,但同时也需要考虑算法的效率。 综上所述,正确理解和使用`equals`和`hashCode`方法对于编写高质量的Java程序至关重要。通过对这...
return String.format("%04d", machineId) + UUID.randomUUID().toString().hashCode(); } ``` 这里,`%04d`用于在machineId前补零,使其始终为4位数字。 为了测试和验证这些算法,可以创建一个数据库表,将订单...
其中,“文件打散算法”是一种常用的策略,用于将文件按照特定规则分布存储到不同的物理路径下,从而达到负载均衡、提高访问速度的目的。 #### 二、算法原理 本篇文章主要介绍了一种基于位运算的文件打散算法。该...
如果自定义类重写了equals(),为了保持一致性,通常也需要重写hashcode(),以确保符合哈希表的规则。 总结,了解和熟练掌握数据结构如Map及其遍历方式,以及字符串处理类的性能特点,以及equals()和hashcode()的...
int hash = clientIp.hashCode(); String server = null; for (String ip : IpMap.serverWeightMap.keySet()) { if (hash % IpMap.serverWeightMap.size() == IpMap.serverWeightMap.get(ip)) { server = ip; ...
这是因为哈希算法需要使用 hashCode 方法来计算对象的哈希值,而 equals 方法用于判断两个对象是否相等。 如何重写 equals 方法? ------------------------- 重写 equals 方法需要遵循以下规则: 1. 参数类型和...
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方法,例如,Guava库中的Hashing类,它提供了多种hashCode算法,例如,MD5、SHA-1等。 Java中的hashCode方法是非常重要的,它直接影响着对象的比较和...
2. **性能考虑**:应尽可能减少碰撞(不同的对象具有相同的哈希码),同时保持算法简单,以提高效率。 3. **与equals方法一致性**:如果两个对象通过 `equals` 方法被认为是相等的,那么它们的 `hashCode` 方法必须...
3. **实现排序算法**:可以采用多种排序算法实现上述功能,如冒泡排序、直接选择排序、直接插入排序、希尔排序和快速排序等。 #### 4. 算法实现 ##### 4.1 学生类的定义 ```java public class Student implements ...
- `setHashingAlg(int alg)`: 设置哈希算法,`alg=0`使用JDK默认的`String.hashCode()`,但可能会与其他客户端不兼容,建议选择其他算法。 - `setCompressEnable(boolean compressEnable)`: 启用或禁用数据压缩,...
- 哈希码值是由哈希算法计算得出的一个整数值,与对象的实际内存地址相关联但不等同于内存地址。 - 在Java中,两个不同的对象即使具有相同的逻辑内容也可能有不同的哈希码值。 - 示例代码展示了如何获取两个不同 ...