| Autor |
Mensagem |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 15/07/2008 08:31:05
|
raphaelrabadan
JavaBaby
Membro desde: 23/06/2008 14:09:48
Mensagens: 95
Localização: Recife-PE
Offline
|
Galera,
estou resolvendo as questões do mock Test Killer e fiquei confuso com a questão 91.
Deem uma olhada nela:
A pergunta da questão é: How many String objects will be created when this method is invoked?
As respostãs são:
A. 1
B. 2
C. 3
D. 4
E. 5
F. 6
Para mim, são 5...
linha12, criamo a string "Fred".
linha 13, criamo a string "47" e "Fred47"
linha 14, criamo a string "ed4"
linha 15, criamo a string "ED4"
linha 16, retornamos "ED4" mas essa string já se encontra no pool, então não criamos um novo Objeto.
A resposta para a questão no Test Killer é C, ou seja 3.
Isso faz algum sentido??
This message was edited 1 time. Last update was at 15/07/2008 08:31:53
|
- Pós graduado em Engenharia de Software pela FBV
- Graduado em Análise e Desenvolvimento de Software pelo UNIBratec
- Sun Certified Programmer for the Java Platform, Standard Edition 6 (98%)
- Sun Certified Associate for the Java Platform, Standard Edition 1.0 (88%)
- Preliminary English Test (PET)
[ Next Targets: SCWCD, Software Engineering mSC] |
|
|
 |
|
|
![[Post New]](/templates/default/images/icon_minipost_new.gif) 15/07/2008 08:40:16
|
**Popeye12345**
GUJ Master
Membro desde: 30/03/2008 20:56:41
Mensagens: 1293
Offline
|
Bem estranho. Acho que são seis.
e aquele .toString() ali embaixo? Será que cria uma nova? Se for, são seis.
Mas três? Nem fu******.
This message was edited 1 time. Last update was at 15/07/2008 08:40:51
|
unnamed.
there are so many monkeys at guj. |
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 15/07/2008 09:01:07
|
andrepestana
JavaEvangelist
![[Avatar]](/images/avatar/5be278a9e02bed9248a4674ff62fea2c.png)
Membro desde: 23/03/2004 09:57:28
Mensagens: 380
Offline
|
bom, o toString não cria um novo objeto. Apenas retorna a referência para o próprio objeto:
toString()
This object (which is already a string!) is itself returned.
o método substring com certeza retorna uma nova String:
substring(int beginIndex, int endIndex)
Returns a new string that is a substring of this string.
A dúvida é só no toUpperCase... teoricamente deveria criar um novo objeto String pq String é imutável mas na API não diz nada explicitamente que cria uma nova String. O teste tb fala que são criados 3 objetos...
toUpperCase()
Converts all of the characters in this String to upper case using the rules of the default locale.
Alguém sabe?
|
Pestana
http://andrepestana.wordpress.com/ |
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 15/07/2008 09:05:52
|
raphaelrabadan
JavaBaby
Membro desde: 23/06/2008 14:09:48
Mensagens: 95
Localização: Recife-PE
Offline
|
Já descobri uma explicação, pelo menos 90% dela. As strings literais são criadas em tempo de compilação ou é quando as classes são carregadas pela JVM. Ou seja, quando o método é invocado, "Fred" e "47" já estavam criados.
Sendo assim, tirando 2 da minha resposta, que era 5. Ficam 3.
This message was edited 1 time. Last update was at 15/07/2008 09:10:52
|
- Pós graduado em Engenharia de Software pela FBV
- Graduado em Análise e Desenvolvimento de Software pelo UNIBratec
- Sun Certified Programmer for the Java Platform, Standard Edition 6 (98%)
- Sun Certified Associate for the Java Platform, Standard Edition 1.0 (88%)
- Preliminary English Test (PET)
[ Next Targets: SCWCD, Software Engineering mSC] |
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 15/07/2008 09:31:43
|
Marcio Duran
GUJ Master
![[Avatar]](/images/avatar/df0e19d29493ef2136fc3e2fc029c054.jpg)
Membro desde: 23/01/2008 11:14:35
Mensagens: 1905
Offline
|
raphaelrabadan wrote:Já descobri uma explicação, pelo menos 90% dela. As strings literais são criadas em tempo de compilação ou é quando as classes são carregadas pela JVM. Ou seja, quando o método é invocado, "Fred" e "47" já estavam criados.
Sendo assim, tirando 2 da minha resposta, que era 5. Ficam 3. 
Em alguns testes, ou melhor em vários desses simulados uma coisa é bem certa, o código vai ter o seu comportamento pela a intenção da JVM e ou seja, quando vc bate o olho no código ira pensar em termos de algoritmo ou buscará algo pela regra de OO, entretanto a VM tem particularidades preempitivas que vão ter prioridade ao comportamento da VM vigente, temos ai as versões 1.4, 1.5, 1.6 e 1.7, na certa você vai ter execuções onde o compilador interpretará o código e executará pela a regra da JVM naquele momento.
|
Consultor Open Source
Comunidade JavaLivros
Twitter Comunidade JavaLivros
Novo Blog do MiddleHeaven |
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 15/07/2008 09:36:56
|
andrepestana
JavaEvangelist
![[Avatar]](/images/avatar/5be278a9e02bed9248a4674ff62fea2c.png)
Membro desde: 23/03/2004 09:57:28
Mensagens: 380
Offline
|
Raphael,
Essa questão está errada. São 5 Strings.
Dê uma olhada na implementação da classe String:
http://www.docjar.com/html/api/java/lang/String.java.html
toUpperCase pode ou não criar um novo objeto. Se a String não precisar de upperCase, ou seja, já estiver em maiúsculas o método retorna o próprio objeto. Mas isso não vem ao caso aqui. Só curiosidade.
O caso é que esse teste tá errado.
Strings criadas: "Fred", "47", "Fred47", "ed4" e "ED4"
This message was edited 1 time. Last update was at 15/07/2008 10:02:08
|
Pestana
http://andrepestana.wordpress.com/ |
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 15/07/2008 09:48:40
|
luistiagos
GUJ Expert
![[Avatar]](/images/avatar/98785ca89cfbbe933921bfe68a94553b.jpg)
Membro desde: 10/07/2006 10:37:23
Mensagens: 3161
Offline
|
Pelo que entendi é o seguinte:
primeira string é criada: "Fred"
na outra linha em: s = s + "47"; o compilador na verdade transforma o + em um stringbuffer e da um append... isto faz ele criar apenas o "47", logo apos no substring não nessecita-se criar outra string pois a string ali existe so precisa pegar um "pedaço" dela isto a baixo nivel deve ser feito alterando a posição do ponteiro nos caracteres da string ou seja não gera outra... em seguida no toUpperCase() é gerado outra string em maiuscula... dai totaliza-se 3...
|
SCJP 1.5
SCJA 1.0
IBM DB2 Associate |
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 15/07/2008 09:58:06
|
ChronoTrigger
Thread.start()
![[Avatar]](/images/avatar/67245236ce5a981076ce7feffc35c893.jpg)
Membro desde: 14/09/2007 14:05:29
Mensagens: 47
Offline
|
bom, o toString não cria um novo objeto. Apenas retorna a referência para o próprio objeto:
O toString retorna a própria string, e não a referencia ao objeto.
.....
Se olharmos dentro da implementação do toUpperCase()
Se não for necessária alteração voltará a mesma String, logo nenhum objeto é retornado.
No teste há alterações a serem feitas, logo irá retornar um novo objeto.
....................
na outra linha em: s = s + "47"; o compilador na verdade transforma o + em um stringbuffer e da um append...
O compilador não transforma uma String em um StringBuffer !!!!!!!
|
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 15/07/2008 10:10:53
|
andrepestana
JavaEvangelist
![[Avatar]](/images/avatar/5be278a9e02bed9248a4674ff62fea2c.png)
Membro desde: 23/03/2004 09:57:28
Mensagens: 380
Offline
|
Chrono,
Se não for necessária alteração voltará a mesma String, logo nenhum objeto é retornado.
No teste há alterações a serem feitas, logo irá retornar um novo objeto.
Eu disse:
Mas isso não vem ao caso aqui. Só curiosidade.
luistiagos,
Acho que vc está confundindo as coisas. O compilador não transforma nada em StringBuffer.
Abraço,
|
Pestana
http://andrepestana.wordpress.com/ |
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 15/07/2008 10:11:24
|
luistiagos
GUJ Expert
![[Avatar]](/images/avatar/98785ca89cfbbe933921bfe68a94553b.jpg)
Membro desde: 10/07/2006 10:37:23
Mensagens: 3161
Offline
|
internamente por questões de performase ele deve fazer alguma especie de buffer... pois seria muita burrice uma criar um novo objeto s+"47" qdo se pode simplismente juntar os caracters... creio que internamente ele deva fazer algo semelhante a um stringbuffer por questoes de performace porem não sei como isto funciona... alguem sabe?
|
SCJP 1.5
SCJA 1.0
IBM DB2 Associate |
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 15/07/2008 10:27:55
|
andrepestana
JavaEvangelist
![[Avatar]](/images/avatar/5be278a9e02bed9248a4674ff62fea2c.png)
Membro desde: 23/03/2004 09:57:28
Mensagens: 380
Offline
|
luistiagos,
Entre no link: http://www.docjar.com/html/api/java/lang/String.java.html e veja como é implementada a classe String.
Abraço,
|
Pestana
http://andrepestana.wordpress.com/ |
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 15/07/2008 10:33:16
|
pintofree
Virtual Machine Man
![[Avatar]](/images/avatar/e0652a0045dbc0b14d016619158789ce.jpg)
Membro desde: 19/12/2007 12:44:42
Mensagens: 651
Localização: Cuiabá - MT
Offline
|
luistiagos wrote:internamente por questões de performase ele deve fazer alguma especie de buffer... pois seria muita burrice uma criar um novo objeto s+"47" qdo se pode simplismente juntar os caracters... creio que internamente ele deva fazer algo semelhante a um stringbuffer por questoes de performace porem não sei como isto funciona... alguem sabe?
Se vc nao sabe, não venha aki supor coisas, e confundir quem ta querendo aprender amigo.
|
SCJP - Sun Certified Java Programmer
SCWCD - Sun Certified Web Component Developer, Enterprise Edition 5
"When the compiler's not happy, ain't nobody happy."
|
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 15/07/2008 10:35:48
|
luistiagos
GUJ Expert
![[Avatar]](/images/avatar/98785ca89cfbbe933921bfe68a94553b.jpg)
Membro desde: 10/07/2006 10:37:23
Mensagens: 3161
Offline
|
ok... mas isto não responde a pergunta do +
oq este + faz? gera uma outra string o que não é muito inteligente ou junta outra string (a esta altura a string ja esta no pool de strings...)
|
SCJP 1.5
SCJA 1.0
IBM DB2 Associate |
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 15/07/2008 10:48:03
|
pintofree
Virtual Machine Man
![[Avatar]](/images/avatar/e0652a0045dbc0b14d016619158789ce.jpg)
Membro desde: 19/12/2007 12:44:42
Mensagens: 651
Localização: Cuiabá - MT
Offline
|
Olha este trecho do livro da Kathy Sierra
We'll finish this section by presenting an example of the kind of devilish String question you might expect to see on the exam. Take the time to work it out on paper (as a hint, try to keep track of how many objects and reference variables there are, and which ones refer to which).
String s1 = "spring ";
String s2 = s1 + "summer ";
s1.concat("fall ") ;
s2.concat(s1);
s1 += "winter ";
System.out.println(s1 + " " + s2);
What is the output? For extra credit, how many String objects and how many reference variables were created prior to the println statement?
Answer: The result of this code fragment is "spring winter spring summer". There are two reference variables, s1 and s2. There were a total of eight String objects created as follows: "spring", "summer " (lost), "spring summer", "fall" (lost), "spring fall" (lost), "spring summer spring" (lost), "winter" (lost), "spring winter" (at this point "spring" is lost). Only two of the eight String objects are not lost in this process.
Important Facts About Strings and Memory
In this section we'll discuss how Java handles String objects in memory, and some of the reasons behind these behaviors.
One of the key goals of any good programming language is to make efficient use of memory. As applications grow, it's very common for String literals to occupy large amounts of a program's memory, and there is often a lot of redundancy within the universe of String literals for a program. To make Java more memory efficient, the JVM sets aside a special area of memory called the "String constant pool." When the compiler encounters a String literal, it checks the pool to sec if an identical String already exists. If a match is found, the reference to the new literal is directed to the existing String, and no new String literal object is created. (The existing String simply has an additional reference.) Now we can start to see why making String objects immutable is such a good idea. If several reference variables refer to the same String without even knowing it, it would be very bad if any of them could change the String's value.
You might say, "Well that's all well and good, but what if someone overrides the String class functionality; couldn't that cause problems in the pool?" That's one of the main reasons that the String class is marked final. Nobody can override the behaviors of any of the String methods, so you can rest assured that the String objects you are counting on to be immutable will, in fact, be immutable.
|
SCJP - Sun Certified Java Programmer
SCWCD - Sun Certified Web Component Developer, Enterprise Edition 5
"When the compiler's not happy, ain't nobody happy."
|
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 15/07/2008 10:53:15
|
ChronoTrigger
Thread.start()
![[Avatar]](/images/avatar/67245236ce5a981076ce7feffc35c893.jpg)
Membro desde: 14/09/2007 14:05:29
Mensagens: 47
Offline
|
internamente por questões de performase ele deve fazer alguma especie de buffer...
O compilador não vai pré-julgar uma coisa dessas, senão questões como esta não existiriam, pois dependeriam daquilo que o compilador acha que é o correto.
O desenvolvedor que, numa aplicação real, vai decidir a melhor maneira de utilizar a api.(utilizando o StringBuffer ou StringBuilder(java 1.5 ou superior))
Na minha opinião o raphaelrabadan está correto. Quando se instancia uma classe todas as strings literais da classe vão para a memória automaticamente.
Quando se chama o método, com certeza a classe já está instanciada, logo...a resposta é C.
Se for realmente isso, eu teria errado.
|
|
|
 |
|
|