理解java.lang.String之间的区别s = new String(“hello”)和String hold =“hello”

时间:2013-11-12 19:46:01

标签: java android

我遇到了这段代码并且有点困惑

java.lang.String s = new String("hello");

我不确定将哪个变量s初始化为java.lang.String,这与vs hold =“hello”的目的是什么。我试着查看一些文档,但找不到任何东西。

5 个答案:

答案 0 :(得分:4)

这是非常糟糕的编程风格

java.lang.String s = new String("hello");

请记住,java.lang中的所有课程都会自动导入。如果在同一个包中有一个名为String的类,它也会被导入但会影响java.lang.String类。这可能是完全符合

类型的原因
java.lang.String s;

但在这种情况下,您只能为其分配java.lang.String引用,因为该类为final,因此无法扩展。传统的做法是

java.lang.String s = new java.lang.String("hello");

如果你问的是

java.lang.String s = new String("hello");

vs

java.lang.String s = "hello";

然后查看其他答案或副本。

答案 1 :(得分:2)

这样做:

String s = "hello";

比这样做更好:

String s = new String("hello");

第二种方法在执行"hello"时创建一个字符串对象,将其传递给String构造函数,然后创建另一个相同的String对象。第一种方法只创建一个对象。

答案 2 :(得分:2)

好的,您需要了解常量池(String literal pool)

当你这样做时

String s = "hello";

您实际上是在常量池中设置变量

当你做的时候

String s = new String("hello");

它在常量池中创建一个单独的对象。

在这里阅读更多相关信息

  

http://docs.oracle.com/cd/E13150_01/jrockit_jvm/jrockit/geninfo/diagnos/garbage_collect.html

答案 3 :(得分:0)

首先要注意的是java中String的不可变特性。 http://javarevisited.blogspot.in/2013/03/how-to-create-immutable-class-object-java-example-tutorial.html

String hold ="你好"使用字符串的不可变特性。所以,当你这样做时,

    String hold2 = "hello"

hold和hold2都引用了" hello"的相同实例。字符串池中的字符串。这意味着两者都指向相同的内存位置。 但是

   String hold2 = new String("hello");

有一个新的字符串"你好"在一个新的位置,hold和hold2对象引用不同的内存位置。

答案 4 :(得分:0)

你应该知道的第一件事是java中的字符串是不可变的读THIS。接下来当您在场景后面String s = "hello"时,会发生的事情是编译器查看String Pool(在java中保存字符串的位置)并检查是否已存在hello字符串。如果是,则将引用s指向同一个字符串对象并返回(读取THIS)。现在,如果你做String hold2 = new String("hello");,上述任何事情都不会发生。即使您在字符串池中有hello字符串,它仍会创建一个新字符串hello并将引用hold2指向它。