Каков хэш-код объекта, если хэш-код () не переопределяется?

Если хэш-код () метод не переопределяется, каков будет результат вызова хэш-кода () на каком-либо объекте в Java?

63
задан Peter O. 31 January 2013 в 00:39
поделиться

7 ответов

Обычно, hashCode() просто возвращает адрес объекта в памяти, если его не переопределить.

Из 1:

Насколько это практически осуществимо, метод hashCode, определенный классом Object, возвращает различные целые числа для различных объектов. (Обычно это реализуется путем преобразования внутреннего адреса объекта в целое число, но такая реализация не требуется языком программирования JavaTM).

35
ответ дан 24 November 2019 в 16:22
поделиться

Если хэш-код не переопределен, вы вызовете хэш-код объекта, вот выдержка из его javadoc:

Насколько это практически целесообразно, метод hashCode, определенный классом Object, действительно возвращает отдельные целые числа для отдельных объектов. (Обычно это реализуется путем преобразования внутреннего адреса объекта в целое число, но этот метод реализации не требуется для языка программирования JavaTM.)

3
ответ дан 24 November 2019 в 16:22
поделиться

Реализация hashCode () может отличаться от класса к классу, но контракт для hashCode () является очень специфичен и четко и ясно изложен в документации Javadocs :

Возвращает значение хэш-кода для объекта. Этот метод поддерживается хэш-таблицами, такими как предоставляемые java.util.Hashtable.

Общий контракт hashCode таков:

  • Каждый раз, когда он вызывается для одного и того же объекта более одного раза во время выполнения приложения Java, метод hashCode должен последовательно возвращать одно и то же целое число, при условии, что никакая информация не используется в равных сравнениях на объект изменен. Это целое число не обязательно должно оставаться согласованным от одного выполнения приложения к другому выполнению того же самого приложения.
  • Если два объекта равны согласно методу equals (Object), то вызов метода hashCode для каждого из двух объектов должен привести к одинаковому целочисленному результату.
  • Не требуется, чтобы, если два объекта не равны согласно равным (java.lang.Object), затем вызов метода hashCode для каждого из двух объектов должен давать различные целочисленные результаты. Однако программист должен знать, что получение различных целочисленных результатов для неравных объектов может улучшить производительность хэш-таблиц.

Насколько это разумно практично, метод hashCode, определенный классом Object, действительно возвращает отдельные целые числа для отдельных объектов. (Обычно это реализуется путем преобразования внутреннего адреса объекта в целое число, но этот метод реализации не требуется для языка программирования JavaTM.)

hashCode () тесно связан с equals () и если вы переопределите equals () , вы также должны переопределить hashCode () .

13
ответ дан 24 November 2019 в 16:22
поделиться

реализация хэш-кода по умолчанию дает внутренний адрес объекта в jvm в виде 32-битного целого числа. Таким образом, два разных (в памяти) объекта будут иметь разные хэш-коды.

Это согласуется с реализацией equals по умолчанию. Если вы хотите переопределить равенства для своих объектов, вам придется адаптировать hashCode, чтобы они были согласованными.

См. http://www.ibm.com/developerworks/java/library/j-jtp05273.html для хорошего обзора.

1
ответ дан 24 November 2019 в 16:22
поделиться

Вы должны попытаться реализовать хэш-код так, чтобы разные объекты давали разные результаты. Я не думаю, что есть стандартный способ сделать это.

Прочтите эту статью, чтобы получить некоторую информацию .

0
ответ дан 24 November 2019 в 16:22
поделиться

Хэшкод полезен для хранения объекта в коллекции, например, хэшсета. Позволяя объекту определить Hashcode как нечто уникальное, он позволяет алгоритму HashSet работать эффективно.

Объект сам использует адрес объекта в памяти, что очень уникально, но может быть не очень полезным, если два разных объекта (например, две одинаковые строки) должны считаться одинаковыми, даже если они дублируются в памяти.

0
ответ дан 24 November 2019 в 16:22
поделиться

Невозможно. Можно вернуть только базовый указатель к различным производным классам. Если это абсолютно, 100% нужно, можно использовать исключения как уродливый взлом, но это, очевидно, не рекомендуется вообще.

-121--2874460-

Был действительно хороший пост на Spring Blog от Keith Donald detailing howto Получить весну 3 Aritfacts с Maven , с комментариями, детализирующими, когда вам понадобится каждый из зависимых

<!-- Shared version number properties -->
<properties>
    <org.springframework.version>3.0.0.RELEASE</org.springframework.version>
</properties>
<!-- Core utilities used by other modules.
    Define this if you use Spring Utility APIs 
    (org.springframework.core.*/org.springframework.util.*)-->
<dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-core</artifactId>
    <version>${org.springframework.version}</version>
</dependency>
<!-- Expression Language (depends on spring-core)
    Define this if you use Spring Expression APIs 
    (org.springframework.expression.*)-->
<dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-expression</artifactId>
    <version>${org.springframework.version}</version>
</dependency>
<!-- Bean Factory and JavaBeans utilities (depends on spring-core)
    Define this if you use Spring Bean APIs 
    (org.springframework.beans.*)-->
<dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-beans</artifactId>
    <version>${org.springframework.version}</version>
</dependency>
<!-- Aspect Oriented Programming (AOP) Framework 
    (depends on spring-core, spring-beans)
    Define this if you use Spring AOP APIs 
    (org.springframework.aop.*)-->
<dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-aop</artifactId>
    <version>${org.springframework.version}</version>
</dependency>
<!-- Application Context 
    (depends on spring-core, spring-expression, spring-aop, spring-beans)
    This is the central artifact for Spring's Dependency Injection Container
    and is generally always defined-->
<dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-context</artifactId>
    <version>${org.springframework.version}</version>
</dependency>
<!-- Various Application Context utilities, including EhCache, JavaMail, Quartz, 
    and Freemarker integration
    Define this if you need any of these integrations-->
<dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-context-support</artifactId>
    <version>${org.springframework.version}</version>
</dependency>
<!-- Transaction Management Abstraction 
    (depends on spring-core, spring-beans, spring-aop, spring-context)
    Define this if you use Spring Transactions or DAO Exception Hierarchy
    (org.springframework.transaction.*/org.springframework.dao.*)-->
<dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-tx</artifactId>
    <version>${org.springframework.version}</version>
</dependency>
<!-- JDBC Data Access Library 
    (depends on spring-core, spring-beans, spring-context, spring-tx)
    Define this if you use Spring's JdbcTemplate API 
    (org.springframework.jdbc.*)-->
<dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-jdbc</artifactId>
    <version>${org.springframework.version}</version>
</dependency>
<!-- Object-to-Relation-Mapping (ORM) integration with Hibernate, JPA and iBatis.
    (depends on spring-core, spring-beans, spring-context, spring-tx)
    Define this if you need ORM (org.springframework.orm.*)-->
<dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-orm</artifactId>
    <version>${org.springframework.version}</version>
</dependency>
<!-- Object-to-XML Mapping (OXM) abstraction and integration with JAXB, JiBX, 
    Castor, XStream, and XML Beans.
    (depends on spring-core, spring-beans, spring-context)
    Define this if you need OXM (org.springframework.oxm.*)-->
<dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-oxm</artifactId>
    <version>${org.springframework.version}</version>
</dependency>
<!-- Web application development utilities applicable to both Servlet and 
    Portlet Environments 
    (depends on spring-core, spring-beans, spring-context)
    Define this if you use Spring MVC, or wish to use Struts, JSF, or another
    web framework with Spring (org.springframework.web.*)-->
<dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-web</artifactId>
    <version>${org.springframework.version}</version>
</dependency>
<!-- Spring MVC for Servlet Environments 
    (depends on spring-core, spring-beans, spring-context, spring-web)
    Define this if you use Spring MVC with a Servlet Container such as 
    Apache Tomcat (org.springframework.web.servlet.*)-->
<dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-webmvc</artifactId>
    <version>${org.springframework.version}</version>
</dependency>
<!-- Spring MVC for Portlet Environments 
    (depends on spring-core, spring-beans, spring-context, spring-web)
    Define this if you use Spring MVC with a Portlet Container 
    (org.springframework.web.portlet.*)-->
<dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-webmvc-portlet</artifactId>
    <version>${org.springframework.version}</version>
</dependency>
<!-- Support for testing Spring applications with tools such as JUnit and TestNG
    This artifact is generally always defined with a 'test' scope for the 
    integration testing framework and unit testing stubs-->
<dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-test</artifactId>
    <version>${org.springframework.version}</version>
    <scope>test</scope>
</dependency>
-121--691652-

Два объекта с разным хэш-кодом не должны быть равны по отношению к равным ()

a.hashCode ()! = b.hashCode () должны подразумевать ! a.equals (b)

Однако два объекта, которые не равны по отношению к Сохранение этих объектов в наборе или карте становится менее эффективным, если многие объекты имеют одинаковый хэш-код.

0
ответ дан 24 November 2019 в 16:22
поделиться
Другие вопросы по тегам:

Похожие вопросы: