声明字符串对象时的困惑

时间:2013-08-11 13:16:18

标签: java string memory

如果我将String声明为

String test=new String("testing");

String test1="testing1"

由于String是JAVA中的一个类,test1如何成为一个String对象而不使用新的Operator.Also,当使用新的Operator时,为新的String(“testing”)分配内存,所以在test1的情况下如何分配的内存? 此外,当字符串被中断时,如果两个字符串具有相同的值,那么String实习生池中的字符串存储一次是什么?

5 个答案:

答案 0 :(得分:2)

我们首先考虑一下String test=new String("testing");

  • 它在Heap中创建一个String对象。在字符串池中完成检查以确定池中是否存在此字符串。

现在这个String test1="testing1"

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

intern():在使用new()构造对象时使用它,并在该对象上调用intern()然后首先在Stirng池中完成检查(如果该String已存在)是否直接使用

答案 1 :(得分:1)

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

使用new使用构造函数创建String时,它在Java中表现为普通对象。

看一下这个例子:

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

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

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

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

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

答案 2 :(得分:0)

使用时

String test1="testing1"

然后它意味着您只存储每个不同字符串值的一个副本

但是

String test=new String("testing");

为您提供一个新的字符串对象。

答案 3 :(得分:0)

考虑你的第二个任务是:

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

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

问题是,你不能使用像“test1是一个String对象”这样的草率措辞。它不是。它是对String对象的引用或null。这就是它的全部。

答案 4 :(得分:0)

每次创建字符串文字时,JVM都会先检查字符串常量池。如果池中已存在该字符串,则返回对池化实例的引用。如果池中不存在字符串,则会创建一个新的字符串实例并将其放置在池中。例如:

String s1 =" Welcome";
String s2 =" Welcome&#34 ;; //不会创建新实例

在上面的例子中,只会创建一个对象。首先,JVM将找不到任何字符串对象,其值为"欢迎"在字符串常量池中,因此它将创建一个新对象。之后,它会找到值为#34;欢迎"的字符串。在池中,它不会创建新对象,但会将引用返回给同一个实例。

更多访问 http://www.javatpoint.com/java-string