【问题标题】:Explain the clone() function in java解释java中的clone()函数
【发布时间】:2015-10-10 06:27:48
【问题描述】:

以下代码块的输出为“假”。为什么?

byte[] a = {1,2,3};
byte[] b = (byte[]) a.clone();
System.out.print(a==b);

【问题讨论】:

  • 希望这会有所帮助:stackoverflow.com/questions/8392771/…
  • 我不认为这是重复的。另一个问题问“为什么a.equals(b) 是假的”,这个问题问“为什么a == b 是假的”。另一个问题的答案是关于equals,并且不涉及身份(当然,他们为什么会这样?),但这是这里的关键主题。在使用 Java 时,这些主题的区别是至关重要的。

标签: java arrays


【解决方案1】:

== 是 Java 中的 identity 运算符。这意味着,它检查两个对象是否相同。这与逻辑相等无关,与包含相同的值无关。这是关于成为同一个对象。

在您的示例中,它们不是同一个对象。数组的 clone 方法创建一个新对象,其内容与原始对象相同。新对象将具有相同的内容,但将具有自己的标识。这是一个新的对象,不同于原来的对象。

相比之下,equals 方法是关于逻辑相等的。也就是说,两个对象包含相等的值。克隆数组时,原始数组和克隆数组相等,因为它们具有相同的值。但它们并不完全相同,因为它们具有不同的身份。关于Java的==操作符和equals方法的约定:

  • 如果两个数组相等,则它们不一定相同
  • 如果两个数组相同,则它们必然相等

身份的重要性在于,当两个数组变量具有相同的身份时(都指向同一个对象),那么修改其中一个就会出现同时修改两者。当两个数组相等但不相同时,您可以修改一个而不影响另一个:它们是完全独立的对象。

【讨论】:

    【解决方案2】:

    array 不会覆盖 equals 方法。所以它将进行参考相等检查,在这种情况下是错误的

    【讨论】:

      【解决方案3】:

      因为 a 和 b 没有引用同一个对象。当你使用 clone() 函数时,会在 java 中创建一个新的引用对象。

      【讨论】:

      • '==' 运算符是否只使用检查两个对象的内存位置?
      • 在java中没有指针的概念..但是JVM中对象的引用地址。 == 寻找它们是否“完全”相同 - 这意味着相同的对象(引用地址相同)。这里需要注意的一点是,我们之所以使用 equal() 函数,是因为您可以比较对象的内容,无论位置如何,都可以返回 true 或 false。
      • 所以如果我在这里使用了 equals() 那么输出应该是真的吗?
      • byte 是原始类型 - 您需要使用 Arrays.equals()。 stackoverflow.com/questions/9499560/…
      【解决方案4】:

      在您的输出中,您正在比较不同对象的两个实例,它们并不相同。将此视为存储对象的内存位置。所以false打印输出不是由于克隆,而是比较。

      克隆意味着您创建具有相同值的对象的副本。这究竟意味着什么没有定义:克隆通常不是深度克隆,因此克隆对象A -> B 引用Object c,然后通常c 将被AB 引用.

      一个很好的参考是Javadoc 和 Joshua Bloch 的 Effective Java Item 11:'Override clone judiciously'

      【讨论】:

      • 所以 clone() 函数不会给出相同的内存位置,而是给出具有不同内存位置的相同数据?
      【解决方案5】:
      byte[] a = {1,2,3};
      byte[] b = a.clone();
      boolean isEqual = Arrays.equals(a, b);
      System.out.print(isEqual);
      

      克隆详情:http://www.javatpoint.com/object-cloning

      【讨论】:

        【解决方案6】:

        认为您可能会尝试比较数组中的榆树。

        for(int i = 0; i<a.length; i++)
        { System.out.println(a[i] == b[i]);}
        

        【讨论】:

          猜你喜欢
          • 2016-05-08
          • 2020-12-16
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2010-09-10
          • 2016-08-06
          • 1970-01-01
          相关资源
          最近更新 更多