JVM在Java对象相等(=)中检查什么?
JVM在对象相等性(JVM在Java对象相等(=)中检查什么?,java,Java,JVM在对象相等性(==)中检查什么?是两个对象的hashCode还是其他什么?操作符只检查引用相等。它不调用对象上的任何方法。。。它只是检查所涉及的两个引用是否相等,即它们引用同一个对象 在简单的情况下,我相信这只是以位方式比较引用的问题——检查它们是否包含相同的字节。对于更复杂的环境(例如),可能需要稍微多做一些工作,以便比较不同的表示。但是内部引用实际上是某种指针,只需比较两个指针。操作符只检查引用相等。它不调用对象上的任何方法。。。它只是检查所涉及的两个引用是否相等,即它们引用同一个对象
==
)中检查什么?是两个对象的hashCode还是其他什么?操作符只检查引用相等。它不调用对象上的任何方法。。。它只是检查所涉及的两个引用是否相等,即它们引用同一个对象
在简单的情况下,我相信这只是以位方式比较引用的问题——检查它们是否包含相同的字节。对于更复杂的环境(例如),可能需要稍微多做一些工作,以便比较不同的表示。但是内部引用实际上是某种指针,只需比较两个指针。操作符只检查引用相等。它不调用对象上的任何方法。。。它只是检查所涉及的两个引用是否相等,即它们引用同一个对象
在简单的情况下,我相信这只是以位方式比较引用的问题——检查它们是否包含相同的字节。对于更复杂的环境(例如),可能需要稍微多做一些工作,以便比较不同的表示。但是内部引用实际上是某种指针,只需比较两个指针。操作符只检查引用相等。它不调用对象上的任何方法。。。它只是检查所涉及的两个引用是否相等,即它们引用同一个对象
在简单的情况下,我相信这只是以位方式比较引用的问题——检查它们是否包含相同的字节。对于更复杂的环境(例如),可能需要稍微多做一些工作,以便比较不同的表示。但是内部引用实际上是某种指针,只需比较两个指针。操作符只检查引用相等。它不调用对象上的任何方法。。。它只是检查所涉及的两个引用是否相等,即它们引用同一个对象
在简单的情况下,我相信这只是以位方式比较引用的问题——检查它们是否包含相同的字节。对于更复杂的环境(例如),可能需要稍微多做一些工作,以便比较不同的表示。但是内部引用实际上是某种指针,只需比较两个指针。使用==来比较对象引用。它只是检查两个对象是否指向同一引用。使用==来比较对象引用。它只是检查两个对象是否指向同一引用。使用==来比较对象引用。它只是检查两个对象是否指向同一引用。使用==来比较对象引用。它只是检查两个对象是否指向同一引用。相等运算符(
=
)测试引用相等性而不是hashCode
public static void main(String[] args) {
MyClass obj1=new MyClass();
MyClass obj2=new MyClass(); //obj1 and obj2 refers two different location
System.out.println("obj1= "+obj1+"\tobj2="+obj2);
if(obj1==obj2){ // so return false.
System.out.println("obj1==obj2");
}else{
System.out.println("obj1!=obj2");
}
System.out.println(obj1.hashCode()+"\t"+obj2.hashCode());
}
class MyClass{}
输出:
obj1= com.think.test.MyClass@1e9cb75 obj2=com.think.test.MyClass@2c84d9
obj1!=obj2
hashCode
obj1=32099189 obj2=2917593
com.think.test.Test9@1
com.think.test.Test9@1
1
1
true
编辑
class EqualityTest {
@Override
public int hashCode(){
return 1;
}
public static void main(String... arg){
EqualityTest t1 = new EqualityTest();
EqualityTest t2 =t1; // t2 referring to t1.
System.out.println(t1);
System.out.println(t2);
System.out.println(t1.hashCode());
System.out.println(t2.hashCode());
System.out.println(t1==t2); // so it return true.
}
}
输出:
obj1= com.think.test.MyClass@1e9cb75 obj2=com.think.test.MyClass@2c84d9
obj1!=obj2
hashCode
obj1=32099189 obj2=2917593
com.think.test.Test9@1
com.think.test.Test9@1
1
1
true
相等运算符(=
)测试引用相等性而不是hashCode
public static void main(String[] args) {
MyClass obj1=new MyClass();
MyClass obj2=new MyClass(); //obj1 and obj2 refers two different location
System.out.println("obj1= "+obj1+"\tobj2="+obj2);
if(obj1==obj2){ // so return false.
System.out.println("obj1==obj2");
}else{
System.out.println("obj1!=obj2");
}
System.out.println(obj1.hashCode()+"\t"+obj2.hashCode());
}
class MyClass{}
输出:
obj1= com.think.test.MyClass@1e9cb75 obj2=com.think.test.MyClass@2c84d9
obj1!=obj2
hashCode
obj1=32099189 obj2=2917593
com.think.test.Test9@1
com.think.test.Test9@1
1
1
true
编辑
class EqualityTest {
@Override
public int hashCode(){
return 1;
}
public static void main(String... arg){
EqualityTest t1 = new EqualityTest();
EqualityTest t2 =t1; // t2 referring to t1.
System.out.println(t1);
System.out.println(t2);
System.out.println(t1.hashCode());
System.out.println(t2.hashCode());
System.out.println(t1==t2); // so it return true.
}
}
输出:
obj1= com.think.test.MyClass@1e9cb75 obj2=com.think.test.MyClass@2c84d9
obj1!=obj2
hashCode
obj1=32099189 obj2=2917593
com.think.test.Test9@1
com.think.test.Test9@1
1
1
true
相等运算符(=
)测试引用相等性而不是hashCode
public static void main(String[] args) {
MyClass obj1=new MyClass();
MyClass obj2=new MyClass(); //obj1 and obj2 refers two different location
System.out.println("obj1= "+obj1+"\tobj2="+obj2);
if(obj1==obj2){ // so return false.
System.out.println("obj1==obj2");
}else{
System.out.println("obj1!=obj2");
}
System.out.println(obj1.hashCode()+"\t"+obj2.hashCode());
}
class MyClass{}
输出:
obj1= com.think.test.MyClass@1e9cb75 obj2=com.think.test.MyClass@2c84d9
obj1!=obj2
hashCode
obj1=32099189 obj2=2917593
com.think.test.Test9@1
com.think.test.Test9@1
1
1
true
编辑
class EqualityTest {
@Override
public int hashCode(){
return 1;
}
public static void main(String... arg){
EqualityTest t1 = new EqualityTest();
EqualityTest t2 =t1; // t2 referring to t1.
System.out.println(t1);
System.out.println(t2);
System.out.println(t1.hashCode());
System.out.println(t2.hashCode());
System.out.println(t1==t2); // so it return true.
}
}
输出:
obj1= com.think.test.MyClass@1e9cb75 obj2=com.think.test.MyClass@2c84d9
obj1!=obj2
hashCode
obj1=32099189 obj2=2917593
com.think.test.Test9@1
com.think.test.Test9@1
1
1
true
相等运算符(=
)测试引用相等性而不是hashCode
public static void main(String[] args) {
MyClass obj1=new MyClass();
MyClass obj2=new MyClass(); //obj1 and obj2 refers two different location
System.out.println("obj1= "+obj1+"\tobj2="+obj2);
if(obj1==obj2){ // so return false.
System.out.println("obj1==obj2");
}else{
System.out.println("obj1!=obj2");
}
System.out.println(obj1.hashCode()+"\t"+obj2.hashCode());
}
class MyClass{}
输出:
obj1= com.think.test.MyClass@1e9cb75 obj2=com.think.test.MyClass@2c84d9
obj1!=obj2
hashCode
obj1=32099189 obj2=2917593
com.think.test.Test9@1
com.think.test.Test9@1
1
1
true
编辑
class EqualityTest {
@Override
public int hashCode(){
return 1;
}
public static void main(String... arg){
EqualityTest t1 = new EqualityTest();
EqualityTest t2 =t1; // t2 referring to t1.
System.out.println(t1);
System.out.println(t2);
System.out.println(t1.hashCode());
System.out.println(t2.hashCode());
System.out.println(t1==t2); // so it return true.
}
}
输出:
obj1= com.think.test.MyClass@1e9cb75 obj2=com.think.test.MyClass@2c84d9
obj1!=obj2
hashCode
obj1=32099189 obj2=2917593
com.think.test.Test9@1
com.think.test.Test9@1
1
1
true
很容易看出JVM如何在字节码级别处理
==
比如说
public boolean compare(Object o1, Object o2)
{
return o1 == o2;
}
编译为以下字节码指令(使用javap-c
生成此指令):
aload1
和aload2
在堆栈上加载o1和o2的参考。
=
操作由if\u acmpne
执行
如果acmpne弹出堆栈顶部的两个对象引用,然后
比较它们如果两个对象引用不相等(即如果
它们指的是不同的对象),执行分支到。。。。如果对象
引用引用同一个对象,执行将在下一个
指示
当然,这并没有告诉您JVM解释器如何实现对象引用,或者像Hotspot这样的字节码到本机编译器如何实现它,但这是探索这个主题的一个良好开端。很容易看到JVM如何在字节码级别处理
=
比如说
public boolean compare(Object o1, Object o2)
{
return o1 == o2;
}
编译为以下字节码指令(使用javap-c
生成此指令):
aload1
和aload2
在堆栈上加载o1和o2的参考。
=
操作由if\u acmpne
执行
如果acmpne弹出堆栈顶部的两个对象引用,然后
比较它们如果两个对象引用不相等(即如果
它们指的是不同的对象),执行分支到。。。。如果对象
引用引用同一个对象,执行将在下一个
指示
当然,这并没有告诉您JVM解释器如何实现对象引用,或者像Hotspot这样的字节码到本机编译器如何实现它,但这是探索这个主题的一个良好开端。很容易看到JVM如何在字节码级别处理
=
比如说
public boolean compare(Object o1, Object o2)
{
return o1 == o2;
}
编译为以下字节码指令(使用javap-c
生成此指令):
aload1
和aload2
在堆栈上加载o1和o2的参考。
=
操作由if\u acmpne
执行
如果acmpne弹出顶部