当前位置: 代码迷 >> Java相关 >> 码农带你界别String类型的"=="和equals()
  详细解决方案

码农带你界别String类型的"=="和equals()

热度:31   发布时间:2016-04-22 19:30:00.0
码农带你区分String类型的"=="和equals()

大家玩csdn也可以关注我的博客额http://blog.csdn.net/wujiandong25253344

情形一:

String s1= new String("hello");

String s2 = new String("hello");                                                                                

当我们使用new时,每次都会在内存中开辟一个新的空间存放对象的值,

“==”号比较的是s1,s2对象的内存首地址,equals比较的是内存中具体的值
所以(s1==s2)返回false;(s1.equals(s2))返回true;

如下图1所示:

                                                                                                     图1

情形二:

String s1= "hello";
String s2 = "hello";
字符串“="号赋值只有在遇到代码时才缓存到常量池中,
如上图两行代码,当String s1= "hello";执行时,先会在heap中的常量池(String pool)中查找有没有"hello"的字符串存在,如果存在,就返回字符串的首地址,
如果不存在,就在常量池中新建一个"hello",并返回字符串的首地址。我们可以看出,第一行代码是不存在,所以返回字符串的首地址。

当执行到String s2 = "hello";我们从常量池中发现"hello"已经存在,返回原字符串的内存首地址

所以(s1==s2),返回的是true;(s1.equals(s2))返回true;

如下图2所示:

                                                                                             图 2

情形三:

String s1= "hello";
String s2= new String("hello");

s1是存放的常量池中的"hello"的首地址,s2是new出来的对象,所以新建一块内存,存放的是新内存中"hello"的首地址。

所以(s1==s2),返回的是false;(s1.equals(s2))返回true;

如下图3所示:

 

                                                                                                          图 3

 

各位看官,困惑你们已久的String字符串中"=="与equals()方法的使用理解明白了吗?谢谢观看,下次再见!

 

  相关解决方案