在基本数据类型中,== 和C语言没什么区别,就是比较数值是否相等。
但是到了Java String的比较中,情况就大不相同了。
先说结论,在String中 == 必须是两个字符串的地址相同,才会返回True
所以,对于字符串的比较,必须要用到 .equals()函数。
现在IDE也会智能报错,比如,下图就已经说出了问题所在。另外再讲一下Java中的常量池问题。
首先这段代码,大家不看结果,想想会输出什么。
package test;
public class TestApplication {
public static void main(String[] args) {
String a = "111";
String b = "111";
String c = new String("111");
if (a == b)
System.out.println("a == b");
if (a == c)
System.out.println("a == c");
System.out.println("------我是分割线---------");
if (a.equals(c))
System.out.println("a equals c");
if (b.equals(c))
System.out.println("b equals c");
}
}
结果:
a == b
------我是分割线---------
a equals c
b equals c
结果解析: 可能会有人想为啥 a==b是成立的呢? 因为,String类是final修饰的,以字面量的形式创建String变量时,jvm会在编译期间就把该字面量("111")放到字符串常量池中,由Java程序启动的时候就已经加载到内存中了。这个字符串常量池的特点就是有且只有一份相同的字面量,如果有其它相同的字面量,jvm则返回这个字面量的引用,如果没有相同的字面量,则在字符串常量池创建这个字面量并返回它的引用。
所以 String b="111";时并没有新建对象,只是把a的地址引用给了b。而C是用的new int,必然会重新创建对象了。
以下就是,equals和string的原型。感兴趣的看看
equals原型
public boolean equals(Object anObject) {
if (this == anObject) {
return true;
}
if (anObject instanceof String) {
String anotherString = (String)anObject;
int n = value.length;
if (n == anotherString.value.length) {
char v1[] = value;
char v2[] = anotherString.value;
int i = 0;
while (n-- != 0) {
if (v1[i] != v2[i])
return false;
i++;
}
return true;
}
}
return false;
}
public final class String
implements java.io.Serializable, Comparable<String>, CharSequence {
/** The value is used for character storage. */
private final char value[];
/** Cache the hash code for the string */
private int hash; // Default to 0
…………//以下省略
}
常量池相关: https://www.cnblogs.com/tongkey/p/8587060.html
Java final解析:http://baijiahao.baidu.com/s?id=1601084106055683243&wfr=spider&for=pc