Java字符串和数组中的别名

时间:2019-06-12 20:16:49

标签: java arrays

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

update

我知道在Strings中,当您调用新的String方法时,它将定向到另一个地址。否则,它将使用具有相同String文字的先前地址。 但是,事情不适用于数组。有人可以解释为什么它会导致错误吗?

4 个答案:

答案 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)。