String s = new String("test");
为上述目的创建了一个对象进行测试,但是如果我在不使用new
关键字的情况下将字符串文字分配给字符串变量该怎么办,在SCP中为此对象创建的内存将被视为对象吗?如果是这样,没有new
关键字怎么办?
String s = "test";
我是说"test"
被认为是一个对象?
答案 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