我对字符串中的别名和数组中的别名之间的比较感到困惑。
update
我知道在Strings中,当您调用新的String方法时,它将定向到另一个地址。否则,它将使用具有相同String文字的先前地址。 但是,事情不适用于数组。有人可以解释为什么它会导致错误吗?
答案 0 :(得分:0)
==
比较内存位置。在第二个示例中,它们是不同的内存位置。
对于第一个示例,Java
在创建String
时进行了一些优化,以确保所有“相等”的字符串文字都指向相同的内存位置;因此,比较返回true
答案 1 :(得分:0)
当心! ==是指针比较。如果要比较完全相同的对象(内存位置),则为true。
在您的特定情况下,String是不可变的,并且编译器仅创建一次“ hello”。这是一种优化。
例如,如果您像这样更改代码段,则==返回false:
String a = "hello";
String b = "hell";
b += "o";
System.out.println(a == b);
通常在比较字符串时,使用.equals()。因此,在前面的示例中:
a.equals(b)
返回true。
HTH!
答案 2 :(得分:0)
要补充Tiberiu所说的话,可能更清楚地表明{1,2,3}
是new int[]{1, 2, 3}
的简写, String a = "hello";
String b = new String("hello");
正在建立新的存储位置。如果您使用:
false
它将返回String
,因为它们指向不同的内存位置(您绝对不应该使用 int [] a = {1,2,3};
int [] b = c;
这样做。
此外,如果您这样做:
true
很明显,由于b
现在指向与a
相同的位置,因此它现在将返回 int [] a = new int[]{1,2,3};
int [] b = new int[]{1,2,3};
。
编辑:
要尝试进一步阐明它,请想象一下数组部分看起来像这样:
==
这是与您编写的代码相同的代码,但不是简写形式,但是现在您应该在不同位置声明两个新数组,因此应该更加清楚,所以false
将是import pandas as pd
# read the csv into df
df = pd.read_csv("file.csv")
# take only the rows where 'Body' has a value and only columns ['Body', 'CreatedDate']
df = df.loc[df['Body'].notnull(),['Body', 'CreatedDate']]
print(df)
。
答案 3 :(得分:0)
由于String
是不可变的,因此Java可以执行优化:当它检测到两个String
都被初始化为引用相同的值时,它只需为其创建一个对象。值一次,并且可以同时引用两个String
变量。
由于数组是可变的,因此,如果尝试进行相同的优化,则对a
(例如a[1]=7
)的更改也会导致b
的更改。这种行为不是人们所期望的,因此没有完成。如果您明确希望该行为,则可以将b
明确设置为引用a
所引用的内容(例如int[] b = a
)。