SCP记忆体中的物件

时间:2018-12-08 08:42:21

标签: java string

String s = new String("test");

为上述目的创建了一个对象进行测试,但是如果我在不使用new关键字的情况下将字符串文字分配给字符串变量该怎么办,在SCP中为此对象创建的内存将被视为对象吗?如果是这样,没有new关键字怎么办?

String s = "test";

我是说"test"被认为是一个对象?

1 个答案:

答案 0 :(得分:1)

String s = "test";

这里s指的是 interned 字符串对象。这意味着,字符序列“ test”将存储在中央位置,并且每当再次使用相同的文字“ test”时,JVM都不会创建新的String对象,而是使用缓存的String的引用。

String s1 = new String("test");

String s和s1都为您提供String对象,但是它们之间有细微的差别。使用new()运算符创建String对象时,它总是在堆内存和SCP中创建一个新对象。另一方面,如果您使用String文字语法创建对象,例如“测试”,它可能会从String池(Perm gen空间中String对象的缓存,现在已经在最近的Java版本中移至堆空间)中返回一个现有对象,如果已经存在的话。否则,它将创建一个新的字符串对象并将其放入字符串池中以备将来重用,因此在这种情况下,我们将:

s1 == s // is false
s1.equals(s) // is true