java中对象的创建数量的问题

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对象。

  • 你可以看下这个问题的回答https://ask.csdn.net/questions/7438891
  • 你也可以参考下这篇文章:Java:String类型为什么可以直接赋值?使用new String赋值不可以吗?
  • 除此之外, 这篇博客: Java中的常量池及 String赋值及new String中的 这两者有啥区别? 部分也许能够解决你的问题, 你可以仔细阅读以下内容或跳转源博客中阅读:
  • 直接赋值的说法是字符串直接量
    当程序第一次使用某个字符串直接量时,Java会使用常量池(constant pool) 来缓存该字符串直接量
    如果程序后面再次用到该字符串直接量时,Java会直接使用常量池中存在的字符串直接量

  • 您还可以看一下 颜群老师的Java基础入门课程中的 String常见方法小节, 巩固相关知识点
  • 以下回答由chatgpt基于相关博客总结生成:

    对象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"的引用地址是不同的
        }
    }