Além das respostas dadas até agora ...
Existem quatro valores no total
int i = Integer.MIN_VALUE;
long i = Long.MIN_VALUE;
Integer i = Integer.valueOf(Integer.MIN_VALUE);
Long i = Long.valueOf(Long.MIN_VALUE);
Os valores agrupados são desempacotados, portanto, também são verdadeiros para esta expressão.
Nota: documentos Math.abs.
público estático int abs (int a)
Retorna o valor absoluto de um valor int. Se o argumento não for negativo, o argumento será retornado. Se o argumento for negativo, a negação do argumento é retornada.
Observe que se o argumento for igual ao valor de Integer.MIN_VALUE, o valor int representável mais negativo, o resultado é o mesmo valor, que é negativo.
e
abs longo estático público (a longo)
Retorna o valor absoluto de um valor longo. Se o argumento não for negativo, o argumento será retornado. Se o argumento for negativo, a negação do argumento é retornada.
Observe que se o argumento for igual ao valor de Long.MIN_VALUE, o valor longo representável mais negativo, o resultado é o mesmo valor, que é negativo.
É surpreendente que Math.abs possa retornar um número negativo. Isso acontece porque a) não há valores positivos para -MIN_VALUE nesses casos b) realizar o -cálculo resulta em um estouro.
O que também é interessante é por que Byte.MIN_VALUE, Short.MIN_VALUE não fazem isso. Isso ocorre porque o -tipo muda intpara esses e, portanto, não há estouro.
Character.MIN_VALUE não tem problema porque é 0.
Float.MIN_VALUE e Double.MIN_VALUE têm um significado diferente. Estes são os menores valores representáveis maiores que zero. Assim, eles têm valores negativos válidos que não são eles próprios.