众所周知,Java中的 == 运算符是用来判定两个变量是否相等的
对于8大基本类型,== 比较的是值是否相等,而对于引用类型,== 比较的是地址是否相等。
那么下面的这些代码你能准确地回答出结果吗?
//第一段
String a = "abc";
String b = "abc";
Log.d("result", "a == b => " + (a == b));
//第二段
String a = new String("abc");
String b = new String("abc");
Log.d("result", "a == b => " + (a == b));
//第三段
Integer a = 123;
Integer b = 123;
Log.d("result", "a == b => " + (a == b));
//第四段
Integer a = 123456789;
Integer b = 123456789;
Log.d("lpy", "a == b => " + (a == b));
//第五段
Integer a = new Integer(123);
Integer b = new Integer(123);
Log.d("lpy", "a == b => " + (a == b));
正确答案是
true
false
true
false
false
你答对了几个呢?
讲解
第一段代码,比较相同字符串的地址,按道理这是两个对象,比较地址应该返回false才对,但是String在Java中比较特殊,因为 JVM 中有字符串常量池这个概念,相同的字符串不会重复创建,也就是说,在常量池中,只有一个"abc"的对象,所以返回true
第二段代码,因为用了 new 关键字,那就不管什么常量池不常量池的了,全部新建出来,所以此时两个对象的地址自然不同,返回false
第三段代码,如果 a,b都是int类型,自然返回true,但是Integer是int的包装类型,在JVM中对于Integer有一个缓存的概念,-128 ~ 127 是被IntegerCache缓存起来的,所以在内存中a,b的地址相同,返回true
第四段代码,像上面说的,a,b的值超过了Integer的缓存范围,所以是两个不同的对象,返回false
第五段代码,new 关键字又出现了,缓存也没用,都是新建的对象,返回false