public static void main(String[] args) { String s1 = new String("nimei"); String s11 = new String("nimei"); String s2 = "nimei"; String s22 = "nimei"; System.out.println(s1 == s11);//false System.out.println(s2 == s22);//true System.out.println(s1 == s2);//false System.out.println(s1.intern() == s2);//true }
Java中String == 比较的是两个引用指向的地址(对象地址)是否相等
equals(方法) 比较的是两个对象存储的值是否相等
下面直接看Stirng类中对Object equals方法的重写
public boolean equals(Object anObject) { if (this == anObject) { return true; } if (anObject instanceof String) { String anotherString = (String)anObject; int n = count; if (n == anotherString.count) { char v1[] = value; char v2[] = anotherString.value; int i = offset; int j = anotherString.offset; while (n-- != 0) { if (v1[i++] != v2[j++]) return false; } return true; } } return false; }
由以上源码可分析出,
String s = "xx";虚拟机执行步骤包含:从String缓冲池查询是否存在值为"xx"的对象,存在则返回一个引用并赋给s,不存在则在缓冲池创建创建一个新对象。
Stirng s1 = new Stirng("xx");会在heap中新建一个对象,s1指向该对象
s == s1 直接返回true,s.equals(s1)会将s、s1指向的值进行拆分比较值是否不相等,所以若字符串值比较长的话也是相对耗资源的事,可以使用s1.intern() == s进行优化(s1.intern()将s1对象放入缓冲池)则效率会相对提高,程序的效率是对每条语句省出来的。