详述:Java中 String equals与==区别
equals的定义
首先,equals(String targetString)用于判断两个字符串是否相同,完全相同返回true,否则返回false:
public class Test {
public static void main(String[] args) {
String name1 = "xiaoming";
String name2 = "xiaoming";
String name3 = "xiaofang";
boolean result1 = name1.equals(name2);
System.out.println(result1); //返回true
boolean result2 = name1.equals(name3);
System.out.println(result3); //返回false
}
}
equals与==的区别
public class Test {
public static void main(String[] args) {
String str1 = "xiaoming";
String str2 = new String("xiaoming");
String str3 = new String("xiaohong");
boolean result1 = str1.equals(str2);
System.out.println(result1); //返回true
boolean result1 = str1.equals(str3);
System.out.println(result2); //返回false
//读者可以注意一下,我是采取的两种不同String类实例化的方式,下面要用到。如果读者对这两个有什么不懂的地方可以看我的博客 详述:Java中String的实例化
}
}
可以看出来,两种不同String的实例化,跟equals定义中的代码结果一样,为什么会这样呢?我们先来看看==的代码。
public class Test {
public static void main(String[] args) {
String str1 = "xiaoming";
String str2 = "xiaoming";
String str3 = new String("xiaoming");
boolean result1 = str1==str2;
System.out.println(result1); //返回true
boolean result2 = str1==str3;
System.out.println(result2); //返回false
}
}
上述代码可以看出,明明str1 和str3 都表示字符串“xiaoming”,但是返回确实false。
这是因为String中的equals方法判断的是两个字符串的内容是否相同,而当两个变量是引用类型,则就表示两个变量是否指向同一个存放数据的地址,如果是两个基本数据类型,则就比较是两个变量的值是否相同了。
在上面代码中,因为String中equals表示是内容相同,所以boolean result1 = str1.equals(str2);//会返回true, 即使一个是使用是直接赋值方法,一个是采取的构造方法的定义的,且在JVM的存储的位置也不一样,但是只要内容一样,就会返回true
,但是在==的代码中,String str1 = "xiaoming";
和代码String str3 = new String("xiaoming");
,即使两个字符串表示的内容是一样的,但是==是表示变量是否指向同一个存放数据的地址,代码String str1 = "xiaoming";
中,"xiaoming"是存放在常量池中,而代码String str3 = new String("xiaoming");
中,"xiaoming"是存放在堆中的。所以这两个变量存放的数据地址根本不在一个“容器”中,所以地址肯定不相同,即使内容一样,也无济于事,返回false。