Por que acha que existe uma maneira melhor? E não me chame de Shirley. :)
Hovercraft Cheio De Enguias
Porque eu sempre associo a criação de novas variáveis, como a acima, para ter uma leve sobrecarga durante o tempo de execução. Como se eu colocasse a linha acima para converter uma matriz de caracteres em uma string em um loop for, por exemplo, para mim, isso não parece certo. E sim, sou um pouco perfeccionista. . .
chutsu 4/10/11
11
Se você tem muitos desses caras, digamos, uma matriz ou coleção de char [], talvez seja possível anexar as matrizes de char a um StringBuffer, mas para uma String aqui ou ali, o que você postou é o que mais usa.
Hovercraft Cheio De Enguias
Se você está procurando uma maneira de evitar copiar o char [], não há uma. Caso contrário, você pode subverter a imutabilidade de String.
Paul Cager 4/10
13
"criar novas variáveis" incorre em zero de sobrecarga. Uma variável é um nome usado para se referir a um valor, e o próprio nome não está presente em nenhum lugar da memória no tempo de execução (pelo menos, não em uma linguagem como Java, onde a reflexão é bastante limitada). A "sobrecarga" vem da construção de um novo valor , e não há como contornar isso no seu caso, considerando que o seu problema é "construir esse valor". Você não pode fazer com que o array char se transmogrifique magicamente em uma String. Você pode organizar para que a matriz de caracteres original seja coletada como lixo após a criação da String.
Karl Knechtel
Respostas:
212
Não, essa solução é absolutamente correta e muito mínima.
Observe, no entanto, que esta é uma situação muito incomum: como Stringé tratado especialmente em Java, mesmo "foo"é na verdade um String. Portanto, a necessidade de dividir uma String em chars individuais e juntá-las novamente não é necessária no código normal.
Compare isso com o C / C ++, onde "foo"você tem um pacote de chars terminado por um byte zero de um lado e stringdo outro lado e muitas conversões entre eles devido a métodos legados.
Ambos os métodos chamam String(char[])ou uma variante disso. E a parte da cópia é feita dentro String(char[]). Isso não deixa nenhum benefício para uma chamada direta, além da simetria com os outros valueOfmétodos.
AH
11
estático e mais OOP é uma contradição de termos. Qualquer coisa declarada estática não faz parte de um objeto ou de seu comportamento e, portanto, não é orientada a objetos. Além disso - se houver alguma chance de que a implementação de Stringseja alterada e / ou aprimorada de maneira incompatível ou que várias implementações concorrentes possam ser escolhidas em tempo de execução, um método estático de fábrica faz sentido. Isso não acontecerá com um nível tão baixo como String. Portanto, minha premissa é: Use o menor martelo adequado, não o maior disponível.
AH
@ Ah, eu não sei sobre isso. String deu lugar a StringBuffer, que deu lugar a StringBuilder. Aposto que os defensores do StringBuffer disseram a mesma coisa então e agora precisam refatorar o código para usar o StringBuilder.
corsiKa
11
@AH O fato de eles terem que criar a CharSequenceinterface mostra o quão falho é o seu "não acontecerá com coisas de baixo nível como string" - eles não mudam o que acontece na string porque se ligaram a ela desde o início e agora desejam eles não teriam.
corsiKa
11
@corsiKa Eu não disse que a API String é tudo de bom e de ouro. Só que isso não mudará de maneira incompatível e que a própria classe e seus construtores não irão a lugar algum. :-)
package naresh.java;publicclassTestDoubleString{publicstaticvoid main(String args[]){String str="abbcccddef";char charArray[]=str.toCharArray();int len=charArray.length;for(int i=0;i<len;i++){//if i th one and i+1 th character are same then update the charArraytry{if(charArray[i]==charArray[i+1]){
charArray[i]='0';}}catch(Exception e){System.out.println("Exception");}}//finally printing final character stringfor(int k=0;k<charArray.length;k++){if(charArray[k]!='0'){System.out.println(charArray[k]);}}}}
Embora esse código possa responder à pergunta, fornecer um contexto adicional a respeito de por que e / ou como esse código responde à pergunta melhora seu valor a longo prazo.
precisa saber é o seguinte
1
//Given Character Array char[] a ={'h','e','l','l','o',' ','w','o','r','l','d'};//Converting Character Array to String using String funtion System.out.println(String.valueOf(a));//OUTPUT : hello world
Convertendo qualquer tipo de matriz em String usando a função Java 8 Stream
isso está errado, pois assume que toStringfunciona corretamente char[]. Pode funcionar em alguns fornecedores e versões específicos da JVM.
fommil
3
Porque a classe String é imutável, isso fará com que duas operações a serem realizadas: toString () chamada no ae criação de outro objeto String que concatena com a.toString()e""
Respostas:
Não, essa solução é absolutamente correta e muito mínima.
Observe, no entanto, que esta é uma situação muito incomum: como
String
é tratado especialmente em Java, mesmo"foo"
é na verdade umString
. Portanto, a necessidade de dividir uma String emchar
s individuais e juntá-las novamente não é necessária no código normal.Compare isso com o C / C ++, onde
"foo"
você tem um pacote dechar
s terminado por um byte zero de um lado estring
do outro lado e muitas conversões entre eles devido a métodos legados.fonte
String text = String.copyValueOf(data);
ou
String text = String.valueOf(data);
é sem dúvida melhor (encapsula a
new String
chamada).fonte
String(char[])
ou uma variante disso. E a parte da cópia é feita dentroString(char[])
. Isso não deixa nenhum benefício para uma chamada direta, além da simetria com os outrosvalueOf
métodos.String
seja alterada e / ou aprimorada de maneira incompatível ou que várias implementações concorrentes possam ser escolhidas em tempo de execução, um método estático de fábrica faz sentido. Isso não acontecerá com um nível tão baixo comoString
. Portanto, minha premissa é: Use o menor martelo adequado, não o maior disponível.CharSequence
interface mostra o quão falho é o seu "não acontecerá com coisas de baixo nível como string" - eles não mudam o que acontece na string porque se ligaram a ela desde o início e agora desejam eles não teriam.Isso converterá o array char novamente em string:
fonte
Agora, para converter a matriz de caracteres em String, existem duas maneiras.
Retorna a string
[w, w, w, w, w, w, 3, 3, 3, 3, d, f, e, v, v, v]
.E:
Retorna a string
wwwwww3333dfevvv
.Em resumo : preste atenção
Arrays.toString(c)
, porque você receberá em"[w, w, w, w, w, w, 3, 3, 3, 3, d, f, e, v, v, v]"
vez de"wwwwww3333dfevvv"
.fonte
Uma String em java é apenas um objeto em torno de uma matriz de caracteres. Portanto, um
é idêntico a uma String sem caixa com os mesmos caracteres. Criando uma nova String a partir de sua matriz de caracteres
você está basicamente dizendo ao compilador para autobox um objeto String em torno de sua matriz de caracteres.
fonte
Você pode usar o
String.valueOf
métodoPor exemplo,
Para saber mais sobre o array de caracteres para string, consulte os links abaixo
https://docs.oracle.com/javase/7/docs/api/java/lang/String.html
https://www.flowerbrackets.com/convert-char-array-to-string-java/
fonte
fonte
Convertendo qualquer tipo de matriz em String usando a função Java 8 Stream
fonte
Tente usar
java.util.Arrays
. Este módulo possui uma variedade de métodos úteis que podem ser usados relacionados a Matrizes.fonte
Tente isto
fonte
Basta usar String.value como abaixo;
fonte
Tente o seguinte:
fonte
Você também pode usar a classe StringBuilder
O uso de String ou StringBuilder varia de acordo com os requisitos do seu método.
fonte
Uma maneira alternativa é fazer:
fonte
toString
funciona corretamentechar[]
. Pode funcionar em alguns fornecedores e versões específicos da JVM.a
e criação de outro objeto String que concatena coma.toString()
e""