Skip to content

Commit ae90711

Browse files
nboseckerpivovarit
authored andcommitted
Added equals()/hashcode() (eugenp#646)
1 parent e67584d commit ae90711

File tree

8 files changed

+337
-0
lines changed

8 files changed

+337
-0
lines changed
Lines changed: 67 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,67 @@
1+
package org.baeldung.equalshashcode.entities;
2+
3+
import java.util.ArrayList;
4+
import java.util.HashSet;
5+
6+
public class ComplexClass {
7+
8+
private ArrayList<?> genericArrayList;
9+
private HashSet<Integer> integerHashSet;
10+
11+
public ComplexClass(ArrayList<?> genericArrayList,
12+
HashSet<Integer> integerHashSet) {
13+
super();
14+
this.genericArrayList = genericArrayList;
15+
this.integerHashSet = integerHashSet;
16+
}
17+
18+
@Override
19+
public int hashCode() {
20+
final int prime = 31;
21+
int result = 1;
22+
result = prime
23+
* result
24+
+ ((genericArrayList == null) ? 0 : genericArrayList.hashCode());
25+
result = prime * result
26+
+ ((integerHashSet == null) ? 0 : integerHashSet.hashCode());
27+
return result;
28+
}
29+
30+
@Override
31+
public boolean equals(Object obj) {
32+
if (this == obj)
33+
return true;
34+
if (obj == null)
35+
return false;
36+
if (!(obj instanceof ComplexClass))
37+
return false;
38+
ComplexClass other = (ComplexClass) obj;
39+
if (genericArrayList == null) {
40+
if (other.genericArrayList != null)
41+
return false;
42+
} else if (!genericArrayList.equals(other.genericArrayList))
43+
return false;
44+
if (integerHashSet == null) {
45+
if (other.integerHashSet != null)
46+
return false;
47+
} else if (!integerHashSet.equals(other.integerHashSet))
48+
return false;
49+
return true;
50+
}
51+
52+
protected ArrayList<?> getGenericArrayList() {
53+
return genericArrayList;
54+
}
55+
56+
protected void setGenericArrayList(ArrayList<?> genericArrayList) {
57+
this.genericArrayList = genericArrayList;
58+
}
59+
60+
protected HashSet<Integer> getIntegerHashSet() {
61+
return integerHashSet;
62+
}
63+
64+
protected void setIntegerHashSet(HashSet<Integer> integerHashSet) {
65+
this.integerHashSet = integerHashSet;
66+
}
67+
}
Lines changed: 54 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,54 @@
1+
package org.baeldung.equalshashcode.entities;
2+
3+
public class PrimitiveClass {
4+
5+
private boolean primitiveBoolean;
6+
private int primitiveInt;
7+
8+
public PrimitiveClass(boolean primitiveBoolean, int primitiveInt) {
9+
super();
10+
this.primitiveBoolean = primitiveBoolean;
11+
this.primitiveInt = primitiveInt;
12+
}
13+
14+
protected boolean isPrimitiveBoolean() {
15+
return primitiveBoolean;
16+
}
17+
18+
@Override
19+
public int hashCode() {
20+
final int prime = 31;
21+
int result = 1;
22+
result = prime * result + (primitiveBoolean ? 1231 : 1237);
23+
result = prime * result + primitiveInt;
24+
return result;
25+
}
26+
27+
@Override
28+
public boolean equals(Object obj) {
29+
if (this == obj)
30+
return true;
31+
if (obj == null)
32+
return false;
33+
if (getClass() != obj.getClass())
34+
return false;
35+
PrimitiveClass other = (PrimitiveClass) obj;
36+
if (primitiveBoolean != other.primitiveBoolean)
37+
return false;
38+
if (primitiveInt != other.primitiveInt)
39+
return false;
40+
return true;
41+
}
42+
43+
protected void setPrimitiveBoolean(boolean primitiveBoolean) {
44+
this.primitiveBoolean = primitiveBoolean;
45+
}
46+
47+
protected int getPrimitiveInt() {
48+
return primitiveInt;
49+
}
50+
51+
protected void setPrimitiveInt(int primitiveInt) {
52+
this.primitiveInt = primitiveInt;
53+
}
54+
}
Lines changed: 62 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,62 @@
1+
package org.baeldung.equalshashcode.entities;
2+
3+
public class Rectangle extends Shape {
4+
private double width;
5+
private double length;
6+
7+
public Rectangle(double width, double length) {
8+
this.width = width;
9+
this.length = length;
10+
}
11+
12+
@Override
13+
public double area() {
14+
// A = w * l
15+
return width * length;
16+
}
17+
18+
@Override
19+
public double perimeter() {
20+
// P = 2(w + l)
21+
return 2 * (width + length);
22+
}
23+
24+
@Override
25+
public int hashCode() {
26+
final int prime = 31;
27+
int result = 1;
28+
long temp;
29+
temp = Double.doubleToLongBits(length);
30+
result = prime * result + (int) (temp ^ (temp >>> 32));
31+
temp = Double.doubleToLongBits(width);
32+
result = prime * result + (int) (temp ^ (temp >>> 32));
33+
return result;
34+
}
35+
36+
@Override
37+
public boolean equals(Object obj) {
38+
if (this == obj)
39+
return true;
40+
if (obj == null)
41+
return false;
42+
if (getClass() != obj.getClass())
43+
return false;
44+
Rectangle other = (Rectangle) obj;
45+
if (Double.doubleToLongBits(length) != Double
46+
.doubleToLongBits(other.length))
47+
return false;
48+
if (Double.doubleToLongBits(width) != Double
49+
.doubleToLongBits(other.width))
50+
return false;
51+
return true;
52+
}
53+
54+
protected double getWidth() {
55+
return width;
56+
}
57+
58+
protected double getLength() {
59+
return length;
60+
}
61+
62+
}
Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
package org.baeldung.equalshashcode.entities;
2+
3+
public abstract class Shape {
4+
public abstract double area();
5+
6+
public abstract double perimeter();
7+
}
Lines changed: 47 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,47 @@
1+
package org.baeldung.equalshashcode.entities;
2+
3+
import java.awt.Color;
4+
5+
public class Square extends Rectangle {
6+
7+
Color color;
8+
9+
public Square(double width, Color color) {
10+
super(width, width);
11+
this.color = color;
12+
}
13+
14+
@Override
15+
public int hashCode() {
16+
final int prime = 31;
17+
int result = super.hashCode();
18+
result = prime * result + ((color == null) ? 0 : color.hashCode());
19+
return result;
20+
}
21+
22+
@Override
23+
public boolean equals(Object obj) {
24+
if (this == obj)
25+
return true;
26+
if (!super.equals(obj))
27+
return false;
28+
if (getClass() != obj.getClass())
29+
return false;
30+
Square other = (Square) obj;
31+
if (color == null) {
32+
if (other.color != null)
33+
return false;
34+
} else if (!color.equals(other.color))
35+
return false;
36+
return true;
37+
}
38+
39+
protected Color getColor() {
40+
return color;
41+
}
42+
43+
protected void setColor(Color color) {
44+
this.color = color;
45+
}
46+
47+
}
Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,39 @@
1+
package org.baeldung.equalshashcode.entities;
2+
3+
import java.util.ArrayList;
4+
import java.util.HashSet;
5+
6+
import org.junit.Assert;
7+
import org.junit.Test;
8+
9+
public class ComplexClassTest {
10+
11+
@Test
12+
public void testEqualsAndHashcodes() {
13+
14+
ArrayList<String> strArrayList = new ArrayList<String>();
15+
strArrayList.add("abc");
16+
strArrayList.add("def");
17+
ComplexClass aObject = new ComplexClass(strArrayList, new HashSet<Integer>(45,67));
18+
ComplexClass bObject = new ComplexClass(strArrayList, new HashSet<Integer>(45,67));
19+
ComplexClass cObject = new ComplexClass(strArrayList, new HashSet<Integer>(45,67));
20+
21+
ArrayList<String> strArrayListD = new ArrayList<String>();
22+
strArrayListD.add("lmn");
23+
strArrayListD.add("pqr");
24+
ComplexClass dObject = new ComplexClass(strArrayListD, new HashSet<Integer>(45,67));
25+
26+
// equals()
27+
Assert.assertTrue(aObject.equals(aObject));
28+
Assert.assertTrue(aObject.equals(bObject) && bObject.equals(aObject));
29+
Assert.assertTrue(aObject.equals(bObject));
30+
Assert.assertTrue(bObject.equals(cObject));
31+
Assert.assertTrue(aObject.equals(cObject));
32+
// hashCode()
33+
Assert.assertTrue(aObject.hashCode() == bObject.hashCode());
34+
// non-equal objects are not equals() and have different hashCode()
35+
Assert.assertFalse(aObject.equals(dObject));
36+
Assert.assertFalse(aObject.hashCode() == dObject.hashCode());
37+
}
38+
39+
}
Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
package org.baeldung.equalshashcode.entities;
2+
3+
import org.junit.Assert;
4+
import org.junit.Test;
5+
6+
public class PrimitiveClassTest {
7+
8+
@Test
9+
public void testTwoEqualsObjects() {
10+
11+
PrimitiveClass aObject = new PrimitiveClass(false, 2);
12+
PrimitiveClass bObject = new PrimitiveClass(false, 2);
13+
PrimitiveClass cObject = new PrimitiveClass(false, 2);
14+
PrimitiveClass dObject = new PrimitiveClass(true, 2);
15+
16+
// equals()
17+
Assert.assertTrue(aObject.equals(aObject));
18+
Assert.assertTrue(aObject.equals(bObject) && bObject.equals(aObject));
19+
Assert.assertTrue(aObject.equals(bObject));
20+
Assert.assertTrue(bObject.equals(cObject));
21+
Assert.assertTrue(aObject.equals(cObject));
22+
// hashCode()
23+
Assert.assertTrue(aObject.hashCode() == bObject.hashCode());
24+
// non-equal objects are not equals() and have different hashCode()
25+
Assert.assertFalse(aObject.equals(dObject));
26+
Assert.assertFalse(aObject.hashCode() == dObject.hashCode());
27+
}
28+
29+
}
Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
package org.baeldung.equalshashcode.entities;
2+
3+
import java.awt.Color;
4+
5+
import org.junit.Assert;
6+
import org.junit.Test;
7+
8+
public class SquareClassTest {
9+
10+
@Test
11+
public void testEqualsAndHashcodes() {
12+
13+
Square aObject = new Square(10, Color.BLUE);
14+
Square bObject = new Square(10, Color.BLUE);
15+
Square cObject = new Square(10, Color.BLUE);
16+
17+
Square dObject = new Square(20, Color.BLUE);
18+
19+
// equals()
20+
Assert.assertTrue(aObject.equals(aObject));
21+
Assert.assertTrue(aObject.equals(bObject) && bObject.equals(aObject));
22+
Assert.assertTrue(aObject.equals(bObject));
23+
Assert.assertTrue(bObject.equals(cObject));
24+
Assert.assertTrue(aObject.equals(cObject));
25+
// hashCode()
26+
Assert.assertTrue(aObject.hashCode() == bObject.hashCode());
27+
// non-equal objects are not equals() and have different hashCode()
28+
Assert.assertFalse(aObject.equals(dObject));
29+
Assert.assertFalse(aObject.hashCode() == dObject.hashCode());
30+
}
31+
32+
}

0 commit comments

Comments
 (0)