Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/372.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中字符串和数组中的别名_Java_Arrays - Fatal编程技术网

java中字符串和数组中的别名

java中字符串和数组中的别名,java,arrays,Java,Arrays,我对字符串中的别名和数组中的别名之间的比较感到困惑 String a = "hello"; String b = "hello"; a == b; >>> true int [] a = {1,2,3}; int [] b = {1,2,3}; a == b >>> false 我知道在字符串中,当您调用新的字符串方法时,它会指向不同的地址。否则,它将采用具有相同字符串文字的前一个地址。 但是,对于阵列来说,情况并不正常。有人能解释为什么它会给出false

我对字符串中的别名和数组中的别名之间的比较感到困惑

String a = "hello";
String b = "hello";
a == b;
>>> true

int [] a = {1,2,3};
int [] b = {1,2,3};
a == b
>>> false
我知道在字符串中,当您调用新的字符串方法时,它会指向不同的地址。否则,它将采用具有相同字符串文字的前一个地址。
但是,对于阵列来说,情况并不正常。有人能解释为什么它会给出false吗?

==
比较内存位置。在第二个示例中,它们是不同的内存位置


对于第一个示例,
Java
在创建
String
时进行一些优化,以确保所有“相等”的字符串文本指向相同的内存位置;因此,比较返回
true

==
比较内存位置。在第二个示例中,它们是不同的内存位置

对于第一个示例,
Java
在创建
String
时进行一些优化,以确保所有“相等”的字符串文本指向相同的内存位置;因此,比较返回
true

小心! ==是指针比较。如果您正在比较完全相同的对象(内存位置),则为真

在您的特定情况下,字符串是不可变的,编译器只创建一次“hello”。这是一个优化

例如,如果像这样更改代码段,==返回false:

String a=“你好”;
字符串b=“地狱”;
b+=“o”;
System.out.println(a==b);
通常,在比较字符串时,使用.equals()。在前面的例子中:

a等于(b)
确实返回true

小心! ==是指针比较。如果您正在比较完全相同的对象(内存位置),则为真

在您的特定情况下,字符串是不可变的,编译器只创建一次“hello”。这是一个优化

例如,如果像这样更改代码段,==返回false:

String a=“你好”;
字符串b=“地狱”;
b+=“o”;
System.out.println(a==b);
通常,在比较字符串时,使用.equals()。在前面的例子中:

a等于(b)
确实返回true


为了补充提比略所说的内容,可能更清楚地表明
{1,2,3}
新int[]{1,2,3}
的缩写,它正在创建一个新的内存位置。如果您使用:

    String a = "hello";
    String b = new String("hello");
它将返回
false
,因为它们指向不同的内存位置(您确实不应该使用
String
执行此操作)

此外,如果您这样做:

    int [] a = {1,2,3};
    int [] b = a;
显然,它现在将返回
true
,因为
b
现在指向与
a
相同的位置

编辑:

为了进一步澄清,请想象数组部分如下所示:

    int [] a = new int[]{1,2,3};
    int [] b = new int[]{1,2,3};

这是与您编写的代码相同的代码,但不是使用速记,但是现在您在不同的位置声明了两个新数组,因此
=
将是
false
,要添加到提比略所说的内容中,可以更清楚地显示
{1,2,3}
新int[]{1,2,3}的速记
正在创建新的内存位置。如果使用:

    String a = "hello";
    String b = new String("hello");
它将返回
false
,因为它们指向不同的内存位置(您确实不应该使用
String
执行此操作)

此外,如果您这样做:

    int [] a = {1,2,3};
    int [] b = a;
显然,它现在将返回
true
,因为
b
现在指向与
a
相同的位置

编辑:

为了进一步澄清,请想象数组部分如下所示:

    int [] a = new int[]{1,2,3};
    int [] b = new int[]{1,2,3};

这是与您编写的代码相同的代码,但不是使用速记,但是现在您在不同的位置声明了两个新数组,因此
==
将是
false
因为
String
是不可变的,Java可以执行优化:当它检测到两个
String
都已初始化时引用相同的值:它只需要为该值创建一个对象,并且可以让两个
String
变量引用它


由于数组是可变的,如果试图进行相同的优化,则更改为
a
(例如
a[1]=7
)将导致
b
也发生更改。此行为不是预期的行为,因此未执行此操作。如果您明确希望执行此行为,您将明确设置
b
以引用
a
引用的内容(例如
int[]b=a
)由于
String
s是不可变的,Java可以执行优化:当它检测到两个
String
s都被初始化为引用相同的值时:它只需要为该值创建一个对象,并且可以让两个
String
变量都引用它


由于数组是可变的,如果试图进行相同的优化,则更改为
a
(例如
a[1]=7
)将导致
b
也发生更改。此行为不是人们所期望的,因此未执行此操作。如果明确希望执行此行为,则应明确设置
b
以引用
a
引用的内容(例如
int[]b=a
)。

字符串是不可变的,这意味着它们可以被插入(或缓存)因此,在字符串示例中,两者都是相同的对象,并且在使用==时都为true。但是,数组不是不可变的,因此您显示的是两个单独的对象,这将等同于false。通常,您不会将字符串与==进行比较,而是使用.equals()@Raedwald-不确定这是否与您指出的重复。问题不是如何比较字符串,而是为什么字符串的行为与数组不同。字符串是不可变的,这意味着它们可以被插入(或缓存)因此,在字符串示例中,两者都是相同的对象,并且在使用==时两者都为真。但是,数组不是不可变的,因此