大家玩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()方法的使用理解明白了嗎?謝謝觀看,下次再見!
新聞熱點
疑難解答