<?xml version="1.0" encoding="ISO-8859-1"?>
<rss version="2.0">
	<channel>
		<title><![CDATA[Últimas mensagens do tópico "Dúvida questão [RESOLVIDO]"]]></title>
		<link>http://www.guj.com.br/posts/list/11.java</link>
		<description><![CDATA[Últimas mensagens enviadas no tópico "Dúvida questão [RESOLVIDO]"]]></description>
		<generator>JForum - http://www.jforum.net</generator>
			<item>
				<title>Dúvida questão [RESOLVIDO]</title>
				<description><![CDATA[ [code]package com.certificação.oo1;<br /> <br /> public class MyClass {<br /> <br /> 		public Integer startingI;<br /> <br /> 		public void methodA() {<br /> 		<br /> 			Integer i = new Integer(25);<br /> 		 <br /> 			this.startingI = i;<br /> 		 <br /> 			System.out.println(this.startingI == i);<br /> 			<br /> 			methodB(i);<br /> 		 }<br /> 		 <br /> 		private void methodB(Integer i2) {<br /> 		<br /> 			i2 = i2.intValue();<br /> 		<br /> 			System.out.println(this.startingI == i2) // nao entendi pq retorna false...sei que é por causa do método intValue mas pq?;<br /> 			System.out.println(this.startingI.equals(i2));<br /> 			<br /> 		 }<br /> 		<br /> 		public static void main(String[] args) {<br /> 			<br /> 			new MyClass().methodA();<br /> 				<br /> 		}<br /> 	 }<br /> [/code]<br /> <br /> Galera pq o teste de == ali retorna false? Eu sei que o metodo intValue() retorna um int e que == analisa a referencia na memoria porém se comparado um Integer com um int se ambos tiverem o mesmo valor retorna true como por exemplo:<br /> [code]Integer a = 125;<br /> int b = 125;<br /> System.out.println(a==b); // retorna true[/code]<br /> <br /> Então pq o retorno e falso no teste dentro do método?]]></description>
				<guid isPermaLink="true">http://www.guj.com.br/prepost/197636/991832/duvida-questao-resolvido
</guid>
				<link>http://www.guj.com.br/prepost/197636/991832/duvida-questao-resolvido
</link>
				<pubDate><![CDATA[Mon, 8 Feb 2010 09:55:10]]> GMT</pubDate>
				<author><![CDATA[ evertonsilvagomesjava]]></author>
			</item>
			<item>
				<title>Re:Dúvida questão</title>
				<description><![CDATA[ Acredito que seja por isso... dentro de methodA() você possui duas variáveis referenciando um objeto Integer cujo valor é 25. Essas variáveis são startingI e i. Depois você chama methodB() passando como argumento a variável i. Ao fazer isso, agora você tem 3 variáveis apontando para o objeto Integer cujo valor é 25: startingI, i e i2. Porém, em methodB() você faz o seguinte comando: i2 = i2.intValue();. Nesse ponto acredito que ocorra um boxing do valor retornado por intValue() criando um novo objeto Integer. Assim, startingI e i2 apontam para objetos diferentes na memória, mas que possuem o mesmo valor. Por isso no seu teste de == o valor é falso.<br /> <br /> <br /> Edit: Para finalizar.. no seu outro teste:<br /> [code]<br /> Integer a = 125;<br /> int b = 125;<br /> System.out.println(a == b); //imprime true<br /> [/code]<br /> <br /> Isso acontece por que ocorre um unboxing do valor do objeto referenciado por a. Assim temos dois ints sendo comparados. Aí, como o valor é o mesmo, == retorna true]]></description>
				<guid isPermaLink="true">http://www.guj.com.br/prepost/197636/991845/reduvida-questao
</guid>
				<link>http://www.guj.com.br/prepost/197636/991845/reduvida-questao
</link>
				<pubDate><![CDATA[Mon, 8 Feb 2010 10:06:56]]> GMT</pubDate>
				<author><![CDATA[ douglas_vidotto]]></author>
			</item>
			<item>
				<title>Re:Dúvida questão</title>
				<description><![CDATA[ Não sabia que ele iria criar um novo objeto ali não...<br /> <br /> [code]i2 = i2.intValue();[/code]<br /> <br /> E criado entao um novo objeto integer? Pq na realidade ele ta fazendo um unboxing de Integer pra int...   <br /> ]]></description>
				<guid isPermaLink="true">http://www.guj.com.br/prepost/197636/991858/reduvida-questao
</guid>
				<link>http://www.guj.com.br/prepost/197636/991858/reduvida-questao
</link>
				<pubDate><![CDATA[Mon, 8 Feb 2010 10:17:05]]> GMT</pubDate>
				<author><![CDATA[ evertonsilvagomesjava]]></author>
			</item>
			<item>
				<title>Re:Dúvida questão</title>
				<description><![CDATA[ Na realidade vc ta fazendo de Integer pra int e pra Integer de novo, pq a variável i2 é do tipo Integer.<br /> ]]></description>
				<guid isPermaLink="true">http://www.guj.com.br/prepost/197636/991861/reduvida-questao
</guid>
				<link>http://www.guj.com.br/prepost/197636/991861/reduvida-questao
</link>
				<pubDate><![CDATA[Mon, 8 Feb 2010 10:20:54]]> GMT</pubDate>
				<author><![CDATA[ mario.fts]]></author>
			</item>
			<item>
				<title>Re:Dúvida questão</title>
				<description><![CDATA[ hum é isso mesmo, unboxing de Integer pra int e boxing de int pra Integer de novo, mas nao entendo pq ele cria um novo objeto...]]></description>
				<guid isPermaLink="true">http://www.guj.com.br/prepost/197636/991863/reduvida-questao
</guid>
				<link>http://www.guj.com.br/prepost/197636/991863/reduvida-questao
</link>
				<pubDate><![CDATA[Mon, 8 Feb 2010 10:21:40]]> GMT</pubDate>
				<author><![CDATA[ evertonsilvagomesjava]]></author>
			</item>
			<item>
				<title>Re:Dúvida questão</title>
				<description><![CDATA[ Ele cria um novo objeto porque toda vez que ele faz um boxing, ocorre um processo parecido com isso (pelo que está no livro da Kathy Sierra):<br /> [code]<br /> //Quando fazemos  i2 = i2.intValue(); ocorre algo parecido com isso<br /> int x = i2.intValue();<br /> i2 = new Integer(x);<br /> [/code]<br /> ]]></description>
				<guid isPermaLink="true">http://www.guj.com.br/prepost/197636/991878/reduvida-questao
</guid>
				<link>http://www.guj.com.br/prepost/197636/991878/reduvida-questao
</link>
				<pubDate><![CDATA[Mon, 8 Feb 2010 10:38:09]]> GMT</pubDate>
				<author><![CDATA[ douglas_vidotto]]></author>
			</item>
			<item>
				<title>Re:Dúvida questão</title>
				<description><![CDATA[ hum ok vlw.]]></description>
				<guid isPermaLink="true">http://www.guj.com.br/prepost/197636/991896/reduvida-questao
</guid>
				<link>http://www.guj.com.br/prepost/197636/991896/reduvida-questao
</link>
				<pubDate><![CDATA[Mon, 8 Feb 2010 10:53:07]]> GMT</pubDate>
				<author><![CDATA[ evertonsilvagomesjava]]></author>
			</item>
			<item>
				<title>Re:Dúvida questão</title>
				<description><![CDATA[ Dizer que um objeto (startingI) não pode ser comparado com uma variável primitiva (i2 = i2.intValue()) com == , faz algum sentido??]]></description>
				<guid isPermaLink="true">http://www.guj.com.br/prepost/197636/991967/reduvida-questao
</guid>
				<link>http://www.guj.com.br/prepost/197636/991967/reduvida-questao
</link>
				<pubDate><![CDATA[Mon, 8 Feb 2010 12:15:49]]> GMT</pubDate>
				<author><![CDATA[ Metal Java Full]]></author>
			</item>
			<item>
				<title>Re:Dúvida questão</title>
				<description><![CDATA[ Nao faz pq vc pode comparar com == que da true, a questao e que realmente ele criou um novo objeto.<br /> <br /> Se vc fizer um teste vera que da true:<br /> <br /> [code]Integer a = new Integer(10)<br /> int b = 10;<br /> System.out.println(a == b);[/code]]]></description>
				<guid isPermaLink="true">http://www.guj.com.br/prepost/197636/991982/reduvida-questao
</guid>
				<link>http://www.guj.com.br/prepost/197636/991982/reduvida-questao
</link>
				<pubDate><![CDATA[Mon, 8 Feb 2010 12:38:15]]> GMT</pubDate>
				<author><![CDATA[ evertonsilvagomesjava]]></author>
			</item>
			<item>
				<title>Re:Dúvida questão</title>
				<description><![CDATA[ se no unboxing ele usar new Integer(10), ele vai criar um novo:<br /> <br /> [url]http://java.sun.com/j2se/1.5.0/docs/api/java/lang/Integer.html#Integer(int)[/url]<br /> <br /> [quote]Constructs a newly allocated Integer object that represents the specified int value. [/quote]<br /> <br /> Vc tem que considerar tbm o fator de cache do integer. <br /> <br /> [code]	public static void main(String[] args) {<br /> 	<br /> 		Integer a = 127;<br /> 		Integer b = 127;<br /> 		<br /> 		System.out.println(a==b); //imprime true<br /> 		<br /> 		Integer c = 128;<br /> 		Integer d = 128;<br /> 		<br /> 		System.out.println(c==d); // imprime false<br /> 		<br /> 	}[/code]<br /> <br /> PQ? pq o Integer tem um cache interno de objetos, até o 127. Os objetos maiores que 127 são criados dinamicamente.]]></description>
				<guid isPermaLink="true">http://www.guj.com.br/prepost/197636/991988/reduvida-questao
</guid>
				<link>http://www.guj.com.br/prepost/197636/991988/reduvida-questao
</link>
				<pubDate><![CDATA[Mon, 8 Feb 2010 12:50:21]]> GMT</pubDate>
				<author><![CDATA[ mario.fts]]></author>
			</item>
			<item>
				<title>Re:Dúvida questão</title>
				<description><![CDATA[ Noossaa!!!!<br /> Preciso anotar essa!<br /> Mto boa!<br /> <br /> vlew  <img src="http://www.guj.com.br/images/smilies/9293feeb0183c67ea1ea8c52f0dbaf8c.gif" border="0">  <img src="http://www.guj.com.br/images/smilies/9293feeb0183c67ea1ea8c52f0dbaf8c.gif" border="0"> ]]></description>
				<guid isPermaLink="true">http://www.guj.com.br/prepost/197636/991991/reduvida-questao
</guid>
				<link>http://www.guj.com.br/prepost/197636/991991/reduvida-questao
</link>
				<pubDate><![CDATA[Mon, 8 Feb 2010 12:51:57]]> GMT</pubDate>
				<author><![CDATA[ Metal Java Full]]></author>
			</item>
			<item>
				<title>Re:Dúvida questão [RESOLVIDO]</title>
				<description><![CDATA[ Por um acaso cai neste tópico e notei que há um pequeno equívoco que pode gerar confusão no entendimento de algumas pessoas. Deixarei meu comentário pois pode servir como referência.<br /> <br /> Nem SEMPRE que é feito um boxing, o new Integer() é chamado.<br /> <br /> Antes de mais nada é realizada uma verificação no cache, para ver se já foi feito algum outro boxing que bata com o mesmo tipo e valor  deste, até o limite do valor de 127. Se já existe, NÃO é feito o new Integer().<br /> <br /> Neste caso a variável em questão, apenas referencia o mesmo endereço de memória do objeto já existente no cache.<br /> <br /> Não se ater a este "detalhe" pode nos confundir pelo seguinte motivo:<br /> [code]<br />     Integer a = 25; //novo objeto<br />     Integer b = 25; //usa o mesmo objeto acima. Obs.: se fizéssemos "Integer b = a;" também funcionaria, mas estaríamos simplesmente passando a referência de "a" diretamente. Daí não faria boxing, muito menos usaria o sistema de caching.<br />     b = b.intValue(); //faz unboxing e logo após, boxing novamente. No momento do boxing, é usado o mesmo objeto da variável de referência "a" em cache.<br />     System.out.println(a == b); //true<br /> [/code]<br /> Resultado: true. Pois a variável "b" apenas apontou para o mesmo objeto armazenado no cache outrora criado pela variável "a". Então "b" "aponta" para o mesmo objeto no Heap que "a". Logo podem-se considerar iguais.<br /> <br /> enquanto:<br /> [code]<br />     Integer a = new Integer(25); //novo objeto.<br />     Integer b = a; // isto é apenas uma cópia da referência "a". Até aqui b == a é verdadeiro.<br />     b = b.intValue(); //ao fazer o boxing, não há cache, logo é criado o novo objeto diferente com "new Integer()".<br />     System.out.println(a == b); //false<br /> [/code]<br /> Resulta em false. Pois até a linha 3 ainda não tinha sido criado nenhum objeto utilizando a estratégia boxing, logo não existia nada armazenado no cache. Neste caso sim é feito o new Integer() criando um novo endereço de memória. Então após a linha 3, a variável "a" e "b" são objetos diferentes.<br /> <br /> No caso do exemplo original o parâmetro que methodB() recebe não foi criado através de boxing. Apenas frisando, como "i" foi criado da forma mais completa (Integer i = new Integer(25)), nada foi armazenado no cache, então ao fazer o boxing na variável "i2", a classe Integer não encontra nada no cache, então o Construtor (new Integer(25)) é chamado, criando um novo objeto. Por isso o código retorna false.<br /> [quote]<br /> ...<br /> Integer i = new Integer(25); <br /> ...<br /> methodB(i); <br /> ...<br /> <br /> private void methodB(Integer i2) { <br />             i2 = i2.intValue(); //não há cache, então cria um novo Integer.<br />             System.out.println(this.startingI == i2) //retorna false, os objetos são diferentes.<br /> [/quote]<br /> <br /> Apenas como um exemplo, com o simples processo de alterar a linha que cria "Integer i = new Integer(25)" para "Integer i = 25", já seria o suficiente para o código retornar true, ao invés de false, já que a linha "i2 = i2.intValue()" não faria um new Integer(), mas sim usaria o mesmo endereço de memória que a variável "i" estaria "apontando".]]></description>
				<guid isPermaLink="true">http://www.guj.com.br/prepost/197636/1105236/reduvida-questao-resolvido
</guid>
				<link>http://www.guj.com.br/prepost/197636/1105236/reduvida-questao-resolvido
</link>
				<pubDate><![CDATA[Thu, 26 Aug 2010 18:30:21]]> GMT</pubDate>
				<author><![CDATA[ stone010]]></author>
			</item>
			<item>
				<title>Re:Dúvida questão [RESOLVIDO]</title>
				<description><![CDATA[ [quote=stone010]Por um acaso cai neste tópico e notei que há um pequeno equívoco que pode gerar confusão no entendimento de algumas pessoas. Deixarei meu comentário pois pode servir como referência.<br /> <br /> Nem SEMPRE que é feito um boxing, o new Integer() é chamado.<br /> <br /> Antes de mais nada é realizada uma verificação no cache, para ver se já foi feito algum outro boxing que bata com o mesmo tipo e valor  deste, até o limite do valor de 127. Se já existe, NÃO é feito o new Integer().<br /> <br /> Neste caso a variável em questão, apenas referencia o mesmo endereço de memória do objeto já existente no cache.<br /> <br /> Não se ater a este "detalhe" pode nos confundir pelo seguinte motivo:<br /> [code]<br />     Integer a = 25; //novo objeto<br />     Integer b = 25; //usa o mesmo objeto acima. Obs.: se fizéssemos "Integer b = a;" também funcionaria, mas estaríamos simplesmente passando a referência de "a" diretamente. Daí não faria boxing, muito menos usaria o sistema de caching.<br />     b = b.intValue(); //faz unboxing e logo após, boxing novamente. No momento do boxing, é usado o mesmo objeto da variável de referência "a" em cache.<br />     System.out.println(a == b); //true<br /> [/code]<br /> Resultado: true. Pois a variável "b" apenas apontou para o mesmo objeto armazenado no cache outrora criado pela variável "a". Então "b" "aponta" para o mesmo objeto no Heap que "a". Logo podem-se considerar iguais.<br /> <br /> enquanto:<br /> [code]<br />     Integer a = new Integer(25); //novo objeto.<br />     Integer b = a; // isto é apenas uma cópia da referência "a". Até aqui b == a é verdadeiro.<br />     b = b.intValue(); //ao fazer o boxing, não há cache, logo é criado o novo objeto diferente com "new Integer()".<br />     System.out.println(a == b); //false<br /> [/code]<br /> Resulta em false. Pois até a linha 3 ainda não tinha sido criado nenhum objeto utilizando a estratégia boxing, logo não existia nada armazenado no cache. Neste caso sim é feito o new Integer() criando um novo endereço de memória. Então a variável "a" e "b" são objetos diferentes.<br /> <br /> No caso do exemplo original o parâmetro que methodB() recebe não foi criado através de boxing. Apenas frisando, como "i" foi criado da forma mais completa (Integer i = new Integer(25)), nada foi armazenado no cache, então ao fazer o boxing na variável "i2", a classe Integer não encontra nada no cache, então o Construtor (new Integer(25)) é chamado, criando um novo objeto. Por isso o código retorna false.<br /> [quote]<br /> private void methodB(Integer i2) { <br />             i2 = i2.intValue(); //não há cache, então cria um novo Integer.<br />             System.out.println(this.startingI == i2) //retorna false, os objetos são diferentes.<br /> [/quote]<br /> <br /> Apenas como um exemplo, com o simples processo de alterar a linha que cria "Integer i = new Integer(25)" para "Integer i = 25", já seria o suficiente para o código retornar true, ao invés de false, já que a linha "i2 = i2.intValue()" não faria um new Integer(), mas sim usaria o mesmo endereço de memória que a variável "i" estaria "apontando".[/quote]<br /> <br /> Mto boa explicação.]]></description>
				<guid isPermaLink="true">http://www.guj.com.br/prepost/197636/1105352/reduvida-questao-resolvido
</guid>
				<link>http://www.guj.com.br/prepost/197636/1105352/reduvida-questao-resolvido
</link>
				<pubDate><![CDATA[Thu, 26 Aug 2010 23:34:04]]> GMT</pubDate>
				<author><![CDATA[ evertonsilvagomesjava]]></author>
			</item>
	</channel>
</rss>
