Acredito que todos entendam bem a diferença entre String e StringBuffer, mas estima-se que ainda existam muitos camaradas que não têm clareza sobre os princípios de funcionamento dessas duas classes. Hoje irei revisar esse conceito para todos, e por. a forma como o J2SE 5.0 traz uma nova classe de manipulação de caracteres - StringBuilder (não se apresse em atirar tijolos em mim, ainda estou sóbrio, não estou falando de C# aqui, Java também tem uma classe StringBuilder). Então, quais são as diferenças entre este StringBuilder e StringBuffer e a classe String que conhecemos? Qual devemos usar em diferentes situações? Gostaria de compartilhar minha opinião sobre essas categorias e espero também que todos possam dar suas opiniões. Todos cometeram erros e, ao corrigi-los, é uma boa oportunidade para aprender.
Resumidamente, a principal diferença de desempenho entre o tipo String e o tipo StringBuffer é, na verdade, que String é um objeto imutável (por quê? Pergunte aos designers de Java, por que String não é um tipo nativo?) Portanto, toda vez que o tipo String é alterado , Na verdade, é equivalente a gerar um novo objeto String e, em seguida, apontar o ponteiro para o novo objeto String. Portanto, é melhor não usar String para strings que mudam frequentemente de conteúdo, porque cada vez que um objeto é gerado, ele. terá um impacto no desempenho do sistema, especialmente ao usar memória. Quando houver muitos objetos não referenciados, o GC da JVM começará a funcionar e a velocidade será definitivamente bastante lenta. Aqui está um exemplo que não é muito apropriado:
Sequência S1 = "abc";
For(int I = 0; I < 10000; I ++) // For simula múltiplas chamadas do programa
{
S1+ = “def”;
S1 = “abc”;
}
Se for esse o caso, após a conclusão do loop for, se os objetos na memória não tiverem sido apagados pelo GC, haverá mais de 20.000 na memória, um número surpreendente, e se este for um sistema usado por muitos gente, então O número não é muito grande, então todos devem ter cuidado ao utilizá-lo.
Se você usar a classe StringBuffer, os resultados serão diferentes. Cada vez que o resultado for uma operação no próprio objeto StringBuffer, em vez de gerar um novo objeto e depois alterar a referência do objeto. Portanto, em geral, recomendamos o uso de StringBuffer, especialmente quando os objetos string mudam com frequência. Em alguns casos especiais, a concatenação de strings de objetos String é na verdade interpretada pela JVM como a concatenação de objetos StringBuffer, portanto, nesses casos, a velocidade dos objetos String não será mais lenta que a dos objetos StringBuffer, e especialmente os seguintes objetos string são gerado Entre eles, a eficiência do String é muito mais rápida que o StringBuffer:
String S1 = “Isto é apenas um” + “simples” + “teste”;
StringBuffer Sb = new StringBuilder("Este é apenas um").append("simple").append("teste");
Você ficará surpreso ao descobrir que a velocidade de geração de objetos String S1 é simplesmente muito rápida e, neste momento, StringBuffer não tem nenhuma vantagem em velocidade. Na verdade, este é um truque da JVM. Aos olhos da JVM, isso.
String S1 = “Este é apenas um” + “simples” + “teste” Na verdade, é: String S1 = “Este é apenas um teste simples”; Mas o que todos devem observar aqui é que se a sua string vier de outro objeto String, a velocidade não será tão rápida, por exemplo:
String S2 = “Isto é apenas um”;
String S3 = "simples";
String S4 = "teste";
Sequência S1 = S2 +S3 + S4;
Neste momento, a JVM se comportará da maneira original, e a velocidade de geração dos objetos S1 não será tão rápida quanto antes. Podemos fazer um teste para verificar mais tarde.
Disto chegamos à conclusão do primeiro passo: Na maioria dos casos StringBuffer > String
E como o StringBuilder se compara a eles? Deixe-me apresentá-lo brevemente primeiro. StringBuilder é uma classe recém-adicionada no JDK5.0. A diferença entre ele e StringBuffer é a seguinte (fonte: JavaWorld):
Java.lang.StringBuffer Sequência de caracteres mutáveis thread-safe. Um buffer de string semelhante a String, mas não pode ser modificado. Buffers de string podem ser usados com segurança por vários threads. Esses métodos podem ser sincronizados quando necessário, de modo que todas as operações em qualquer instância específica pareçam ocorrer em uma ordem serial consistente com a ordem das chamadas de método feitas por cada thread envolvido.
Cada buffer de string tem uma certa capacidade. Contanto que o comprimento da sequência de caracteres contida no buffer de string não exceda essa capacidade, não há necessidade de alocar uma nova matriz de buffer interna. Esta capacidade é aumentada automaticamente se o buffer interno transbordar. A partir do JDK 5.0, uma classe equivalente para uso de thread único, StringBuilder, foi adicionada a esta classe. A classe StringBuilder geralmente deve ser usada em preferência a esta classe porque suporta todas as mesmas operações, mas é mais rápida porque não executa sincronização.
Mas não é seguro usar uma instância do StringBuilder com vários threads. Se tal sincronização for necessária, é recomendado usar StringBuffer.
Dito isso, acho que todos podem entender a diferença entre eles, então vamos fazer uma derivação geral abaixo:
Na maioria dos casos StringBuilder > StringBuffer
Portanto, de acordo com o teorema de transferência desta desigualdade: na maioria dos casos StringBuilder > StringBuffer > String (quanto maior o número de operações, mais estável ela é).
Obtenha a hora do sistema long start = System.currentTimeMillis(); long end = System.currentTimeMillis();
for(i=0;i<str.comprimento()/2;i++)
if(str.charAt(i)!=str.charAt(str.length()-i-1))
quebrar;
if(i>=str.comprimento()/2)
JOptionPane.showMessageDialog(null,"é uma string de palíndromo");
outro
JOptionPane.showMessageDialog(null, "Não é uma string de palíndromo");
}
}
*/
if(str.equals(str2))
JOptionPane.showMessageDialog(null,"é uma string de palíndromo");
outro
JOptionPane.showMessageDialog(null, "Não é uma string de palíndromo");
}
}