在Java中,两种字符串初始化方法的区别是什么?

在Java中,两种字符串初始化方法的区别是什么?,java,Java,字符串str=ABC 字符串str2=新字符串abc 在这两种方法中,如果我在寻找hashcode,它会给出相同的hashcode两个表达式都会给出String对象,但它们之间有细微的区别。当您使用new操作符创建字符串对象时,它总是在堆内存中创建一个新对象。另一方面,如果您使用字符串文字语法(例如Java)创建对象,它可能会从字符串池返回一个现有对象,即字符串对象的缓存,该缓存现在在最近的Java版本中移动到堆空间(如果已经存在的话)。否则,它将创建一个新的字符串对象并放入字符串池中以供将来重

字符串str=ABC

字符串str2=新字符串abc


在这两种方法中,如果我在寻找hashcode,它会给出相同的hashcode

两个表达式都会给出String对象,但它们之间有细微的区别。当您使用new操作符创建字符串对象时,它总是在堆内存中创建一个新对象。另一方面,如果您使用字符串文字语法(例如Java)创建对象,它可能会从字符串池返回一个现有对象,即字符串对象的缓存,该缓存现在在最近的Java版本中移动到堆空间(如果已经存在的话)。否则,它将创建一个新的字符串对象并放入字符串池中以供将来重用

我在Toptal问题中看到了解释:

通常,字符串s=Test比字符串s=new-StringTest更有效

在字符串s=Test的情况下,将在字符串池中创建一个值为“Test”的字符串。如果随后创建了另一个具有相同值的字符串,例如字符串s2=Test,它将引用字符串池中的同一对象


但是,如果使用String s=new StringTest,除了在字符串池中创建一个值为“Test”的字符串外,该字符串对象还将被传递给字符串对象的构造函数,即new StringTest,并将创建另一个不在字符串池中且具有该值的字符串对象。因此,每次这样的调用都将创建一个额外的字符串对象,例如String s2=new StringTest将创建一个额外的字符串对象,而不仅仅是重用字符串池中的同一个字符串对象。

没有理由编写新的StringABC。java不是C++。甚至还说,“由于字符串是不可变的,所以不需要使用此构造函数。”