smooth_smoothie
smooth_smoothie

Reputation: 1343

Question about arrays in Java

Can someone explain why, A.equals(B) is false, when I initiate B using int[] B = A.clone() BUT true if I initiate B using int[] B = A?

 int[] A = {1, 2, 3, 4, 5};



    int[] B = A;
    //int[] B = A.clone();

    if(A==B){//true
        System.out.println("Equal");
    }
    if(A.equals(B)){//true
        System.out.println("Equal");

    }

Upvotes: 3

Views: 223

Answers (6)

matei
matei

Reputation: 8685

when you assign B = A, you assign the reference to the same object. With clone() you get a copy of the object. The equality operator (==) tests if both symbols reference the same object where .equals method checks if the two objects have the same value (defined by the implementation of the class)

Upvotes: 0

corsiKa
corsiKa

Reputation: 82559

For comparing arrays in Java, you might want to try

java.util.Arrays.equals(a,b);

If you use a == b they should be different- this compares their memory references.

If you use a.equals(b), it probably inherits from Object, which simply uses ==.

That probably explains why they made Arrays.equals() in the first place. Now why they chose a.equals(b) to not compare elements... hard to say.

Upvotes: 2

StuperUser
StuperUser

Reputation: 10850

int[] B = A;

Makes B point to the same object in memory as A, so not only are they equal, they are the same.

Upvotes: 0

kvista
kvista

Reputation: 5059

Your question is answered precisely by the Javadoc for clone():

http://download.oracle.com/javase/6/docs/api/java/lang/Object.html#clone%28%29

specifically:

[ The clone() method ] Creates and returns a copy of this object. The precise meaning of "copy" may depend on the class of the object. The general intent is that, for any object x, the expression:

 x.clone() != x

will be true, and that the expression:

 x.clone().getClass() == x.getClass()

will be true, but these are not absolute requirements. While it is typically the case that:

 x.clone().equals(x)

will be true, this is not an absolute requirement.

Upvotes: 0

Goran Jovic
Goran Jovic

Reputation: 9508

Apparently, equals method for arrays in Java is comparing reference equality (same as ==).

If you clone it, you have a reference different object - the clone array. But, if you just point another reference to it it's the same.

Upvotes: 4

Jon Skeet
Jon Skeet

Reputation: 1499760

Well if you use

int[] B = A;

then B and A refer to the same object, so trivially they're equal. The first comparison (==) would certainly return false between A and A.clone() as the values refer to different objects. It sounds like arrays don't override equals (e.g. as ArrayList does), hence the clone not being equal to the original under the equals method either.

EDIT: Indeed, from the language specification section 10.7, Array Members:

All the members inherited from class Object; the only method of Object that is not inherited is its clone method.

In other words, the array overrides clone() but not toString / hashCode / equals.

Upvotes: 3

Related Questions