本帖最后由 周恺 于 2012-7-11 05:37 编辑
其实在我的理解里,<==>只是在栈内存中进行比较,如果用在引用类型上,就是在比较引用类型的地址.
而equals()方法,String已经重写了,可以比较String里面的内容.不知道楼主对c了解多少,C没有字符串的
概念,只是用字符数组实现字符串的功能.所以在使用==比较字符数组的时候,也只是在比较它们指针的
值,也就是两个数组0角标的位置.还有长度,而java是在C基础上改进的,所以我用C语言的观点来看:
01.public class fourtest {
02. public static String a = "";
03. public static String b;
04. public static String c = "2";
05. public static String d = "de";
06. public static String e = "d" + "e";
07. public static void main(String args[]){
08. System.out.println(a+"2" == "2"); // false,将a看成是字符数组的0角标地址,当然不会等于另外一个字符数组的0角标地址咯,而且长度不一样.
09. System.out.println(b+"2");// null2//不解释..要注意的是,null不是b的值,它是b的地址属性,它指向遥远的虚无宇宙..
10. System.out.println(b+"2"=="null2");// false "null2"是一个字符串,在推内存中有明确的地址,只是栈内存中没有哥们愿意指向它.因上一条很容易得出false
11. System.out.println(c+"");// "2" ..这个没有什么好解释的.
12. System.out.println(c+""=="2");// false 这个就很有意思了,在C语言中空字符串""是以在第零位为空字符的字符阵列表示,变成数组就是{'2',''}空字节也分配了
//1字节的内存空间,长度不同.
13. System.out.println((c+"").equals("2"));//true String将equals重写了,使之比较字符串内容,所以true
14. System.out.println(d == e);//true 我想,你说的优化可能就在这里,当有两个字符串类型指向相同的内容时,jvm就在堆内存中只开辟一块空间,d和e所指向的内容相同
//所以它们在栈内存中存储的地址也相同,所以true.
15. }
16.}
还有,二楼
String a="ab";
System.out.println(a==("a"+"b"));//答案是true. |