带有新运算符和文本的java字符串

带有新运算符和文本的java字符串,java,string,Java,String,假设我们创建一个字符串s,如下所示 String s = new String("Java"); 因此,上述声明将在遇到新操作符时创建一个新对象 假设在同一程序中,我们声明一个新字符串s1,如下所示: String s1 = "Java"; 这将创建一个新对象,还是将它指向Java中的旧对象,因为它已经使用上面的new操作符创建。好的,第二行不会创建新对象,因为您已经在第一行中使用了相同的字符串常量-但是s1和s仍将引用不同的对象 第二行不会创建新对象的原因是字符串常量被合并了-如果多次使用

假设我们创建一个
字符串s
,如下所示

String s = new String("Java");
因此,上述声明将在遇到新操作符时创建一个新对象

假设在同一程序中,我们声明一个新字符串s1,如下所示:

String s1 = "Java";

这将创建一个新对象,还是将它指向Java中的旧对象,因为它已经使用上面的new操作符创建。

好的,第二行不会创建新对象,因为您已经在第一行中使用了相同的字符串常量-但是
s1
s
仍将引用不同的对象

第二行不会创建新对象的原因是字符串常量被合并了-如果多次使用相同的字符串常量,它们都被解析为相同的字符串。当然,在某一点上仍然必须分配一个
String
对象,但对于所有用途,只有一个对象。例如,考虑这个代码:

int x = 0;
for (int i = 0; i < 1000000; i++) {
    String text = "Foo";
    x += text.length();
}
或者换句话说,上面的前四行大致相当于:

String literal = "test";
String a = new String(literal);
String b = new String(literal);
String x = literal;
String y = literal;
创建两个对象

String myString = "Java";

创建一个对象。

为了创建新对象,我们使用new关键字,如果不使用
new
,则无法创建
object

根据第一个实例中的声明,将创建一个新的
对象
,但在第二个实例中,您仅声明一个具有值的变量

所以它不是一个
对象

字符串s1=“foo”文字将在StringPool中创建

字符串s2=“foo”这一次它将检查“foo”文本在StringPool中是否已经可用,因为它现在已经存在,所以s2将引用与s1相同的文本


字符串s3=新字符串(“foo”)“foo”字面值将首先在StringPool中创建,然后通过字符串arg构造函数创建字符串对象,即由于通过新运算符创建对象而在堆中创建“foo”,然后s3将引用它。

当您使用字面值创建字符串时(例如,string str=“Hello”;)对象不是在堆中创建的,它将仅在StringPool中可用,但是,当您使用“new”运算符创建字符串(例如String str=new String(“Hello”))时,StringPool中的对象将与堆中的另一个对象一起创建。因此,我们不必要地创建了两个对象。所以,使用文本创建字符串是首选方法

这个问题似乎离题了,因为它是关于缺乏自我测试的。@Hanky웃潘基:我不同意。测试可能会显示变量具有不同的值,但更难看出第二条语句实际上没有创建新对象不创建新对象,那么我可以自由定义无限引用,
strings1=“Java1”
String s2=“Java2”
etc.,在没有创建任何对象的情况下创建字符串文本?@iamreptar:不,它只是因为前面的语句已经引用了相同的字符串而没有创建新对象。我将在中编辑它。我还有一个问题:当为这个线程编写测试代码时,我的第一种方法是将字符串文本的hashcode与字符串对象的hashcode(s1=“Java”,s2=新字符串(“Java”))进行比较,s1.hashcode()==s2.hashcode()结果为“true”。这让我困惑。我以为这是假的。@Lilith2k3:为什么?哈希代码基于字符串的内容,这两个字符串具有相同的内容。请参阅
String.hashCode
的文档,了解其计算方法的详细信息。@iamreptar:它仅在程序中首次使用该常量时创建字符串。我认为更清楚的说法是,它要求字符串存在,并在必要时创建它。你不能在程序的中间指向那个语句,并且说“这个语句创建一个新的对象”和你可以用<代码>对象X =新对象()一样的方式;代码>后一条语句本身并不创建对象。特别是,如果将该语句放入一个运行一百万次的循环中,仍然只有一个对象。各种构造创建新对象时都没有
new
语句,例如自动装箱和执行时字符串连接。如果您认为第二条语句中使用的字符串“不是对象”,那么这肯定是错误的。(分配给
s1
的值是对
字符串
对象的引用。)这个答案充其量是误导性的,并且可能完全错误,具体取决于最后一句话的含义。
String myString = new String("Java");
String myString = "Java";