Java中通过new String()和new String(";)初始化字符串有什么区别?
Java中以下两种初始化之间的区别是什么Java中通过new String()和new String(";)初始化字符串有什么区别?,java,string,initialization,Java,String,Initialization,Java中以下两种初始化之间的区别是什么 String a=新字符串() String b=新字符串(“”) 很好地解释了这一点 这是两个不同的构造函数调用 public String() 初始化新创建的字符串对象,使其表示 空字符序列。请注意,此构造函数的用法是 不需要,因为字符串是不可变的 初始化新创建的字符串对象,使其表示 与参数相同的字符序列;换句话说,新的 创建的字符串是参数字符串的副本。除非另有明确规定 需要原件的副本,不需要使用此构造函数 因为字符串是不可变的 在第一种情况下,您
String a=新字符串()代码>
String b=新字符串(“”)代码>
public String()
初始化新创建的字符串对象,使其表示
空字符序列。请注意,此构造函数的用法是
不需要,因为字符串是不可变的
初始化新创建的字符串对象,使其表示
与参数相同的字符序列;换句话说,新的
创建的字符串是参数字符串的副本。除非另有明确规定
需要原件的副本,不需要使用此构造函数
因为字符串是不可变的
在第一种情况下,您只创建一个
字符串
对象;在第二种情况下,如果“
对象在字符串池中不存在,则创建两个:”
和新字符串
在内部,将调用不同的构造函数
但是,生成的
String
对象的内容将是相同的,相等(a.equals(b)
将返回true
)第一个调用默认构造函数,第二个调用复制构造函数,以便在每种情况下创建一个新字符串,它们几乎是一样的
微小差异(相当微不足道):
newstring()代码>比新字符串(“”)执行时间更短因为复制构造函数做了很多事情
新字符串(“”
将空字符串(“”
)添加到字符串常量池(如果它尚未存在)注意:
newstring(“abc”)
的使用几乎总是不好的,因为您将创建两个字符串,一个在字符串常量池上,另一个在具有相同值的堆上 最后的想法基本上是正确的,但我想补充一点,复制构造函数实际上没有做那么多:
public String(){this.value=new char[0];
}
public String(original){
this.value=original.value;
this.hash=original.hash;
使用常量
“
无论如何都会使用第一个构造函数来创建对象引用,因此使用哪个构造函数并不重要
在任何情况下,我都建议使用字符串literal
”
,因为如果在其他地方使用该字符串,则可以保存对象引用。仅当您确实需要该字符串的副本,而该副本在其他任何地方都没有使用时,才使用该字符串构造函数。从纯实用的角度来看,这些构造之间没有区别,因为从来没有任何理由使用它们中的任何一个。它们既浪费又过于复杂,因此同样毫无意义
要使用空字符串初始化变量,请执行以下操作:
String s = "";
这会更简短、更简单,并且避免创建任何字符串对象,因为intern池中共享的
“
实例肯定已经被其他类加载了。已经有一篇非常类似的文章了。@Joe的可能重复项虽然我很震惊这个问题还不存在,但我不认为这个问题与这个问题是重复的--String(“”
)与“
”。我认为你不应该使用new String()。它不需要初始化,这样做只需要更长的时间。如果我错了,请纠正我。其他区别--newstring()“代码>也很简单,而且打字(意味着写作)所需的时间更少,所以它更可取。@GrijeshChauhan为什么不干脆”
?@johnchen902是的=“
更好,我只是比较了两个问题中给出的选项。此时是否正在创建”
?还是它已经存在于实习字符串池中?@MichaelT谢谢你的提问。如果您之前没有创建另一个”
字符串对象,则将创建该对象。如果您在前面创建了”
字符串对象,则将从字符串池中获取值。我对的读取表明,字符串插入是在类加载时完成的(作为类的常量池的一部分),而不是在调用方法时完成的。因此,在调用该方法时,不会为“
”创建新字符串。只是一个小小的更正(我想)。我发现有趣的是,给定一个百万字符的字符串foo
,语句bar=newstring(foo)
将共享备份存储,但是方法调用foo.equals(bar)
会将备份存储的每个字符与自身进行比较,而不会注意到两个字符串共享同一个备份存储。在java7u40之前,复制构造函数中进行了大量工作。现在,他们已经改变了设计,以便使用相同的后端阵列。在jdk 6中,我们用来在复制构造函数中创建一个新的字符数组:)
public static void main(String[] args) {
String s1 = new String();
String s2 = new String("");
System.out.println(s1.equals(s2)); // returns true.
}
137 public String() {138 this.value = new char[0];
139 }
151 public String(String original) {
152 this.value = original.value;
153 this.hash = original.hash;
154 }
String s = "";