学习java已经差不多有一整年的时间了,暂时学到servlet,每次想继续学习新知识的时候,总是听到旁边的人说java基础如何如何重要,的确,万丈高楼平地起,只有经过时间和代码的积累,才会有一个相对的提升。学习java并不是你看了几本书,看了多少的视频,关键在于学习的基础上多总结。比如说,java中“eqals”与“==”的异同。我反正在这个问题上面犯晕过。截止现在想写关于“equals”与“==”的区别时候,也可能理解的有偏颇。废话不说了。
首先我们先撇开字符串类。后面再说。
问号处答案为:true。与上面例子的结果不同。为甚?
因为java的字符串中有一个字符串常量池的概念,定义s1的时候,虚拟机会再常量池中寻找是否有”abc“的对象,找到以后,就把该对象的地址赋值给s1,第一步没有“abc”对象,所以会创建一个,第二步会找到该对象,也会把该对象得地址(也可以说是hash值)赋值给s2。所以两变量指向同一个对象,结果就为两个true。
综上:常常听见有人说equals是比较值是否相等,==比较地址,这种说法很片面。
首先我们先撇开字符串类。后面再说。
对于一般的类,“==”与“equals“的效用相同。都是比较两个对象的hasnCode是相等。即比较两个对象在内存中的地址是否相同。相同返回true,不同则返回false。
package myday01;
public class Test {
public static void main(String[] args) {
Person p1=new Person("a","123");//创建两个person对象
Person p2=new Person("a","123");
System.out.println(p1==p2);//创建了两个对象,返回false
System.out.println(p1.equals(p2));//返回false
}
}
class Person
{
private String name;
private String password;
Person(String name,String password)
{
this.name=name;
this.password=password;
}
/*public boolean equals(Object obj)
{
if(obj instanceof Person)
{
Person p = (Person)obj;
if(name.equals(p.name)&&password.equals(p.password))
{
return true;
}
}
return super.equals(obj);
}
public int hashCode()
{
return name.hashCode();
}*/
}
综上,如果类没有改写equlas和hashcode,那么,他们的用途相同。但是,在String和Integer等其他类来说,他们不相同,这是为什么呢?
因为这些包装类已经重写了equlas方法和hasnCode方法。这些类的equals方法已经不是比较两个对象的hash值,也就是重写了hashcode方法。见代码:
package myday01;
public class Test2 {
public static void main(String[] args) {
Integer i1=new Integer(111);
Integer i2=new Integer(111);
System.out.println(i1==i2);//返回false,比较的是hashcode,即内存中的地址
System.out.println(i1.equals(i2));//返回true,改写了Object的方法,只要构造函数中的参数相同,就返回t//rue
}
}
再看一例:
package myday01;
public class Test3 {
public static void main(String[] args) {
String s1=new String("abc");
String s2=new String("abc");
System.out.println(s1==s2);//,根据上面的结论,可以得出:返回false
System.out.println(s1.equals(s2));//返回true
}
}
再看一例:
package myday01;
public class Test4 {
public static void main(String[] args) {
String s1="abc";
String s2="abc";
System.out.println(s1==s2);//??
System.out.println(s1.equals(s2));//毫无疑问,此处为true
}
}
问号处答案为:true。与上面例子的结果不同。为甚?
因为java的字符串中有一个字符串常量池的概念,定义s1的时候,虚拟机会再常量池中寻找是否有”abc“的对象,找到以后,就把该对象的地址赋值给s1,第一步没有“abc”对象,所以会创建一个,第二步会找到该对象,也会把该对象得地址(也可以说是hash值)赋值给s2。所以两变量指向同一个对象,结果就为两个true。
综上:常常听见有人说equals是比较值是否相等,==比较地址,这种说法很片面。