dúvida String

Oi pessoal

observe o codigo:

 public static String makinStrings() {
        String s = "Fred";
        s = s + "47";
        s = s.substring(2, 5);
        s = s.toUpperCase();
        return s.toString();
    }

Quantos objetos String será criado quando este método é invocado?
a resposta é certa é 3, porem pelos meus calculos seriam 5.
1 “fred”, 2 “47”, 3 “fred47”, 4 “ed4” e 5 “ED4”

alguem pode me explicar?

abraço

o seguinte código funciona da mesma maneira…

public static String makinStrings() { String s = "Fred"; //1 houve um new escondido no autoboxing, o java internamente faz isso: string s = new string("fred"); s = s + "47"; //2 // houve um new escondido no "47" - autoboxing, o java internamente fez: s = s + new string("47"); s = s.substring(2, 5); //3 // há um new string() dentro do método substring. s.toUpperCase(); // o método Uppecase não cria uma nova string, e sim altera a própria return s; // tostring() retornaria o próprio objeto que ja é uma string }

resposta final: 3 objetos do tipo string foram criados

desculpe as classes em minusculo, meu teclado esta com problemas… :slight_smile:

altera a string? mas ela não é imultável?

e na parte s = s + “47”; não deveria criar a string “47” depois outra com “Fred” + “47” = Fred47 ?

abraço

tem razão.

seriam 4,

s.toUppercase() não funciona mesmo, ele retorna uma string…

fiquei confuso também

huahuhaah

tá sinistro…

são criadas 4 Strings, até onde eu percebi! oO

Eu também vi 4 Strings, aonde você viu que são somente 3?

o teste killer disse que são 3.
não dá de anexar imagem?

Na caixa de texto onde você escreve a resposta existem 2 botões, “Options” e “Attachments”

no attachments você pode colocar a imagem.

Só pra perguntar mesmo, você sabe que o TestKiller é ilegal, né ?

sério?
não sabia, ai meu Deus…

Sério, ele é a cópia da prova, portanto é ilegal.

se você está estudando existem vários simulados bacanas como os da Enthuware.

esse é pago, mas existem outros que são gratuitos, agora TestKiller é pura sacanagem hehehe

Foram criadas 5 Strings

public static String makinStrings() {  
       String s = "Fred";  // Fred
       s = s + "47";  // Fred47 e 47
       s = s.substring(2, 5);  // ed4
       s = s.toUpperCase();  // ED4
       return s.toString();  
       // toString retorna uma representação da classe, nada melhor que a própria String para representar tal objeto de tal tipo
   }

[quote=mapleplayer]Foram criadas 5 Strings

public static String makinStrings() { String s = "Fred"; // Fred s = s + "47"; // Fred47 e 47 s = s.substring(2, 5); // ed4 s = s.toUpperCase(); // ED4 return s.toString(); // toString retorna uma representação da classe, nada melhor que a própria String para representar tal objeto de tal tipo } [/quote]
Verdade hein… o toUpperCase retorna uma String nova sim.

o teste deve estar com problema então…


vou ser legal com vcs, tem uma lista de simulados no javaranch, alguns deles são free, basta se increver no site apenas
segue o link para a lista de simulados
https://www.coderanch.com/how-to/java/ScjpMockTests

eu particularmente não gostei do testkiller

Este problema já foi discutido (penso que várias vezes até) aqui no forum

depois de ler o link, penso que entendi…

public String makinStrings() {     
String s = "Fred";  // aqui não é criado uma string, é só atribuida da que ja esta no pool
s = s + "47";        // 1. Cria um objeto StringBuilder("Fred47")  
s = s.substring(2, 5); // 2. Cria a string "ed4"  
s = s.toUpperCase(); // 3. cria a string "ED4".  
return s.toString();    //  return this   
}

apesar de não ter lido em lugar nenhum a parte do (parte do outro link):

está fazendo o seguinte:
a) O Java, ao carregar a sua classe (ou seja, antes de executar o método “makinStrings”), vê que existe uma literal “Fred” no código, e então cria uma string “Fred” e a insere no pool de strings
b) Quando você executar o método “makinStrings”, você vai simplesmente atribuir à variável s uma referência para a string “Fred”, que já está criada e está no pool de strings.

Então, para efeitos dessa questão, esse comando não conta como criação de strings.

Agora já faz mais sentido…

Como assim cria um StringBuilder? isso está documentado em algum lugar?

dê uma olhada no link que o pmlm passou: http://www.guj.com.br/java/116352-duvida-na-quantidade-de-strings-criadas-resolvido

Sim sim, eu li.

Até não sabia que ele carregava as Strings literais direto no pool de Strings, o que também me pareceu estranho.

O que eu quero saber é se existe alguma documentação que especifique esse comportamento.