1. 程式人生 > >Java中字串直接賦值和new一個物件,得到的地址值是什麼樣子的

Java中字串直接賦值和new一個物件,得到的地址值是什麼樣子的

 

public class StringDemo2 {
public static void main(String[] args) {
String s1 = "hello";
String s2 = new String("hello");
String s3 = "hello";

    System.out.println("s1:" + s1.getClass().getName() + "@" + s1.hashCode());
    System.out.println("s2:" + s2.getClass().getName() + "@" + s2.hashCode());
    System.out.println("s3:" + s3.getClass().getName() + "@" + s3.hashCode());

    System.out.println("s1==s2:" + (s1 == s2));
    System.out.println("s1.equals(s2):" + s1.equals(s2));
    System.out.println("s1==s3:" + (s1 == s3));
    System.out.println("s1.equals(s3):" + s1.equals(s3));
}

}

圖片說明

s1==s2結果是false,說明它們的地址值是不同的。但是為什麼s1.getClass().getName() + "@" + s1.hashCode()ode(2/s1.getClass().getName() + "@" 2 s1.hashCode()卻是一樣的???

同問2|評論0|瀏覽2162|收藏0|

分享

3個回答

按贊數排序 

zhangpan_soft

zhangpan_soft   2016.09.04 14:08

java中,所有的引用放在棧記憶體中,所有的值放在堆記憶體中,而堆又分好多塊,new 物件必然開闢對空間,放在大眾的堆空間中,這部分是記憶體獨立的,
所以如果有字串String s1=new String(123);那麼如果有String s2=new String(123);呢麼s1,s2都會被分配記憶體空間,地址就不一樣。
而直接賦值是放在堆空間中的“串池”中,它裡面放的是具體的數值,常量,比如說ASCII,基本資料,等等,這塊區域的數值是共享的。也就是說:
假如有字串String s1 = "123";呢麼如果有字串String s2="123";那麼字串s2是不佔用記憶體空間的,會直接把s2的引用指向“串池”中的“123”,所以s1和s2的地址一樣。
至於直接new 的和直接賦值的,不用說了,存放的記憶體空間都不一樣,自然地址也就不一樣。