Java中字串直接賦值和new一個物件,得到的地址值是什麼樣子的
阿新 • • 發佈:2018-10-31
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()卻是一樣的???
3個回答
按贊數排序
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 的和直接賦值的,不用說了,存放的記憶體空間都不一樣,自然地址也就不一樣。