Pessoalmente, acho que "" + i parece que o pôster original da pergunta indica "fedido". Eu usei muitas linguagens OO além do Java. Se a sintaxe pretendesse ser apropriada, o Java apenas interpretaria o i sozinho, sem precisar que o "" desejado fosse convertido em uma string e o faria, pois o tipo de destino é inequívoco e apenas um único valor seria fornecido à direita . O outro parece um "truque" para enganar o compilador, algo ruim quando diferentes versões do Javac feitas por outros fabricantes ou de outras plataformas são consideradas se o código precisar ser portado. Caramba, meu dinheiro deve gostar de muitos outros OOLs apenas faça um Typecast: (String) i. winks
Dada a minha maneira de aprender e para facilitar a compreensão dessa construção ao ler rapidamente o código de outros, voto no método Integer.toString (i). Esquecendo um ns ou dois na maneira como o Java implementa as coisas em segundo plano vs. String.valueOf (i) esse método parece certo para mim e diz exatamente o que está acontecendo: eu tenho e Inteiro e desejo que ele seja convertido em uma String.
Um bom argumento feito algumas vezes é que talvez apenas usar StringBuilder na frente seja uma boa resposta para criar Strings misturadas de texto e ints ou outros objetos, já que é isso que será usado de qualquer maneira, em segundo plano, certo?
Apenas meus dois centavos jogados no gatinho já bem pago das respostas para a pergunta do Mans ... sorri
EDITAR PARA MINHA PRÓPRIA RESPOSTA APÓS ALGUMAS REFLEXÕES:
Ok, ok, eu estava pensando nisso um pouco mais e String.valueOf (i) também é perfeitamente bom, assim também diz: Eu quero uma String que represente o valor de um Inteiro. lol, o inglês é muito mais difícil de analisar do que o Java! Mas deixo o resto da minha resposta / comentário ... Sempre fui ensinado a usar o nível mais baixo de uma cadeia de métodos / funções, se possível, e ainda mantém a legibilidade, portanto, se String.valueOf chama Integer.toString, por que usar uma laranja inteira se você vai descascar de qualquer maneira, Hmmm?
Para esclarecer meu comentário sobre o StringBuilder, eu construo muitas seqüências de caracteres com combinações de texto e int literalmente, e elas acabam sendo longas e feias com chamadas para as rotinas mencionadas acima, embutidas entre os +, assim parece-me que elas se tornam Objetos SB de qualquer maneira e o método append tem sobrecargas, pode ser mais limpo seguir em frente e usá-lo ... Então, acho que estou com até 5 centavos de dólar neste agora, não é? ri muito...