Normalmente criamos objetos usando a new
palavra - chave, como:
Object obj = new Object();
Strings são objetos, mas não usamos new
para criá-los:
String str = "Hello World";
Por que é isso? Posso fazer uma corda com new
?
java
string
core
new-operator
giri
fonte
fonte
new String(...)
foi usado para contornar um detalhe de implementação ao criar substring de strings grandes. Isso foi corrigido no Java 7 e não é mais necessário.Respostas:
Além do que já foi dito, literais String [ou seja, Strings like
"abcd"
but not likenew String("abcd")
] em Java são internados - isso significa que toda vez que você se refere a "abcd", você obtém uma referência para uma únicaString
instância, em vez de uma nova cada vez. Então você terá:mas se você tivesse
então é possível ter
(e caso alguém precise ser lembrado, use sempre
.equals()
para comparar Strings;==
testes de igualdade física).Internar literais String é bom porque geralmente são usados mais de uma vez. Por exemplo, considere o código (inventado):
Se não tivéssemos internação de Strings, a "Próxima iteração" precisaria ser instanciada 10 vezes, enquanto agora será instanciada apenas uma vez.
fonte
Strings são objetos "especiais" em Java. Os designers Java sabiamente decidiram que Strings são usados com tanta frequência que eles precisavam de sua própria sintaxe, bem como de uma estratégia de cache. Quando você declara uma string dizendo:
myString é uma referência ao objeto String com um valor de "something". Se você declarar posteriormente:
Java é inteligente o suficiente para descobrir que myString e myOtherString são iguais e irá armazená-los em uma tabela String global como o mesmo objeto. Depende do fato de que você não pode modificar Strings para fazer isso. Isso reduz a quantidade de memória necessária e pode tornar as comparações mais rápidas.
Se, em vez disso, você escrever
Java criará um novo objeto para você, distinto do objeto myString.
fonte
Espero que isso esclareça algumas dúvidas. :)
fonte
É um atalho. Não era originalmente assim, mas o Java mudou.
Este FAQ fala sobre isso brevemente. O guia de especificações Java também fala sobre isso. Mas não consigo encontrar online.
fonte
String está sujeita a algumas otimizações (por falta de uma frase melhor). Observe que String também tem sobrecarga de operador (para o operador +) - ao contrário de outros objetos. Portanto, é um caso muito especial.
fonte
Normalmente usamos literais String para evitar a criação de objetos desnecessários. Se usarmos o novo operador para criar o objeto String, ele criará um novo objeto todas as vezes.
Exemplo:
Para o código acima na memória:
fonte
Em Java, Strings são um caso especial, com muitas regras que se aplicam apenas a Strings. As aspas duplas fazem com que o compilador crie um objeto String. Como os objetos String são imutáveis, isso permite que o compilador internalize várias strings e construa um pool de strings maior. Duas constantes String idênticas sempre terão a mesma referência de objeto. Se você não quiser que seja esse o caso, você pode usar new String (""), e isso criará um objeto String em tempo de execução. O método intern () costumava ser comum, para fazer com que as strings criadas dinamicamente fossem verificadas na tabela de pesquisa de strings. Depois que uma string for internada, a referência do objeto apontará para a instância canônica de String.
Quando o carregador de classe carrega uma classe, todas as constantes String são adicionadas ao pool de String.
fonte
Açúcar sintático. o
a sintaxe ainda está disponível.
fonte
String small = new String(huge.substring(int, int));
, que permite reciclar o grande subjacentechar[]
dahuge
String original .Você ainda pode usar
new String("string")
, mas seria mais difícil criar novas strings sem literais de string ... você teria que usar matrizes de caracteres ou bytes :-) Literais de string têm uma propriedade adicional: todos os mesmos literais de string de qualquer ponto de classe para a mesma string instância (eles estão internados).fonte
Quase não há necessidade de uma nova string, pois o literal (os caracteres entre aspas) já é um objeto String criado quando a classe host é carregada. É perfeitamente legal invocar métodos em um literal e don, a principal diferença é a conveniência fornecida pelos literais. Seria uma grande dor e desperdício de tempo se tivéssemos que criar um array de chars e preenchê-lo com char e eles fazendo uma nova String (char array).
fonte
Sinta-se à vontade para criar uma nova String com
A notação usual
s = "new String";
é mais ou menos um atalho conveniente - que deve ser usado por motivos de desempenho, exceto para aqueles casos muito raros, onde você realmente precisa de Strings que se qualifiquem para a equaçãoEDITAR
Em resposta ao comentário: isto não pretendia ser um conselho, mas apenas uma resposta direta à tese dos questionadores, de que não usamos a palavra-chave 'nova' para Strings, o que simplesmente não é verdade. Espero que esta edição (incluindo a acima) esclareça isso um pouco. BTW - há algumas respostas boas e muito melhores para a pergunta acima no SO.
fonte
new String(...)
MENOS que seu aplicativo EXIGE que você crie uma String com uma identidade distinta.O conjunto literal contém quaisquer Strings que foram criadas sem usar a palavra-chave
new
.Há uma diferença: String sem nova referência é armazenada no pool literal de String e String com new diz que eles estão na memória heap.
String com new estão em outro lugar na memória como qualquer outro objeto.
fonte
Porque String é uma classe imutável em java.
Agora, por que é imutável? Como String é imutável, pode ser compartilhado entre vários threads e não precisamos sincronizar a operação de String externamente. As String também é usado no mecanismo de carregamento de classe. Portanto, se String fosse mutável, java.io.writer poderia ter sido alterado para abc.xyz.mywriter
fonte
Resultado:
Criei dois objetos separados, ambos têm um campo (ref) 'Nome'. Portanto, mesmo neste caso, "Jan Peter" é compartilhado, se eu entendo como o java trata ..
fonte
Bem, o StringPool é implementado usando o Hashmap em java. Se estivermos criando sempre com uma nova palavra-chave, ele não estará pesquisando no String Pool e criando uma nova memória para ela que pode ser necessária mais tarde se tivermos uma operação com uso intensivo de memória em execução e se estivermos criando todas as strings com uma nova palavra-chave que afetaria o desempenho de nosso aplicativo. Portanto, é aconselhável não usar novas palavras-chave para a criação de string, pois só então ele irá para o pool de String que por sua vez é um Hashmap, (memória salva, imagine se tivermos muitas strings criadas com a nova palavra-chave) aqui ele será armazenado e se a string já existe, a referência dela (que normalmente residiria na memória da pilha) seria retornada para a string recém-criada. Portanto, é feito para melhorar o desempenho.
fonte