首先equals和“==”的第一个区别就是,equals是方法,而“==”是运算符。在了解两者的具体区别时,我们首先要对JVM的内存分配有一定的了解:
JVM分为堆内存和栈内存,当我们创建一个对象(new Object)时,就会用它的构造函数来开辟空间,将对象数据存储在堆内存中,同时在栈内存中生成相应的引用。在我们的程序调用的时候都是调用的栈内存中的引用,还有一点就是基本数据类型都储存在栈内存中。下面就通过具体的例子来进一步的比较两者的区别:
首先我们new两个对象
Student student1 = new Student();
Student student2 = new Student();
System.out.println(student1.equals(student2));
System.out.println(student1 == student2);
在开发工具中运行的结果是两个输出的都是false。具体原因就是在这种情况下,两者比较的都是对象的物理地址,即对象在栈内存中的引用,这样的话结果理所当然的就是false了。
而下面这种情况:
String a = new String("a");
String b = new String("a");
System.out.println(a == b);
System.out.println(a.equals(b));
输出的结果是false和true。为什么和上面的比较结果不同呢?原因就是这次equlas不仅比较了两个对象的物理地址,还比较了两个对象的具体值。在Java中String中的equals方法被重写了,当两个对象的物理地址不同时,String会进一步的比较两个对象的具体的值。
但是如果是这样System.out.println(student1.toString().equals(student2.toString()));时,结果就变成了false。这里就牵扯到了hash code的问题,因为只是重写了equals方法并不能让两个对象的hash code进行改变,在Java中首先比较的就是两个对象的hash code值是否相等。因此在比较两个对象是否相等的时候要记得重写equals和hash code方法。
网友评论