String str1 = “Hello” ;
这种采用直接赋值的方式,首先 str1 是一个匿名对象,然后在内存中的表现是这样的
栈内存中保存的是 str1 堆内存中保存的是 “Hello” 就这些, 不会占用其它的空间了。
当使用这种方式的时候 :
String str1 = new String("Hello");
在内存中是怎么操作的呢?
首先和在上面的一样, 在栈内存中有一片区域, 存储str1 , 堆内存中存储 “Hello”, str1指向"Hello".
和String str1 = new String("Hello"); 相比 , 他还多了个 new 啊! 有了这个 new ,就不一样了!
在堆内存中,就会再增加一片内存空间, 而且是以 “Hello” 为 内容的.
String str1 = new String("Hello") 这里的 "Hello" 是指向 堆内存中空间中最上面的那个, new String()指向最后申请出来的那片空间, 而最开始申请的那片堆内存空间俨然成了垃圾.
public class Test{
public void main(String []args){
String str1 = "123";
String str2 = "123";
String str3 = "123";
}
}
这里可以看到,都是采用直接赋值的方式,其实在String 中, 直接赋值的方式 是会在 字符串池中保存内容的.
就拿上面的来说,String str1 = "123"; 首先在字符串池中存了这么一个值, 当String str2 = "123" 的时候,因为前面有一个相同的值了,就不会再去堆内存空间中申请那么一片区域了,而是从内存池中拿出那个值来继续使用.