1

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

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

我不确定什么变量 s 被初始化为 java.lang.String ,以及这个 vs String hold = "hello" 的目的是什么。我试图浏览一些文档,但找不到任何东西。

4

5 回答 5

5

这真是糟糕的编程风格

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");

对比

java.lang.String s = "hello";

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

于 2013-11-12T19:53:44.093 回答
2

好的,您需要了解常量池(字符串文字池)

当你这样做

String s = "hello";

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

当你做的时候

String s = new String("hello");

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

在此处阅读更多信息

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

于 2013-11-12T19:56:22.600 回答
2

这样做:

String s = "hello";

比这样做更好:

String s = new String("hello");

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

于 2013-11-12T19:48:58.653 回答
0

您必须首先考虑的是 Java 中 String 的不可变特性。 http://javarevisited.blogspot.in/2013/03/how-to-create-immutable-class-object-java-example-tutorial.html

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

    String hold2 = "hello"

hold 和 hold2 都引用字符串池中相同的“hello”字符串实例。这意味着两者都引用相同的内存位置。但随着

   String hold2 = new String("hello");

在新位置有一个新字符串“hello”,而 hold 和 hold2 对象指的是不同的内存位置。

于 2013-11-12T19:51:27.207 回答
0

您应该知道的第一件事是 java 中的字符串是不可变的,请阅读THIS。接下来,当您在String s = "hello"幕后进行时,编译器会查看String Pool(在 java 中保存字符串的地方)并检查那里是否hello已经存在字符串。如果是,它指向s同一个字符串对象的引用并返回(Read THIS)。现在,如果您这样做String hold2 = new String("hello");,上述任何事情都不会发生。即使您hello在字符串池中有字符串,它仍然会创建一个新字符串hello并指向hold2它。

于 2013-11-12T19:56:56.917 回答