由于JVM在方法区域中将内存分配给静态变量类型。但是当谈到静态字符串类型时它会从方法区域引用堆区域,或者它在方法区域中提供内存。如果它引用堆区域,那么String将具有相同的行为(对于下面的示例)?
示例:
static String s1 = new String("Aman");
static String s2 = "Aman";
答案 0 :(得分:3)
您将变量 db.test.update(
{'_id' : ObjectId("599a910be15dad0b144363d7"), 'categories.subId': '1.1'},
{
$set : {
'categories.$.subTitle' : 'New title'
}
}
)
和var json = "";
using (WebClient client = new WebClient())
{
json = client.DownloadString("https://www.reddit.com/r/wallpaper/hot.json?count=25");
JObject data = JObject.Parse(json);
string dat2 = data["url"].Value<string>();
}
与他们引用的对象混为一谈。
对象在堆中。文字s1
位于堆的字符串池细分中。
变量是静态的,属于类。
答案 1 :(得分:0)
由于JVM在“方法区域”中将内存分配给静态变量类型。
是的,你是对的,因为静态变量是类级变量,因为它们是反射数据(类相关数据,而不是实例相关)的一部分,它们存储在 PermGenSpace&gt;中。堆的方法区部分,
但是当涉及到静态字符串类型时它会引用堆区域 从方法区域或它在方法区域中提供内存。
查看对象总是只获取内存到堆区域,无论如何,但是静态引用变量将存储在方法区域中。
来到你的代码,
static String s1 = new String("Aman");
上面的代码行将通过new关键字创建两个对象1st对象,通过string literal创建第二个对象&#34; Aman&#34;在堆内存中,但请记住字符串文字将存储在 StringConstantPool 中,并从StringConstantPool中引用堆中的第二个对象,然后将堆中对象的引用分配给引用变量,即存在于MethodArea中。
static String s2 = "Aman";
现在,当编译器执行上面的行时,它会检查&#34; Aman&#34;已经在StringConstantPool中,它不会创建另一个对象,而是将已经在堆内存中的同一对象返回到方法区域中的静态引用s2。
我希望它会有所帮助。