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-不确定这是否与您指出的重复。问题不是如何比较字符串,而是为什么字符串的行为与数组不同。字符串是不可变的,这意味着它们可以被插入(或缓存)因此,在字符串示例中,两者都是相同的对象,并且在使用==时两者都为真。但是,数组不是不可变的,因此