问题:在 Java 中,为什么不用 == 而用 equals() 比较字符串呢?
Java 中,String 属于引用数据类型。对字符串对象的比较,不能简单地使用比较运算符“==”,因为比较运算符比较的是两个字符串的地址是否相同。即使两个字符串对象的内容相同,只要它们引用的不是同一内容,使用比较运算符依旧会返回false。
例子:
String s1 = "test"; String s2 = "test"; String s3 = s1; String s4 = new String("test"); String s5 = new String("test"); System.out.println("s1 == s2 : "+(s1 == s2)); System.out.println("s2 == s3 : "+(s2 == s3)); System.out.println("s4 == s5 : "+(s4 == s5)); System.out.println("s4.equals(s5) : "+s4.equals(s5));
结果
分析
1、s1,s2和s3使用比较运算符返回true,因为它们引用的是同一公共池中的同一对象;当遇到字符串常量时,编译器会使用该值创建一个 String 对象,而s1, s2, s3 引用的是同一个字符串常量,所以它们的引用地址及引用对象的值都完全相同。
2、s4和s5使用比较运算符返回false,因为它们引用的是不同的对象; s4 和 s5都是使用new 时分别创建了两个字符串对象,虽然字符串的内容相同,但是它们的引用地址是不同的。
对于equals() 的使用需要注意
当字符串对象为 null 时,调用 equals() 方法会抛空指针异常
String test1 = null; String test2 = new String("test"); boolean result = test1.equals(test2);
这就要求在使用equals() 方法需要先判断对象是否为空
String test1 = null; String test2 = new String("test"); if(testStr1 != null){ boolean result = test1.equals(test2); }
扩展
忽略大小写的情况下比较两个字符串是否相等时,可以用.equalsIgnoreCase()方法。
String test1 = new String("abcdefg"); String test2 = new String("ABCDEFG"); if(test2 != null){ System.out.println("test1.equalsIgnoreCase(test2) : "+test1.equalsIgnoreCase(test2)); }