如果我将String声明为
String test=new String("testing");
和
String test1="testing1"
由于String是JAVA中的一个类,test1如何成为一个String对象而不使用新的Operator.Also,当使用新的Operator时,为新的String(“testing”)分配内存,所以在test1的情况下如何分配的内存? 此外,当字符串被中断时,如果两个字符串具有相同的值,那么String实习生池中的字符串存储一次是什么?
答案 0 :(得分:2)
我们首先考虑一下String test=new String("testing");
现在这个String test1="testing1"
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?