Вычитать два числа, как в примере выше, не всегда хорошая идея.
Подумайте, что произойдет, если вы сравните -2 147 483 644 с 2 147 483 645. Вычитание их приведет к переполнению целого числа и, следовательно, к положительному числу. Положительное число означает, что компаратор утверждает, что -2 147 483 644 больше, чем 2 147 483 645.
-5 - 6 = -7
-2,147,483,644 - 2,147,483,645 = 1
Вычитать, чтобы найти значение сравнения, еще более опасно, когда вы рассматриваете сравнение длинных или двойных значений, поскольку их нужно привести обратно к целым числам, что дает еще одну возможность для переполнения. Например, никогда не делайте так:
class ZardozComparorator implements Comparator<Zardoz>{
public int compare(Zardoz z1, Zardoz z2) {
Long z1long = Long.getLong(z1.getName());
Long z2long = Long.getLong(z2.getName());
return (int)(z1long-z2long);
}
}
Вместо этого используйте метод сравнения объекта, который вы сравниваете. Таким образом, вы можете избежать переполнения и при необходимости вы можете переопределить метод сравнения.
class ZardozComparorator implements Comparator<Zardoz>{
public int compare(Zardoz z1, Zardoz z2) {
Long z1long = Long.getLong(z1.getName());
Long z2long = Long.getLong(z2.getName());
return z1long.compareTo(z2long);
}
}