String类型中"=="和"equals"的区别
"=="比较的是两个字符串的内存地址。 "equals"比较的是两个字符串的实际值。
例子1.
String s1="abc"; String s2="abc"; if(s1.equals(s2)){ System.out.println("两个字符串值相等") } if(s1==s2){ System.out.println("两个字符串指向同一个内存地址"); }
此时输出:两个字符串值相等
两个字符串指向同一个内存地址
why:当给s2赋值abc时,s2会自动去寻找有没有abc这个值得字符串。如果有,会copy s1(包含内存地址)。如果没有,再创建一个新内存地址。
例子2.
String s1="abc"; String s2=new String("abc") if(s1.equals(s2)){ System.out.println("两个字符串值相等") } if(s1==s2){ System.out.println("两个字符串指向同一个内存地址"); }
此时输出:两个字符串值相等
why:s2创建了一个新对象,值为abc,与s1不再是同一个内存地址,所以只输出:两个字符串相等
例子3.
String s1="abc"; String s2=new String() s2="abc"; if(s1.equals(s2)){ System.out.println("两个字符串值相等") } if(s1==s2){ System.out.println("两个字符串指向同一个内存地址"); }
此时输出:两个字符串值相等
两个字符串指向同一个内存地址
why: 虽然new了一个新对象,但没有在此时给值,后来赋值的时候,仍是copy 了s1的内存地址。
例子4.
String s1="abc"; String s2=new String("abc"); s2=s2.intern(); if(s1.equals(s2)){ System.out.println("两个字符串值相等") } if(s1==s2){ System.out.println("两个字符串指向同一个内存地址"); }
此时输出:两个字符串值相等
两个字符串指向同一个内存地址
why: 调用了intern()方法,此时s2先去找有没有abc,如果有,copy 内存地址,如果没有,创建新的。