关于java String的“==”和equals()比较、引用的小问题

 

这是一个老生常谈的问题了,不过我最近才仔细看。

一点体会,笔而记之。

 

先看这几句代码

  

结果为:

true

true

 

这个结果说明什么呢?

==在java中是比较引用的,即在内存中的地址。而String的equals()是比较字符串的内容。

 

第二个true无可争议,因为s1和s2的内容显然 相同。

 

第一个true呢?

这说明s1和s2的地址相同,s1和s2的地址为什么会相同?

查阅资料,发现 :

String s1 = "String";

这种方式,java首先会在缓冲区查找是否有"String"这个常量对象,有就直接将其地址赋给s1,没有就创建一个"String",然后将其赋给s1;然后        

String s2 = "String";

java同样会在缓冲区中查找"String",这次能查找到了,因为s1创建了一个"String",所以会将其地址赋给s2,如此,s1和s2便有了相同的地址。

 

 

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

 

 

 

OK。

再看这一段代码

  

结果为:

false

true

 

第二个true同样无争议。

 

第一个false说明s3和s4不是指向同一地址。

查阅资料发现,

String s3 = new String("String");会直接在内存中开辟一个空间存储一个"String",并讲引用赋给s3;

同样 String s4 = new String("String");也会开辟一个空间,降低至给s4;

所以s3和s4的地址不一样。

   即 

System.out.println(s3 == s4); 会打印出false。

 

 

 

 

 

 

///*/

 

关于String的equals方法:

这是直接从jdk源码复制的equals方法代码:

 

java的String是用字符数组模拟的。

从上面的代码可以看出String的equals()的工作原理——

1、首先比较引用,如果引用相同,返回true;

2、比较类型,如果不是比较的不是String对象,返回false;

3、比较长度,字符串长度不等时,返回false;

4、逐个字符比较两个字符串,遇到不一样的字符,返回false;

5、到最后都一致,返回ture;

 

 

 

 

 

 

 

评论 10
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值