直到今天,我一直认为两个对象具有相同的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);
}
}
那么,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本身在哪里? 它存储在堆栈中吗?