我遇到了这段代码,有点困惑
java.lang.String s = new String("hello");
我不确定什么变量 s 被初始化为 java.lang.String ,以及这个 vs String hold = "hello" 的目的是什么。我试图浏览一些文档,但找不到任何东西。
这真是糟糕的编程风格
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";
然后查看其他答案或副本。
好的,您需要了解常量池(字符串文字池)
当你这样做
String s = "hello";
您实际上是在常量池中设置变量
当你做的时候
String s = new String("hello");
它在常量池中创建一个单独的对象。
在此处阅读更多信息
http://docs.oracle.com/cd/E13150_01/jrockit_jvm/jrockit/geninfo/diagnos/garbage_collect.html
这样做:
String s = "hello";
比这样做更好:
String s = new String("hello");
第二种方法在你这样做时创建一个字符串对象"hello"
,将它传递给String
构造函数,然后创建另一个相同的String
对象。第一种方法只创建一个对象。
您必须首先考虑的是 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 对象指的是不同的内存位置。