javase-JAVA程序给对象分配内存地址时是否可能有重复

问题描述

JAVA程序给对象分配内存地址时是否可能有重复

今天看了equals和hashcode两个方法,object中equals方法比较是两个对象的内存地址,规定返回true代表两个对象相同,那么hashcode返回的哈希码也一定要相同。但没有规定当两个对象不相同,返回的哈希码一定要不同,可能是相同的。
在hashcode和equals不被重写的情况下,难道程序在给两个不同的对象分配内存地址时可能出现相同的情况吗?一个对象分配到的内存地址难道不是唯一的?

解决方案

hashcode不是地址。地址肯定不能重复,不然还了得,你修改这个对象,破坏了那个对象。
对于两个对象,hashcode相同,两个对象equals不一定为真,但是反之,hashcode不同,equals一定要返回false
对于同一个对象,允许有多个引用,此时它们的地址相同(这些引用指向的是同一个对象),比如
User u = new User();
u1 = u; // u1没有初始化,而是指向u,此时u1和u是一个对象,地址相同。

解决方案二:

Object中equals方法比较是两个对象的内存地址,而hashCode()返回的与地址相关的一个整数(不一定是地址,不同对象可能有相同的hashCode),

Object默认的equals等同于"==",即a.equals(b)等同于a==b

所以在实际使用中,你不能用Object的这两个方法,你需要重载。

重载之后怎么获取与对象地址相关的一个hashCode内?使用下面方法:

 System.identityHashCode(obj)
时间: 2025-01-30 17:11:43

javase-JAVA程序给对象分配内存地址时是否可能有重复的相关文章

解析Java程序中对象内存的分配和控制的基本方法_java

一.对象与内存控制的知识点 1.java变量的初始化过程,包括局部变量,成员变量(实例变量和类变量). 2.继承关系中,当使用的对象引用变量编译时类型和运行时类型不同时,访问该对象的属性和方法是有区别的. 3.final修饰符特性. 二.java变量的划分与初始化过程 java程序的变量大体可以分为成员变量和局部变量,成员变量可以分为实例变量(非静态变量)和类变量(静态变量),一般我们遇到的局部变量会在下列几种情况中出现: (1)形参:在方法签名中定义的局部变量,由调用方为其赋值,随着方法结束消

java项目中对象第二次创建时,第一个对象为什么还存在

问题描述 java项目中对象第二次创建时,第一个对象为什么还存在 可能我问题提的不太清楚,我举个例子 比如一个类 public class A{ private List list = new ArrayList(); public void add(){ list.add("abv"); } public void tell(){ System.out.print(list.size()); } } 在其他地方调用 A a = new A(); a.add(); Thread.sle

jvm对大对象分配内存的特殊处理(转)

    前段日子在和leader交流技术的时候,偶然听到jvm在分配内存空间给大对象时,如果young区空间不足会直接在old区切一块过去.对于这个结论很好奇,也比较怀疑,所以就上网搜了下,发现还真有这么回事.以下给出具体代码来说明: 首先定义好jvm内存各个区域的大小.我设定的是eden区8M,from和to各1M,old区10M,总共20M的空间,参数如下:   Shell代码   -Xms20M -Xmx20M -Xmn10M -XX:SurvivorRatio=8       紧接着,开

java怎么通过内存地址获取内存中的值

问题描述 java怎么通过内存地址获取内存中的值 最近用java开发了一个客户端程序.使用了windows消息机制与第三方系统交互. 第三方系统发过来的信息是一个内存地址.请问java能不能通过内存地址获取到值. 另,java能不能获取到一个Double类对象的内存地址,不是hashcode.

JAVA程序员必读:基础篇(4)类和继承

程序|程序员|继承 这节教程将开始讨论对象的生命周期.包括怎样创建对象.怎样使用它以及在不使用它的时候将它从系统中清除.下面一个一个介绍:4.1 对象的生命周期 在这一小节中你可以学到怎样创建和使用任何类型的对象,还讨论了当对象不再需要的时候系统怎样清除对象的. 典型的JAVA程序创建对象,对象之间的交互是通过发送消息来实现的.通过这些对象的交互,JAVA程序可以执行一个GUI.运行一个动画或者通过网络发送和接收信息.一旦对象已经完成了任务,它就被作为无用信息被回收,它的资源可以由其它对象回收利

java程序员:开发系统要注意的基本知识

程序|程序员 问题一:我声明了什么! String s = "Hello world!"; 许多人都做过这样的事情,但是,我们到底声明了什么?回答通常是:一个String,内容是"Hello world!".这样模糊的回答通常是概念不清的根源.如果要准确的回答,一半的人大概会回答错误.这个语句声明的是一个指向对象的引用,名为"s",可以指向类型为String的任何对象,目前指向"Hello world!"这个String类型的

变态级JAVA程序员面试32问(转)

程序|程序员 前面部分是问题,后面部分是一些网友给的答案,大家参考吧: ****************************原题部分************************************** 第一,谈谈final, finally, finalize的区别. 第二,Anonymous Inner Class (匿名内部类) 是否可以extends(继承)其它类,是否可以implements(实现)interface(接口)? 第三,Static Nested Class 和

Java中用软引用阻止内存泄漏

在本文中,他将解释 Reference 对象的另外一种形式,即软引用(soft references),用于帮助垃圾收集器管理内存使用和消除潜在的内存泄漏. 垃圾收集可以使 Java 程序不会出现内存泄漏,至少对于比较狭窄的 "内存泄漏" 定义来说如此,但是这并不意味着我们可以完全忽略 Java 程序中的对象生存期(lifetime)问题.当我们没有对对象生命周期(lifecycle)引起足够的重视或者破坏了管理对象生命周期的标准机制时,Java 程序中通常就会出现内存泄漏.例如,上一

java-JAVA中数组定义new分配内存空间的问题

问题描述 JAVA中数组定义new分配内存空间的问题 JAVA中在定义一个数组的时候,根据书上内容形式,举一个例子 int[] arr=new int[]{3,4,5,}; 但是在实际中,我见到过或者使用更多的是 int[] arr={3,4,5}; 这个时候要不要new去分配内存又有什么区别呢? 在JAVA中 是不是没有new 分配的时候 数组arr在内存栈中 new分配内存空间时 数组arr就到了堆内存中呢 解决方案 现在也不是很理解,找了一个大神告诉我说 第二种是静态初始化,在编译的时候就