我遇到了这段代码并且有点困惑
java.lang.String s = new String("hello");
我不确定将哪个变量s初始化为java.lang.String,这与vs hold =“hello”的目的是什么。我试着查看一些文档,但找不到任何东西。
答案 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)