您的位置:首页 > 其它

关于 equals 和 == 的一些思考

2017-06-03 20:49 169 查看

(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 关键字会重新分配新的堆内存,导致两个字符串并不指向同一块内存空间。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: