java - 可以分开但相同的数组通过引用永远相等

标签 java arrays

在 java 中,如果你有两个内容相同的数组,但它们是分开构造的,array1 == array2 将为 false,因为 equals 进行引用检查并且它们的引用不同。但能保证他们总是有不同的引用资料吗?例如

public class TestArrayReferences {
    private static final String[] SENTINEL_ARRAY_1 = new String[0];
    private static final String[] SENTINEL_ARRAY_2 = new String[0];

    public static boolean testArrays() {
        return SENTINEL_ARRAY_1 == SENTINEL_ARRAY_2;
    }
}

如果我调用 testArrays,返回的是 false,但它能保证始终为 false 吗?即,是否允许 JVM 检测到 SENTINEL_ARRAY_1 和 SENTINEL_ARRAY_2 始终相同并因此让它们引用相同的数组?

最佳答案

假设它们都是通过分配新数组创建的,而不是通过赋值创建的,不,它们不能引用相同。

数组不像字符串那样是驻留的,因此创建一个新数组会在内存中创建一个新项。这就是为什么您可以创建多个相同长度的新 int 数组,并将项目添加到一个数组而不将它们也添加到另一个。

编辑:还要注意字符串是不可变的,这就是为什么它们可以被保留而不会遇到问题的原因。如果字符串是可变的,则实习将不起作用:

String s1 = "Hello";
String s2 = "Hello";
s1.setchar(0, 'J'); // fictional method to change one char of a String

如果此方法存在,并且字符串被驻留,则 s2 也将设置为“Jello”,除非进行了某种解除驻留。

关于java - 可以分开但相同的数组通过引用永远相等,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26318693/

相关文章:

java - 如何在同一个数组中组合两个元素?

java - spring-boot 为非嵌入式容器启用压缩

java - Maven:提供依赖项的多个版本

javascript - 稀疏数组在 JavaScript 中有哪些用例?

regex - Perl:比较两个文件并打印匹配和不匹配的数据

JavaScript - 将多维数组的键从字符串更改为整数

java - 为什么对Hadoop的这种Maven依赖性阻止JSP进行编译?

Java - awt.* 和 swing.* 包中有哪些可用的布局管理器?

Javascript数组id显示顺序

c++ - 在整数变量中存储二进制数