1. 比较运算符 “==”
如果进行比较的两个操作数是数值型的,则是比较两个操作数的值,只有二者的值相等,就返回true.
如果进行比较的是引用类型,则当二者都执行相同的实例时,才返回true.
程序清单:String类型的比较
public class StringTest {
public static void main(String[] args) {
String str1 = new String("123");
String str2 = new String("123");
System.out.println(str1 == str2);//这里返回false
System.out.println(str1.equals(str2));//true
String str3 = "123";
String str4 = "123";
System.out.println(str3 == str4);//这里返回true
System.out.println(str3.equals(str4));//true
}
}
如代码所示,两个new得到的String对象虽然值相等,str1.equals(str2)返回true,但由于两个分别是不
同的对象实例对象,在堆内存中占有不同的内存空间,所以str1 == str2返回false.当执行str3 = "123"时,系
统会先从缓存中检查是否有一个内容为"123"的实例存在,如果没有则会在缓存中创建一个String对象"123",
执行str4 = “123”时,缓存中已经有了相同内容的对象,系统则不再生成对象,直接将str4指向那个对象.所
以str3 == str4会返回true.
同样的系统会把一些创建成本大,需要频繁使用的对象进行缓存,从而提高程序的运行性能.再比如
Integer类.
程序清单,Integer的比较
public class IntegerTest {
public static void main(String[] args) {
Integer ia = 1;
Integer ib = 1;
System.out.println(ia == ib); //true
Integer ic = 128;
Integer id = 128;
System.out.println(ic == id); //false
}
}
系统会将int整数自动装箱成Integer实例,新建实例时,系统会先创建一个长度为256的Integer数组,
其中存放-128到127的Integer实例,当再需要一个在这个范围中的Integer对象时,系统会直接将引用变量
指向相应的实例对象,ia和ib都指向相同的Integer对象所以上面的ia == ib 返回true;而当需要创建的
Integer对象不在这个范围中时,系统则会新创建对象,实际上ic和id是两个不同的对象,则ic == id 返回false.
2. 逻辑运算符
程序清单:|| 和 | 的区别
public class LogicTest {
public static void main(String[] args) {
int a = 1;
int b = 2;
if (a == 1 || b++ == 3) {
System.out.println("a="+a+",b="+b);//a=1,b=2
}
if (a == 1 | b++ ==3) {
System.out.println("a="+a+",b="+b);//a=1,b=3
}
}
}
"||" 当前面的结果为true时,不会在计算后面的结果,会直接返回true;"|"总是会计算前后两个表达式.