1.==介绍
==:它是一个运算符,如果操作两边都是对象,比较的是它们在内存中的存放地址,如果两个指向同一个对象,则为true,否则为false,如果两边是基本数据类型,则比较的是值。
2.equals介绍
equals:它比较的是两个对象的内容,如果不重载equals方法,自动调用Object的equals方法,则和“==”一样,在JDK中像String、Integer默认重载了equals方法,则比较的是对象的内容;如果是一个自己创建的类,要比较两个对象的内容,则需要在类中重载equals方法;
equals的特性:
1)自反性:当一个对象型变量obj是个非空对象引用时,obj.equals(obj)的结果是真;
2)对称性:对两个对象型变量obj1,obj2,如果obj1.equals(obj2)的结果为真,同时obj2.equals(obj1)的结果也毕竟为真;
3)传递性:对三个对象变量obj1,obj2,obj3,如果obj1.equals(obj2)为真,obj2.quals(obj3)的结果也为真,那么obj1.equals(obj3)的结果必定为真;
4)一致性:对象型变量在发生变化的前提下,多次调用obj1.equals(obj2)的结果都是一样的;
5)对于任何非空的对象型变量obj,obj.equals(null)的结果应该是false.
根据例子看:
public class Test {
public static void main(String[] args) {
String str1="abc"; //abc在常量池中
String str2="abc";
int a=1;
int b=1;
String str3=new String("abc"); //在堆栈中重新开辟一个abc空间
String str4=new String("abc");
System.out.println(a==b);
System.out.println(str1==str2);
System.out.println(str1.equals(str2));
System.out.println(str3==str4);
System.out.println(str3.equals(str4));
System.out.println(str1==str3);
System.out.println(str1.equals(str3));
}
}
结果:
这里涉及到了String中常量池中的问题,可以通过String中的intern方法;
public class Test {
public static void main(String[] args) {
String str1="abc"; //abc在常量池中
String str2="abc";
int a=1;
int b=1;
String str3=new String("abc"); //在堆栈中重新开辟一个abc空间
String str4=new String("abc");
System.out.println(a==b); //true
System.out.println(str1==str2); //true
System.out.println(str1.equals(str2)); //true
System.out.println(str3==str4); //false
System.out.println(str3.equals(str4)); //true
System.out.println(str1==str3); //false
System.out.println(str1.equals(str3));//true
System.out.println(str3.intern()==str4.intern()); //true
System.out.println(str1.intern()==str3.intern()); //true
}
}
具体地在String中介绍。
class Human{
int age;
String sex;
String name;
public Human(int age,String sex,String name){
this.age=age;
this.sex=sex;
this.name=name;
}
}
public class Student {
public static void main(String[] args) {
Human h1=new Human(20,"男","张三");
Human h2=new Human(20,"男","张三");
System.out.println(h1.equals(h2));
}
}
结果为:
这是因为没有在Human类中重载equals方法,要比较的类中的所有属性,只有所有属性都一样了,两个对象才能相等;
class Human{
int age;
String sex;
String name;
public Human(int age,String sex,String name){
this.age=age;
this.sex=sex;
this.name=name;
}
@Override
public boolean equals(Object obj) {
if(age==((Human)obj).age&&sex.equals(((Human)obj).sex)&&name.equals(((Human)obj).name)){
return true;
}
return false;
}
}
public class Student {
public static void main(String[] args) {
Human h1=new Human(20,"男","张三");
Human h2=new Human(20,"男","张三");
System.out.println(h1.equals(h2));
}
}
3.两个的作用
1)==的作用
基本类型:比较的就是值否相等;
引用类型:默认情况下,比较的是地址值是否相等
2)equals的作用
引用类型:默认情况下,比较的是地址值,重写该方法后,比较的是对象的成员变量值是否相等。
4.问题
String str=new String ("abc");创建了几个对象?
首先要看常量池中是否有“abc"这个字符串,如果有(String str="abc",出现时则有)则创建一个,如果没有,则创建两个(个在常量池中,一个在堆中)。