我们在一开始学习Java的时候
1."==" 的作用是判断两个对象的地址是不是相等。即判断两个对象是不是同一个对象。(基本数据类型==比较的是值,引用数据类型==比较的是内存地址)
2.equals() : 它的作用也是判断两个对象是否相等。但它一般有两种使用情况:
①类没有覆盖equals()方法。则通过equals()比较该类的两个对象时,等价于通过“==”比较这两个对象。
②类覆盖了equals()方法。一般,我们都覆盖equals()方法来两个对象的内容相等;若它们的内容相等,则返回true(即,认为这两个对象相等)。
①类没有覆盖equals()方法。则通过equals()比较该类的两个对象时,等价于通过“==”比较这两个对象。
②类覆盖了equals()方法。一般,我们都覆盖equals()方法来两个对象的内容相等;若它们的内容相等,则返回true(即,认为这两个对象相等)。
例:
public static void main(String[] args) {
int x = 1;
int y = 1;
System.out.println(x == y);
String z = new String("hello");
String z1 = new String("hello");
String z2 = new String("hello");
System.out.println(z1 == z2);
z1 = z;
z2 = z;
System.out.println(z1 == z2);
}
int x = 1;
int y = 1;
System.out.println(x == y);
String z = new String("hello");
String z1 = new String("hello");
String z2 = new String("hello");
System.out.println(z1 == z2);
z1 = z;
z2 = z;
System.out.println(z1 == z2);
}
输出结果分别是 true;false;true;
对于基本类型的变量,变量直接储存的是"值",因此在用关系操作符==来进行比较时,比较的就是 “值” 本身。要注意浮点型和整型都是有符号类型的,而char是无符号类型的。
而引用数据类型引用类型的变量存储的并不是 “值”本身,而是于其关联的对象在内存中的地址。
这句话声明了一个引用类型的变量,此时它并没有和任何对象关联。
String z1 =new String("Hello");
而 通过new String("hello")来产生一个对象(也称作为类String的一个实例),并将这个对象和z1进行绑定:
z1= new String("hello");
此时变量z1中存储的是它指向的对象在内存中的存储地址,并不是“值”本身,也就是说并不是直接存储的字符串"hello"。
因此在用==对z1和z2进行第一次比较时,得到的结果是false。因此它们分别指向的是不同的对象,也就是说它们实际存储的内存地址不同。
而在第二次比较时,都让z1和z2指向了z指向的对象,所以结果为true.
String类对equals方法进行了重写,用来比较指向的字符串对象所存储的字符串是否相等。
其他的一些类诸如Double,Date,Integer等,都对equals方法进行了重写用来比较指向的对象所存储的内容是否相等。