evgenii ershenko evgenii ershenko - 9 months ago 38
Java Question

Java Faster Equals method For float type

As I know set.add use equals method of FastFloat

For me important only first two digits after point(!!!), so in the equals method to make equals faster I use

Math.abs() >= 0.001
but I don't understand why this code return
instead of
Math.abs(3.54 - 3.5405) < 0.001


import java.util.ArrayList;
import java.util.HashSet;
import java.util.List;
import java.util.Set;

public class st {

public class FastFloat {
private float ff;

public FastFloat(float ff) {
this.ff = ff;

public int hashCode() {
final int prime = 31;
int result = 1;
result = prime * result + getOuterType().hashCode();
result = prime * result + Float.floatToIntBits(ff);
return result;

public boolean equals(Object obj) {
if (this == obj)
return true;
if (obj == null)
return false;
if (!(obj instanceof FastFloat))
return false;
FastFloat other = (FastFloat) obj;
if (!getOuterType().equals(other.getOuterType()))
return false;
/* if (Float.floatToIntBits(ff) != Float.floatToIntBits(other.ff))
return false;*/
if (Math.abs(ff - other.ff) >= 0.001)
return false;
return true;

private st getOuterType() {
return st.this;

public static void main(String[] args) {
List<Set<FastFloat>> lsff = new ArrayList<>();
lsff.add(0, new HashSet<>());
Set<FastFloat> sff = lsff.get(0);
st x = new st();
sff.add(x.new FastFloat((float)3.54));
sff.add(x.new FastFloat((float)3.5405));



Your hashCode() method gives different results for ff==3.54 and ff==3.5405, so they are assigned to different buckets of the HashSet and your equals method is never used to test if they are equal.

If a.equals(b), a.hashCode() must be equal to b.hashCode(). That's the contract.

From the equals() Javadoc :

Note that it is generally necessary to override the hashCode method whenever this method is overridden, so as to maintain the general contract for the hashCode method, which states that equal objects must have equal hash codes.