(1)双引号与 new String() 的区别
在说明 == 与 equals 区别之前,我们首先要了解一下字符串的创建,字符串的创建一般有两种方式,使用双引号创建,如下:
String a = "1234";
使用 new String()方式创建,如下:
String b = new String("1234");
这两种方式都创建了一个字符串常量,从取值上来说是一样的,但是在比较的过程中却有所不同,我们先看一个实例,如下:
public static void main(String[] args) {
String a = "1234";
String b = "1234";
System.out.println("a == b: " + (a == b));
System.out.println("a.equals(b): " + a.equals(b));
String c = new String("1234");
System.out.println("a == c: " + (a == c));
System.out.println("a.equals(c): " + a.equals(c));
}
打印结果:
注意上图中红色边框中的结果,这说明了 new 一个字符串的时候 JVM 会给该字符串重新分配一块儿“堆内存”,而直接使用引号重复创建同一字符串的时候,只会保存常量字符串的一个副本,这被称作“字符串驻留”,会将这个字符串存放到“方法区”中。
(2)== 与 equals 有什么区别
区别很简单,== 比较的是两个引用是否指向同一块地址空间,如果两个引用指向的地址是一致的,那么这两个字符串一定是相等的,而 equals 方法比较的是两个字符串的值是否相等,这也就说明了为什么使用构造器创造两个字符串常量的时候用 == 比较的结果是 false,因为 new 关键字会重新分配新的堆内存,导致两个字符串并不指向同一块内存空间。