Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/38.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java中通过new String()和new String(";)初始化字符串有什么区别?_Java_String_Initialization - Fatal编程技术网

Java中通过new String()和new String(";)初始化字符串有什么区别?

Java中通过new String()和new String(";)初始化字符串有什么区别?,java,string,initialization,Java,String,Initialization,Java中以下两种初始化之间的区别是什么 String a=新字符串() String b=新字符串(“”) 很好地解释了这一点 这是两个不同的构造函数调用 public String() 初始化新创建的字符串对象,使其表示 空字符序列。请注意,此构造函数的用法是 不需要,因为字符串是不可变的 初始化新创建的字符串对象,使其表示 与参数相同的字符序列;换句话说,新的 创建的字符串是参数字符串的副本。除非另有明确规定 需要原件的副本,不需要使用此构造函数 因为字符串是不可变的 在第一种情况下,您

Java中以下两种初始化之间的区别是什么

  • 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 = "";