一般编程语言中喜欢用==符号来判断java中两个字符串是否相等,例如c++。c++提供了操作符的重载,所以可以重载==运算符来判断。
但是由于java中,没有提供运算符重载,而且java中没有提供基本的string类型、也没有把string看成char数组,所以比较的时候不能用==。java中,比较两个字符串是否相等用equals()和equalsIgnoreCase()方法。
java中==比较的是两个变量是否存放在同一个内存地址中,如果两个对象存放在同一个地址,用==判断来比较返回true,否则返回false。
在java中字符串常量存放在数据段中,是共享的,也就是如果你写String a="ab";String b="ab";那么内存中只有一个ab,变量a、b指向同一个内存块。此时a和b是相等的,用a==b来判断返回true。
但是如果对字符串进行了某些操作,比如+或者substring(),产生的字符串不是共享的,而是存放在另外一个内存块中。
比如:
String a = "hello";
String b= a.substring(0,2);
则b=="hel"可能是false。
示例:
/** *This program is to test how java saves String valuable. *@author hewenwu */ public class StringTest { /** * @param args */ public static void main(String[] args) { String a="abcd"; String b="ab"; String d="cd"; String c=a.substring(0,1); String e=b+d; String f="abcd"; //test1 if(c=="ab") {System.out.println("c==ab");} else System.out.println("c!=ab"); //test2 if(c==b){System.out.println("c==b");} else System.out.println("c!=b"); //test3 if(a==e){System.out.println("a==e");} else System.out.println("a!=e"); //test4 if(a==f){System.out.println("a==f");} else System.out.println("a!=f"); } }
输出结果:
c!=ab
c!=b
a!=e
a==f
从test1、test2、test3可以看出,操作+和substring()产生的字符串是不共享的
从test4可以看出,java中字符串常量是共享的。