System.out.println("a" == "a");
System.out.println("a"+"b" == "ab" );System.out.println("a".toLowerCase()=="a" );System.out.println( "a"+"b".toLowerCase() == "ab" );System.out.println("A".toLowerCase()=="a");结果分别是true true true false false
编译器在遇到代码里两个常量String相加时,会在编译期就加起来,在代码运行时实际的代码应该是System.out.println("ab" == "ab" ); 而String常量在常量池中只存在一份,所以前一个"ab"和后一个"ab"指向同一个对象,故返回True而编译器并不会在编译期对String.toLowerCase()这个函数进行处理,在代码执行期间,"b".toLowerCase()返回"b",a+b返回ab,此时的ab是在代码运行期间被new出来的,存在与堆中,与后一个ab(存在于常量池中)指向的并不是同一个对象,故返回false