关于 equals 和 == 的一些思考

(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关键字分配新空间

注意上图中红色边框中的结果,这说明了 new 一个字符串的时候 JVM 会给该字符串重新分配一块儿“堆内存”,而直接使用引号重复创建同一字符串的时候,只会保存常量字符串的一个副本,这被称作“字符串驻留”,会将这个字符串存放到“方法区”中。

(2)== 与 equals 有什么区别

区别很简单,== 比较的是两个引用是否指向同一块地址空间,如果两个引用指向的地址是一致的,那么这两个字符串一定是相等的,而 equals 方法比较的是两个字符串的值是否相等,这也就说明了为什么使用构造器创造两个字符串常量的时候用 == 比较的结果是 false,因为 new 关键字会重新分配新的堆内存,导致两个字符串并不指向同一块内存空间。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值