4

如果我将字符串声明为

String test=new String("testing");

String test1="testing1"

由于 String 是 JAVA 中的一个类,test1 如何在不使用 new Operator 的情况下成为 String Object。此外,当使用 new Operator 时,会为 new String("testing") 分配内存,所以在 test1 的情况下,内存是如何分配的? 此外,当字符串被实习时,如果两个字符串具有相同的值,那么字符串在字符串实习池中存储一次的引用是什么?

4

4 回答 4

2

让我们首先考虑这个String test=new String("testing");

  • 它在堆中创建一个字符串对象。在字符串池中不检查该字符串是否存在于池中。

现在这个String test1="testing1"

  • 它在字符串池中而不是在堆中创建字符串。在创建之前检查该字符串是否已经存在于池中。如果是,则返回其引用,否则在池中创建一个新字符串并返回其引用。基本上这是一个字符串字面量,它被放入常量池中,用于内存优化和可重用性。

intern():当你使用 new() 构造一个对象并在该对象上调用 intern() 时使用它,然后首先在 Stirng 池中检查该字符串是否已经存在,如果是则直接使用

于 2013-08-11T13:32:50.503 回答
1

Java 为无需调用构造函数而创建的字符串提供了单独的内存new。每次创建这样的字符串时,Java 都会检查该字符串是否已经在此内存中。如果是,则 Java 设置对新字符串的相同引用,直到其中一个发生更改。

当您使用构造函数创建 String 时,new它的行为就像 Java 中的普通对象。

看看这个例子:

String s1 = "Test";
String s2 = "Test";

当您将此字符串与==运算符进行比较时,它将返回 true。s1.equals(s2)也将返回 true。

如果您使用这样的构造函数创建 String 对象,它看起来会有所不同:

String s1 = new String("Test");
String s2 = new String("Test");

现在,当您将此字符串与==运算符进行比较时,它将返回 false,因为此字符串的引用现在不同(您创建了 2 个唯一的字符串对象)。但是,如果您使用s1.equals(s2)它,它将按预期返回 true。

于 2013-08-11T13:32:39.120 回答
0

当您使用

String test1="testing1"

那么这意味着您只存储每个不同字符串值的一个副本

String test=new String("testing");

给你一个新的字符串对象。

于 2013-08-11T13:21:32.147 回答
0

考虑你的第二个任务是:

String1 test1 = System.getenv("PATH");

在这里,test1 很可能也是对 String 对象的引用,而不使用 new()。您可以将现有对象的引用分配给新变量。那么问题出在哪里?

问题是,您不能使用诸如“test1 是一个字符串对象”之类的草率措辞。它不是。它是对 String 对象或 null 的引用。这就是全部。

于 2013-08-11T13:22:02.513 回答