【问题标题】:string memory allocation字符串内存分配
【发布时间】:2011-03-22 14:58:31
【问题描述】:

哪个更好

System.out.println("hello world");

String s="hello world";
System.out.println(s);

【问题讨论】:

  • 这样的微优化通常不值得。

标签: java


【解决方案1】:

这个简单的例子在内存分配方面没有区别。

【讨论】:

    【解决方案2】:

    在这种情况下没有区别。

    了解引用的工作原理以及局部变量与它们所引用的对象不同,这一点很重要。局部变量本身所需的内存是微不足道的;如果它使代码更具可读性,你应该毫不犹豫地声明局部变量。

    例如下面的代码:

    String s1 = "a very long string...";
    String s2 = s1;
    

    这段代码声明了两个String 引用,但它们都引用同一个String 对象。在这种情况下,内存需求不会翻倍。

    您永远不应低估编译器在优化代码方面的聪明程度。考虑以下示例:

    System.out.println("Hello world!");
    System.out.println("Hello world!");
    System.out.println("Hello world!");
    

    上面的sn-p 实际上NOT 将字符串对象"Hello world!" 3 次存储在内存中!文字是 interned 并且只在内存中存储一​​次。

    参考文献

    JLS 3.10.5 String Literals

    每个字符串文字都是对class String 实例的引用。 String 对象有一个常量值。字符串字面量——或者更一般地说,作为常量表达式值的字符串——是“内部”的,以便共享唯一的实例,使用方法String.intern

    相关问题

    【讨论】:

      【解决方案3】:

      没有区别。

      但是,如果你要比较

      String s=new String("hello world");
      System.out.println(s);
      

      System.out.println("hello world");
      

      然后会有一个潜在的差异,因为后一种情况将是字符串内部化的候选者,而前者不会。

      【讨论】:

        【解决方案4】:

        查看JLS 以了解 JVM 如何在内部处理字符串。

        【讨论】:

          猜你喜欢
          • 2021-07-27
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2019-09-18
          • 2016-03-25
          • 2018-06-16
          • 2016-07-01
          • 2012-07-10
          相关资源
          最近更新 更多