Java中关系操作符==的学习以及与equals的对比
1.一个实例如下:
public class TestObject {
public static void main(String[] args) {
// TODO Auto-generated method stub
int o=3;
int p=3;
Integer l=3;
Integer m=3;
Integer n=new Integer(3);
String r="hello";
String s="hello";
String t=new String("hello");
String u=new String("hello");
Integer v=128;
Integer w=128;
System.out.println(o==p); //ture (1)
System.out.println(o==m); //true (2)
System.out.println(l==m); //true (3)
System.out.println(m==n); //false (4)
System.out.println(r==s); //true (5)
System.out.println(s.equals(t)); //true (6)
System.out.println(s==t); //false (7)
System.out.println(t==u); //false (8)
System.out.println(v==w) //false (9)
}
}
2.关系操作符“==”
关系操作符==实际比较的是符号两边的值,
a.当==号两边都为基本类型时,直接进行值比较,如结果(1),变量o和p存储的值均为3,所以结果为true。
b.当==号两边都为对象类型时,此时变量的值是对象地址,如结果(4)、(7)、
(8)、(9),此时由于变量中存储的对象地址不同所以返回结果为false。此时我们会有一个疑问,为什么结果(2)、
(3)、(5)返回为true,这里可以顺便解释一下,以对int、Integer、string基本类容的回顾:
1)int与Integer
int和Integer在进行比较时,Integer会自动拆箱,转为int值与int进行比较,所以结果(2)返回为true。
Integer和Integer直接赋值进行比较时,Integer会自动装箱,这时会面临一个选择:当变量x在区间[-128,127]之间时,
将会直接缓存在整型变量池中,当新的变量赋值在这个区间的时候就不会创建新的Integer对象,二是从整型变量池中获取
已经创建好的Integer对象;当变量x大于这个范围时,会直接new Integer创建一个新的Integer对象。所以结果(3)
为true,而结果(9)为false。
2)string=“”与new String()
String s1="a",直接赋值的字符串变量存储在常量存储区中的字符串变量池中,new String("a")存储在堆中,当直接赋值一个相同的
字符串String s2="a"时,此时s2也指向字符串常量池中的a,所以结果(5)为true,结果(8)为false。
3.equals
equals方法是Object的方法,因此所有的类默认都有该方法,Object类中equals方法比较的是对象地址,但是结果(6)为什么是
true呢,这是因为String类对equals方法进行了重写,用来比较指向的字符串对象所存储的字符串是否相等,Java中大多数类都会对
equals方法进行重写,没有重写的话默认继承Object中的equals方法,此时比较的就是对象地址。