`

String类中的hashCode()分析

    博客分类:
  • JAVA
 
阅读更多

hashCode()这个方法是Object中定义的,因此,不管Java中的每个类都会显示或者隐含的调用hashCode。本文将从以下几个方面对hashCode进行阐述。

  • 什么是hashcode?
  • JDK中String类中的hashCode的详细定义;
  • 简单阐述一下为什么hashCode的系数为31;

 

  1. 什么是hashcode?

    维基百科的定义:In the Java programming language, every class implicitly or explicitly provides a hashCode() method, which digests the data stored in an instance of the class into a single hash value (a 32-bit signed integer). This hash is used by other code when storing or manipulating the instance – the values are intended to be evenly distributed for varied inputs in order to use in clustering. This property is important to the performance of hash tables and other data structures that store objects in groups ("buckets") based on their computed hash values.

    hashcode其实就是对象存在内存中的一个索引,指示对象应该存在哪个位置,根据这个位置可以取出这个对象,但是它必须要减少冲突,并且在存储和操作的时候尽可能高效。

 

     2. JDK中String类中的hashCode的详细定义

 

     

 /** The value is used for character storage. */
    private final char value[];

    /** The offset is the first index of the storage that is used. */
    private final int offset;

    /** The count is the number of characters in the String. */
    private final int count;

    /** Cache the hash code for the string */
    private int hash; // Default to 0

 

/**
     * Returns a hash code for this string. The hash code for a
     * <code>String</code> object is computed as
     * <blockquote><pre>
     * s[0]*31^(n-1) + s[1]*31^(n-2) + ... + s[n-1]
     * </pre></blockquote>
     * using <code>int</code> arithmetic, where <code>s[i]</code> is the
     * <i>i</i>th character of the string, <code>n</code> is the length of
     * the string, and <code>^</code> indicates exponentiation.
     * (The hash value of the empty string is zero.)
     *
     * @return  a hash code value for this object.
     */
    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;
    }

 String类覆盖了Object类中的hashCode方法,从代码的注释中可以看得出,一个String的对象的hashCode值的计算方法为:s[0]*31^(n-1) + s[1]*31^(n-2) + ... + s[n-1]。其中,s[i]表示是第i个字符,n是字符串的长度。这里是取字符的ASC2码的值进行计算的。

 

    3.为什么hashCode的系数为31?

       前面介绍过hashcode是为了存储和操作的时候更高效,hash算法有个通用的毛病就是会冲突,为了让冲突的概率更低,研究表明,使用素数作为系统,他们冲突的概率会比使用合数的冲突的概率低得多。至于为什么选择31而不是别的素数,我就无从得知啦。

分享到:
评论

相关推荐

    java中的String类常用方法解析(一)

    在Java编程语言中,`String`类是使用最频繁的类之一,它代表不可变的字符序列。本文将深入解析`String`类的一些常用方法,帮助开发者更好地理解和使用这个核心类。 1. **构造方法** - `String()`:创建一个空字符...

    关于String类的一些方法

    在Java编程语言中,`String`类是使用最频繁的类之一,它代表不可变的字符序列。在本文中,我们将深入探讨`String`类的一些关键方法,这些方法在日常编程中极为常用,有助于字符串的处理和操作。 1. **构造方法**: ...

    hashcode和equals的分析

    ### hashCode和equals方法详解 ...通过以上分析,我们可以看到`hashCode`和`equals`方法在Java中扮演着非常重要的角色,尤其是在集合框架中。正确地实现这两个方法可以大大提高程序的性能和可维护性。

    Java String对象的经典问题

    2. **使用equals()方法**:`String`类重写了`Object`类中的`equals()`方法,使其能够比较两个`String`对象的内容是否相同,而不是它们的引用。这意味着即使两个`String`对象在不同的位置存储,只要它们的内容相同,`...

    hashcode与eqault比较

    在Java编程语言中,`hashCode`和`equals`方法是非常重要的概念,它们在处理对象的比较、存储以及检索时扮演着关键角色。本文将深入探讨这两个方法之间的区别,并通过具体例子来说明它们的重要性。 #### 一、`equals...

    java源码分析

    从给定的文件片段中,我们可以提取出关于Java中Object类和String类的源码分析的知识点。 首先,Object类是Java中所有类的根类。它包含了所有对象共有的方法,是所有类继承结构的最顶层。从文件片段中我们可以看到...

    set接口经常用的hashCode和equals方法详解

    例如,在`String`类中,`equals`方法是比较字符串的内容而非引用。 - **性能考虑**: 为了提高性能,只有当两个对象的`hashCode`相同的情况下,才会调用`equals`方法进行深度比较。 - **一致性要求**: `equals`方法...

    String方法使用方法例子续--android

    在Android开发中,String类是Java语言中的核心类,...在`TestString2`这个测试文件中,可能包含了对上述方法的实际运用和测试,通过分析和运行这些例子,开发者能够更深入地理解和掌握`String`类的用法,提高编程能力。

    hashcode使用方法

    在Java编程语言中,`hashCode` 方法是对象类 `Object` 的一部分,用于生成一个整数,通常用作基于哈希的数据结构(如哈希表)中的索引。为了确保数据结构的高效性,正确地重写 `hashCode` 方法至关重要。 #### 基本...

    String_raw-源码.rar

    10. **字符串的哈希值**:`String`类重写了`Object`的`hashCode()`方法,返回一个整数值,代表该字符串的唯一标识,通常用于散列数据结构(如HashMap)。 通过分析`String_raw-源码.zip`文件中的源代码,开发者可以...

    java String详解

    Java中的`String`类是编程中非常基础且重要的部分,它代表不可变的字符序列。在Java中,字符串被广泛用于各种操作,如拼接、比较、搜索、格式化等。`String`类位于`java.lang`包中,是所有Java程序的默认组成部分,...

    Java String对象使用方法详解

    Java String对象使用方法详解是Java编程中一个非常重要的知识点,了解String对象的使用方法可以帮助开发者更好地编写Java程序。在Java中,String对象是不可变的,它的值一旦创建便不能改变。下面我们来详细地解释...

    3160104734_沈子衿_homework31

    String类的实现涉及到许多底层机制和与其他数据结构的交互,这次作业我们将深入分析其源码,特别是String、StringBuffer和StringBuilder的特性。 首先,让我们关注String类的外部引用。String类引用了多个Java核心...

    java源码解读由浅入深.pdf

    接下来,我们将具体分析`String`类的内部实现。 #### 三、String类的内部结构 在JDK 1.8版本中,`String`类的内部主要包含两个成员变量: 1. **`value`**:这是一个`char`类型的数组,用于存储字符串的实际内容。 ...

    java面试题经典讲解2023年最新题目分析.docx

    10. HashMap什么样的类适合作为键String最为常见,因为String对象不可变,且重写了equals和hashcode方法。不可变性是必要的,如果key的hashcode存入和获取是不一致,就无法找到。获取对象时需要用到equals和hashCode...

    Android知识体系梳理(4)-Java基础篇-Object方法分析,String的深度解析,String Pool分析,与StringBuilder、StringBuffer的对比

    本篇文章将重点关注Java的基础部分,特别是Object类中的方法以及String类的深入解析。 首先,Object类是所有Java类的基类,它定义了一些基础方法,如`equals()`、`hashCode()`、`clone()`和`toString()`。`equals()...

    JAVA基本类源代码

    这个压缩包“基本类源代码”很可能包含了Java语言中的一些基础类的源文件,例如`Object`类、`String`类、`Integer`类、`ArrayList`类等。这些类在Java开发中非常常见,深入理解它们的源代码对于提升编程技能和优化...

    Findbugs缺陷等级对照表.pdf

    * 43B:类中定义了 hashCode() 方法,但是没有重写 java.lang.Object 中的 hashCode() 方法 * 44C:类中定义了 tostring() 方法,但是没有重写 java.lang.Object 中的 tostring() 方法 * 45C:某些方法名只有大小写...

    java代码缺陷自动分析工具之FindBugs介绍.pdf

    FindBugs 可以检测 equals() 和 hashCode() 方法的实现相关问题,这两个方法非常重要,因为几乎所有基于集合的类(如 List、Map、Set 等)都调用它们。 2. 检测忽略方法返回值 FindBugs 可以检测代码中忽略了不应该...

    Java 33道面试题及答案.docx

    而 equals 默认情况下是引用比较,只是很多类重新了 equals 方法,比如 String、Integer 等把它变成了值比较,所以一般情况下 equals 比较的是值是否相等。 hashCode() 和 equals() 的关系 -----------------------...

Global site tag (gtag.js) - Google Analytics