当前位置: 首页 > 知识库问答 >
问题:

==运算符在Java内存地址检查中的作用

公良英资
2023-03-14

直到今天,我一直认为两个对象具有相同的hashcode意味着它们都具有相同的内存位置。但下面的一段代码却讲述了一个完全不同的故事:

学生实体:公共类学生实现可比{

int id;
int marks;
String Subject;

public int getId() {
    return id;
}
public void setId(int id) {
    this.id = id;
}
public int getMarks() {
    return marks;
}
public void setMarks(int marks) {
    this.marks = marks;
}
public String getSubjects() {
    return Subject;
}
public void setSubject(String subject) {
    Subject = subject;
}

public Student() {

}
public Student(int id, String subject, int marks) {
    super();
    this.id = id;
    this.marks = marks;
    Subject = subject;
}
@Override
public int compareTo(Student o) {
    if (this.getId()>(o.getId()))
    return 1;

    if (this.getId()<(o.getId()))
    return -1;

    return 1;
}

    @Override
    public int hashCode() {
        final int prime = 31;
        int result = 1;
        result = prime * result + ((Subject == null) ? 0 : Subject.hashCode());
        result = prime * result + id;
        result = prime * result + marks;
        return result;
    }
    @Override
    public boolean equals(Object obj) {
        if (this == obj)
            return true;
        if (obj == null)
            return false;
        if (getClass() != obj.getClass())
            return false;
        Student other = (Student) obj;
        if (Subject == null) {
            if (other.Subject != null)
                return false;
        } else if (!Subject.equals(other.Subject))
            return false;
        if (id != other.id)
            return false;
        if (marks != other.marks)
            return false;
        return true;
    }


}

在Hashmap中输入重复项以检查重写equals&hashcode()是否有效:

public class TestHashSet3 {

    static Student s1;
    static Student s2;
    static Student s3;

    public static void main(String[] args) {
        setStudent();
        testSet();
        testMap();
 }

    static void testMap() {
        Map<Student, String> empMap = new HashMap<>();
        empMap.put(s1, "Arun");
        empMap.put(s2, "Shivam");
        empMap.put(s3, "Varun");
        System.out.println("HashMap executed = ");
        for (Map.Entry<Student, String> obj : empMap.entrySet()) {
            System.out.println(obj  +  " ");
        }
    }

    static void testSet() {
        Set<Student> set = new HashSet<>();
        set.add(s1);
        set.add(s2);
        set.add(s3);
        System.out.println("HashSet executed = ");
        for (Student student : set) {
            System.out.println(student  +  " ");
        }

    }

    static void setStudent() {
        s1 = new Student(124, "Maths", 50);
        s2 = new Student(124, "Maths", 50);
        s3 = new Student(124, "Maths", 50);
    }
}

共有1个答案

罗乐意
2023-03-14

那么,hashcode()总是返回内存地址并不完全正确。在您的特定案例中,您正在覆盖该函数,以基本上返回subject引用的hashCode。

您的评估显示以下输出:

stringops.Student@955a0720

这可能有点混乱,因为这实际上不是裸内存地址,而是对对象的toString()方法的调用。

getClass().getName() + '@' + Integer.toHexString(hashCode())

请包含更多的文字,而不是截图,以增加搜索的能力,为其他人的问题下一次。

 类似资料:
  • 问题内容: 关于Swift如何管理内存地址我有些不了解 1.参考类型 这里和是指向 相同存储位置的 2个指针。 好。 2.值类型 现在和现在都涉及到该机制。 […]但是,Swift仅在绝对必要时才在幕后执行实际复制。Swift会管理所有值复制以确保最佳性能,因此,您不应避免分配以试图抢占该优化。https://developer.apple.com/library/ios/documentatio

  • 本文向大家介绍python中查看变量内存地址的方法,包括了python中查看变量内存地址的方法的使用技巧和注意事项,需要的朋友参考一下 本文实例讲述了python中查看变量内存地址的方法。分享给大家供大家参考。具体实现方法如下: 这里可以使用id 希望本文所述对大家的Python程序设计有所帮助。

  • ///01.地址.c #include <stdio.h> #include <stdlib.h> int get() { return 10; } //01.严格进行变量区分: // 1.普通变量和指针变量 // 2.严格的变量类型: // 常规类型+特殊类型 //02.对变量取地址的操作发起于寄存器当中 // 因此地址也生成于寄存器变量当中,C语言无法直接访问 //

  • 问题内容: 在Java程序中,我具有以下字符串: 每行是一个单独的过程。我想在每一行中使用该运算符计算出两个数字。但是我不想使用任何类型的条件系统来检测每行中的哪个运算符。 实际上,我的主要问题是在没有条件的情况下检测操作员的类型。我不想使用Javascript引擎。我想知道是否有任何有效和标准的方法。 问题答案: J. Selva回应的另一个解决方案: 改进之处 单班 静态块 更好的抽象 导入j

  • 1. 内存与地址 图 17.1. 邮箱的地址 我们都见过像这样挂在墙上的很多个邮箱,每个邮箱有一个房间编号,根据房间编号找到相应的邮箱投入信件或取出信件。内存与此类似,每个内存单元有一个地址(Address),内存地址是从0开始编号的整数,CPU通过地址找到相应的内存单元,取其中的指令或者读写其中的数据。与邮箱不同的是,一个地址所对应的内存单元不能存很多东西,只能存一个字节,以前讲过的int、fl

  • 我正在学习虚拟内存和自由空间管理。 我知道我们使用malloc分配的指针将请求堆中的一块内存。但是当我们调用malloc()系统调用时,它将返回一个整数作为专用内存块的地址,但是这个地址本身将存储在哪里呢? 假设 返回我的4008地址。它从4008到4022开始。这个块在堆中。但是4008本身在哪里? 它存储在堆栈中吗?