The javadocs for the method compareTo() of the Integer class are extremely vague:
Returns: the value 0 if this Integer is equal to the argument Integer; a value less than 0 if this Integer is numerically less than the argument Integer; and a value greater than 0 if this Integer is numerically greater than the argument Integer (signed comparison)
The phrasing "a value less than 0" makes it seem like I can expect compareTo() to return all sort of negative integers (-1, -20, -9999, etc). Same for "a value greater than 0", it could really be anything above 0.
I noticed the method tends to return -1 and 1, however from the javadocs there is no guarantee that this behavior will be consistent. All I'm allowed to expected is an integer less than 0 or greater than 0, which could really be anything.
Does the function indeed always return -1, 0, or 1? Or does it occasionally return other values?
If it only returns -1, 0, and 1, why is that not clearly stated in the javadocs?
Example:
Integer myInteger = 8;
System.out.print(myInteger.compareTo(5));
// This prints 1
EDIT:
Interestingly, IntelliJ acts as if compareTo() always returns -1, 0, or 1. That is, if you have the following code:
public int myCompare(int x, int y){
if(x == y){
return 0;
} else if(x < y){
return -1;
} else{
return 1;
}
}
IntelliJ will give the warning "Expression can be replaced with 'Integer.compare'", and recommend the method be changed to:
public int myCompare(int x, int y){
return Integer.compare(x, y);
}
It is (IMO) unlikely that they will change the implementation of
Integer. However the spec forInteger.compareTodoes not state that the result is -1, 0 or +1 ... so they >could< change it. And if they do, then your code that relied on it would break.Correct. Or implement your own
ComparatororcompareTomethod ... if that is viable.If you are concerned about performance, there is a good chance that the JIT compiler will inline
signum(compareTo(anInteger)). It may even optimize away the redundantsignumlogic ...We can't speak for the people who wrote the spec. However, I imagine that they didn't want to preclude the possibility of changing the implementation; e.g. for (hypothetical) performance reasons.