【问题标题】:From which memory area is my string called?我的字符串是从哪个内存区域调用的?
【发布时间】:2016-09-30 05:41:14
【问题描述】:
public class Do {

    static String s="Instance";

    public static void method(String s){
        s="Add";
    }

    public static void main(String[] args) {
        Do d=new Do();
        s="new Instance";
        String s="Local";
        method(s);
        System.out.println(s);
        System.out.println(d.s);
    }
}

输出是:

Local

new Instance

在这里,我将静态全局变量设为“Instance”,然后在 main 方法中再次使用“New Instance”对其进行初始化。
我的问题是“Instance”、“New Instance”和“Local”将在哪个内存区域以及如何?

【问题讨论】:

  • 它们都将进入字符串常量池(Java 8 中的元空间)

标签: java string methods static static-methods


【解决方案1】:

由于您在没有使用 new 关键字的情况下声明了一个字符串变量,它们将在字符串常量池中占有一席之地。我没有看到与此代码混淆的任何部分。如果你已经声明了像

这样的变量
String s = new String("local");

那么这将在堆和字符串常量池上创建。 但是了解字符串池变化的要点是,从 java 1.7 开始,字符串池已转移到堆,并且您不再受限于固定大小的 permgen 空间。

【讨论】:

  • 我知道这一点,但只需逐行证明输出的合理性:“本地”和“新实例”。 s="Instance" 在哪里以及如何保存以及 s="local" 在哪里保存?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-03-25
  • 2016-06-24
  • 1970-01-01
相关资源
最近更新 更多