Eu estou querendo saber por que o método String.valueOf(int i)
existe? Eu estou usando este método para converter int
em String
e apenas descobriu o Integer.toString(int i)
método.
Depois de analisar a implementação desses métodos, vi que o primeiro está chamando o segundo. Como conseqüência, todas as minhas ligações para String.valueOf(int i)
envolver mais uma ligação do que diretamenteInteger.toString(int i)
Respostas:
Apenas duas maneiras diferentes de fazer a mesma coisa. Pode ser um motivo histórico (não me lembro se um veio antes do outro).
fonte
No tipo String, temos vários métodos valueOf
Como podemos ver, esses métodos são capazes de resolver todos os tipos de números
toda implementação de método específico como você apresentou: Então, para números inteiros, temos
para dupla
e assim por diante
Na minha opinião, isso não é algo histórico, mas é mais útil para um desenvolvedor usar o método
valueOf
da classe String do que do tipo apropriado, pois leva a menos alterações para fazermos.Amostra 1:
Sample2:
Como vemos na amostra 2, temos que fazer duas alterações, ao contrário da amostra uma.
Na minha conclusão, o uso do
valueOf
método da classe String é mais flexível e é por isso que está disponível lá.fonte
Integer.toString(int i, int radix)
que irá converter para cordas de outros que 10. basesString.valueOf(int)
, você pode usarString.format("%d",i);
para ler mais, visite este site docs.oracle.com/javase/6/docs/api/java/util/Formatter.htmlint i = new Integer("1");
e vice-versa.Uma grande diferença é que, se você invocar
toString()
um objeto nulo, obterá um tempoNullPointerException
, usandoString.valueOf()
você pode não verificar se há nulo.fonte
Integer.toString(int i)
, umstatic
método. Não hánull
objetos possíveis.Integer i = null;
i.toString(); // Null pointer exception!!
String.valueOf(i); // No exception
String.valueOf(int i)
método, masString.valueOf(Object obj)
. De qualquer forma, a questão é sobreint
valores primitivos , dos quais não há possibilidadenull
.Integer.toString()
masInteger.toString(int i)
. Esse é um método estático ( docs.oracle.com/javase/7/docs/api/java/lang/… ).A classe String fornece métodos valueOf para todos os tipos primitivos e tipo de objeto, portanto, presumo que sejam métodos de conveniência que podem ser acessados por meio de uma classe.
NB Profiling results
Média intToString = 5368ms, Média stringValueOf = 5689ms (para 100.000.000 operações)
fonte
String j
mas nunca o usa. O compilador subjacente pode ter otimizado isso. É melhor passar o objeto j em um método diferente e fazer alguma operação fictícia.Nas fontes Java:
Então eles dão exatamente o mesmo resultado e um de fato chama o outro. String.valueOf é mais flexível se você puder alterar o tipo posteriormente.
fonte
Se você olhar para o código-fonte da
String
classe, ele realmente chamaráInteger.toString()
quando você ligarvalueOf()
.Dito isto,
Integer.toString()
pode ser um pouco mais rápido se as chamadas de método não forem otimizadas em tempo de compilação (o que provavelmente é).fonte
A implementação
String.valueOf()
que você vê é a maneira mais simples de cumprir o contrato especificado na API: "A representação é exatamente a retornada peloInteger.toString()
método de um argumento".fonte
Para responder à pergunta dos OPs, é simplesmente um invólucro auxiliar ter a outra chamada e se resume à escolha do estilo e é isso. Acho que há muita desinformação aqui e a melhor coisa que um desenvolvedor Java pode fazer é analisar a implementação de cada método, a um ou dois cliques de distância em qualquer IDE. Você verá claramente que
String.valueOf(int)
está simplesmente chamandoInteger.toString(int)
por você.Portanto, não há absolutamente nenhuma diferença, pois ambos criam um buffer de caracteres, percorrem os dígitos do número, copiam-o para uma nova String e a retornam (portanto, cada um está criando um objeto String). A única diferença é uma chamada extra, que o compilador elimina para uma única chamada de qualquer maneira.
Portanto, não importa como você chama, além de talvez consistência de código. Quanto aos comentários sobre nulos, é preciso um primitivo, portanto, não pode ser nulo! Você receberá um erro em tempo de compilação se não inicializar o int que está sendo passado. Portanto, não há diferença em como ele lida com nulos, pois eles não existem neste caso.
fonte
Você não deve se preocupar com esta chamada extra, que lhe custa problemas de eficiência. Se houver algum custo, será mínimo e deve ser insignificante no quadro geral das coisas.
Talvez a razão pela qual ambos existam seja oferecer legibilidade. No contexto de muitos tipos sendo convertidos
String
, várias chamadas paraString.valueOf(SomeType)
podem ser mais legíveis do que váriasSomeType.toString
chamadas.fonte
minha abertura é valueof () sempre chamada tostring () para representação e, portanto, para a representação do tipo primitivo, valueof é generalizada. O objeto .here Integer.toString (int i) cria um limite que converte apenas o número inteiro.
fonte
Não há diferenças entre Integer.toString (5) e String.valueOf (5);
porque String.valueOf retorna:
etc ..
fonte
Usando o método String.valueOf (), você não precisa se preocupar com os dados (sejam int, long, char, char [], booleano, Object), basta chamar:
usar a única sintaxe String.valueOf () pode passar o que você passa como parâmetro é convertido em String e retornado.
Caso contrário, se você usar Integer.toString (), Float.toString () etc. (por exemplo, SomeType.toString ()), será necessário verificar o tipo de dados do parâmetro que deseja converter em string. Portanto, é melhor usar String.valueOf () para essas conversões.
Se você está tendo uma matriz de classe de objeto que contém valores diferentes, como Inteiro, Char, Flutuante etc., usando o método String.valueOf (), você pode converter os elementos dessa matriz em forma de String facilmente. Pelo contrário, se você quiser usar o SomeType.toString (), primeiro você precisará conhecer suas classes de tipo de dados (talvez usando o operador "instanceOf") e, em seguida, somente você poderá prosseguir com uma conversão de tipo.
O método String.valueOf (), quando chamado, corresponde ao parâmetro que é passado (seja Inteiro, Char, Flutuante etc.) e, usando a sobrecarga de método, chama esse método "valueOf ()" cujo parâmetro é correspondido e, dentro desse método, é uma chamada direta para o método "toString ()" correspondente.
Então, podemos ver como a sobrecarga de verificar o tipo de dados e depois chamar o método "toString ()" correspondente é removida. Só precisamos chamar o método String.valueOf (), sem nos importar com o que queremos converter em String.
Conclusão: O método String.valueOf () tem sua importância apenas ao custo de mais uma chamada.
fonte
para sequenciar()
valor de()
lida com tipos primitivos e com objetos.
verifique este link é muito bom. http://code4reference.com/2013/06/which-one-is-better-valueof-or-tostring/
fonte