What is string hashcode in java

What is string hashcode in java

День добрый, уважаемые дамы и господа знатоки. Есть вопрос прикладного характера. В начале объясняется, что прежде сравнения нужно убедиться, что сравниваются объекты одного класса. Это логично и понятно. Соответствующая строка в коде дополняет сказанное. НО! Зачем тогда следующей строкой приводить проверяемый объект к классу объекта-эталона? Если мы и так знаем, что объекты одного класса, иначе до выполнения этой строки не дошло бы — метод прекращается после return, зачем ещё раз приводить их к одному классу? Выглядит дико и просто как пятое колесо. У велосипеда. @Override public boolean equals(Object o) < if (getClass() != o.getClass()) return false; Man man = (Man) o; // Вот это что?? Зачем. return dnaCode == man.dnaCode; >

 @Override public boolean equals(Object o) < if (this == o) return true; if (o == null || getClass() != o.getClass()) return false; LuxuryAuto that = (LuxuryAuto) o; // а может добавить еще одну проверку ? if (this.hashCode() != o.hashCode()) return false; // например такую ? // тогда псевдо одинаковые обьекты будут не равны при не равных хешах if (manufactureYear != that.manufactureYear) return false; return dollarPrice == that.dollarPrice; >@Override public int hashCode()

последний пример вводит в тупик. При сравнении через equals, сначала проверяются hashCode’ы, если они не равны, то сравнение через equals не последует. В нашем примере как раз таки это и происходит. Как equals показал true, если хэши у них разные и до метода equals код не должен был дойти и сразу дать false?? Теперь поговорим о методе hashCode(). Зачем он нужен? Ровно для той же цели — сравнения объектов. Но ведь у нас уже есть equals()! Зачем же еще один метод? Ответ прост: для повышения производительности. Хэш-функция, которая представлена в Java методом hashCode(), возвращает числовое значение фиксированной длины для любого объекта. В случае с Java метод hashCode() возвращает для любого объекта 32-битное число типа int. Сравнить два числа между собой — гораздо быстрее, чем сравнить два объекта методом equals(), особенно если в нем используется много полей. Если в нашей программе будут сравниваться объекты, гораздо проще сделать это по хэш-коду, и только если они равны по hashCode() — переходить к сравнению по equals().

Читайте также:  Count seconds in python

Источник

Java String hashCode() – What’s the Use?

Java String hashCode() method returns the integer hash code value of this string. String class overrides this method from Object class.

How Does Java Calculates String Hash Code?

The string hash code calculation follows the below logic.

int hashcode = s[0]*31^(n-1) + s[1]*31^(n-2) + . + s[n-1];
  • Here s[i] is the character at i th index.
  • ^ indicates exponentiation
  • n is the length of the string.

The hash code of an empty string is 0.

Java String hashCode() Examples

Let’s have a look at some examples of String hashCode() method.

package net.javastring.strings; public class JavaStringHashCode < public static void main(String[] args) < String s1 = "Java"; String s2 = "Java"; String s3 = new String("Java"); System.out.println(s1.hashCode()); System.out.println(s2.hashCode()); System.out.println(s3.hashCode()); System.out.println("".hashCode()); >>

Java String HashCode Example

Java String hashCode() and equals() Contract

  • If equals() is true for two strings, their hashCode() will be the same.
  • If two strings hashCode() is equal, it doesn’t mean they are equal.

The first statement will always be true because string characters are used to calculate the hash code. You can confirm this from the above java program too.

Let’s look at some code snippets to confirm the second statement.

String a = "Siblings"; String b = "Teheran"; System.out.println(a.hashCode()); System.out.println(b.hashCode()); System.out.println(a.hashCode() == b.hashCode()); System.out.println(a.equals(b));

Here is the output when the above code snippet is executed in JShell.

Java String HashCode And Equals Contract

Java String hashcode Collision

When two strings have the same hashcode, it’s called a hashcode collision. There are many instances where the hash code collision will happen. For example, “Aa” and “BB” have the same hash code value 2112.

Conclusion

We shouldn’t rely on the hashCode() method to check if two strings are equal. String class overrides this function from Object class. It’s used by Java internally when String is used as Map key for get() and put() operations.

References:

Источник

Оцените статью