String a = new String("123")
在没有本地方法区没有123的情况下,
new string在堆内存,123在本地方法区,那么a放在哪儿。为什么创建对象,他不算在里面
在Java中,当代码 String a = new String("123") 执行时,会首先在常量池中寻找是否存在字符串"123",如果不存在,则将"123"存储到常量池中。然后,将在堆内存中创建一个新的String对象,其值为"123"。
而变量a只是一个引用,它将指向这个新创建的String对象。也就是说,变量a本身并不是一个对象,而只是一个指向对象的引用。
因此,变量a位于栈内存中,用于引用堆内存中的String对象。而这个String对象可以被多个引用所共享,所以并不需要为每个引用都创建一个新的对象。但是,如果后面有对这个String对象进行修改等操作,则会生成新的String对象。
直接赋值的说法是字符串直接量
当程序第一次使用某个字符串直接量时,Java会使用常量池(constant pool) 来缓存该字符串直接量
如果程序后面再次用到该字符串直接量时,Java会直接使用常量池中存在的字符串直接量
对象a存储在堆内存中,这是由于使用了"new String"这种方式创建了一个String对象。对于Java中创建对象时,它不被计入内存使用量的原因是因为Java采用了垃圾回收机制,当一个对象没有被任何引用变量所引用时,垃圾回收机制会标记这个对象为垃圾,使其被清理掉,释放内存空间,因此在计算内存使用量时,不会包括已经被清理的对象。而对于字符串常量池中的字符串,由于它们是共享的,不会随着引用变量的destroy而消失,因此它们会计算在内存使用量中。下面是代码示例:
public class Test{
public static void main(String[] args){
String a = new String("123");
//对象a存储在堆内存中
System.out.println(a == "123"); //false,因为a和"123"的引用地址是不同的
}
}