Re: Re: [java-list] Instâncias
Nada disso. Como as coisas são Objetos o == compara se é o MESMO OBJETO, ou seja, se duas variáveis fazem referência pra MESMA INSTÂNCIA do objeto. Pode ter vários objetos iguais, ou seja, com a mesma forma e conteúdo que não são o mesmo objeto. Pra isso tem os métodos equals(), contentEquals(), compare(). Achar que dois objetos da mesma classe e com o mesmo conteúdo devem ser == é o mesmo que dizer que japônes é tudo igual :-). Como a classe String é imutável, não pode ser alterada, o compilador otimiza o uso da memória usando o mesmo objeto pras duas strings com mesmo conteúdo. Mas não conte com isto em todas as versões e implementações. Pode considerar que no exemplo o x só é igual ao y por coincidência. Michel writes: Caro Luiz Barbosa, estou utilizando apenas para exemplificar, se, antes da comparação, voce mandar escrever na tela os valores de x e de y, serão ambos de 100, mas o 1º ele considera iguais, o 2º não. Já que possuem valores iguais, não acha que ambos deveria retornar o mesmo valor na comparação (x == y)??? --- Mauro Ramos Martini [EMAIL PROTECTED] counter.li.org#225287 -- LISTA SOUJAVA http://www.soujava.org.br - Sociedade de Usuários Java da Sucesu-SP dúvidas mais comuns: http://www.soujava.org.br/faq.htm regras da lista: http://www.soujava.org.br/regras.htm historico: http://www.mail-archive.com/java-list%40soujava.org.br para sair da lista: envie email para [EMAIL PROTECTED] -
RES: Re: [java-list] Instâncias
Caros membros da lista, Essa questão já foi discutida há um tempo atrás, voltou novamente agora, e ainda gera discussões. Postei uma mensagem há poucos dias, explicando a diferença entre literais String e objetos String. Talvez tenha ficado meio confuso o texto, mais aí vai novamente. A diferença está apenas na forma de declaração e inicialização das variáveis String. Ao contrário do que ocorre com qualquer outra classe, na classe String existem 2 formas de declaração de variáveis. A primeira é a forma normal, com a clara indicação de alocação de novo espaço de memória através do operador new: String str = new String(texto); E a outra forma de declaração de String, por meio do uso de literais. Um literal é a parte à direita da declaração abaixo. Observem que não há uso do operador new: String str = texto; Essa última forma de declaração de objetos é uma exceção à regra da declaração e inicialização de objetos em Java: não é criado um novo objeto, e sim reaproveitado um novo espaço, caso haja um espaço de memória ocupado por uma String de mesmo conteúdo. Portanto, SEMPRE a comparação abaixo vai ser TRUE: String str1 = teste; String str2 = teste; System.out.println( str1 == str2 = +(str1==str2)); Isso SÓ vale para String's. Tudo isso aqui está muito bem documentado, faz parte da especificação de JAVA, e pra quem quiser comprovar, é só dar uma lida no The Java Language Specification, do James Gosling (et al.) Está disponível on-line. O endereço: http://java.sun.com/docs/books/jls/second_edition/html/j.title.doc.html Boa leitura!!! Rosfran Lins Borges Analista de Sistemas - NSV [EMAIL PROTECTED] Fóton® Informática e Serviços Fone: (61) 3031 5060 R.: 5037 -Mensagem original- De: Mauro [mailto:martini;floripa.com.br] Enviada em: quarta-feira, 16 de outubro de 2002 12:29 Para: [EMAIL PROTECTED] Assunto: Re: Re: [java-list] Instâncias Nada disso. Como as coisas são Objetos o == compara se é o MESMO OBJETO, ou seja, se duas variáveis fazem referência pra MESMA INSTÂNCIA do objeto. Pode ter vários objetos iguais, ou seja, com a mesma forma e conteúdo que não são o mesmo objeto. Pra isso tem os métodos equals(), contentEquals(), compare(). Achar que dois objetos da mesma classe e com o mesmo conteúdo devem ser == é o mesmo que dizer que japônes é tudo igual :-). Como a classe String é imutável, não pode ser alterada, o compilador otimiza o uso da memória usando o mesmo objeto pras duas strings com mesmo conteúdo. Mas não conte com isto em todas as versões e implementações. Pode considerar que no exemplo o x só é igual ao y por coincidência. Michel writes: Caro Luiz Barbosa, estou utilizando apenas para exemplificar, se, antes da comparação, voce mandar escrever na tela os valores de x e de y, serão ambos de 100, mas o 1º ele considera iguais, o 2º não. Já que possuem valores iguais, não acha que ambos deveria retornar o mesmo valor na comparação (x == y)??? --- Mauro Ramos Martini [EMAIL PROTECTED] counter.li.org#225287 -- LISTA SOUJAVA http://www.soujava.org.br - Sociedade de Usuários Java da Sucesu-SP dúvidas mais comuns: http://www.soujava.org.br/faq.htm regras da lista: http://www.soujava.org.br/regras.htm historico: http://www.mail-archive.com/java-list%40soujava.org.br para sair da lista: envie email para [EMAIL PROTECTED] - -- LISTA SOUJAVA http://www.soujava.org.br - Sociedade de Usuários Java da Sucesu-SP dúvidas mais comuns: http://www.soujava.org.br/faq.htm regras da lista: http://www.soujava.org.br/regras.htm historico: http://www.mail-archive.com/java-list%40soujava.org.br para sair da lista: envie email para [EMAIL PROTECTED] -
Fw: [java-list] Instâncias
Correto Rafael Vilardo e o JSams tb deu uma explicação muito boa. Para fechar: String x = "100"; String y = new String("100"); if(x == y) System.out.println("IGUAL!!!"); // não entra aqui. Qualquer outro tipo de inicialização de y (que não seja o uso de literais, mesmo concatenadas, por exemplo), inclusive a partir da chamada a NEW vai quebrar a comparação do if acima, a não ser que utilizemos o método equals...porque os referências dos objetos em memória serão diferentes!! []'s Caetano - Original Message - From: [EMAIL PROTECTED] To: [EMAIL PROTECTED] Sent: Wednesday, October 16, 2002 12:04 PM Subject: RES: [java-list] Instâncias Vamos lá... no primeiro exemplo, como vc está usando uma string literal para inicializar as duas variáveis, na verdade o que acontece é uma otimização na hora da compilação, criando uma constante para representar a string literal. Sendo assim, as duas variáveis "apontam" para o mesmo objeto. Já quando vc usa o Integer.toString(100), um outro objeto é criado, por isso a comparação == não funciona. Qualquer dúvida, dá ma lida no www.precisejava.com, que têm uma sessão sobre otimização no uso de strings, entre outros ( ejb, servlets, loops, etc ). Abs, Rafael Vilardo. -Mensagem original-De: Michel [mailto:[EMAIL PROTECTED]]Enviada em: terça-feira, 15 de outubro de 2002 11:36Para: [EMAIL PROTECTED]Assunto: [java-list] Instâncias Olá galera! Para exemplificar minha dúvida, mostrarei dois exemplos: -EXEMPLO 1-- public static void main(String args[]) { String x = "100"; String y = "100"; if(x == y) System.out.println("IGUAL!!!") } EXEMPLO 2-- public static void main(String args[]) { String x = "100"; String y = Integer.toString(100); if(x == y) System.out.println("IGUAL!!!"); } No exemplo 1, aparece na tela "IGUAL!!!", no exemplo 2 não aparece nada! Sei que para comparar duas Strings tenho o mótodo equals(String s), mas para fins de conhecimento, gostaria de saber por quê o 1º exemplo funciona e o 2º não. Obrigado.
RE: [java-list] Instâncias
Michel, Vc tem toda razão. Não fui muito claro em minha explicação. Onde já se viu mera coinscidência em programação?!? Ou é TRUE ou é FALSE, depende de como os objetos serão instanciados. Para obter TRUE: String x = 100; String y = 100; Para obter FALSE: String x = new String(100); String y = new String(100); Minhas desculpas... []'s Rafael Pioli -Original Message- From: Michel [mailto:hewlet;ieg.com.br] Sent: quarta-feira, 16 de outubro de 2002 12:17 To: [EMAIL PROTECTED] Subject: Re: [java-list] Instâncias Caro SILVA Rafael P CONFAB: O fato do 1º exemplo ter dado TRUE definitivamente não é mera coincidência! Caiu no exame de programador o que seria impresso, se fosse apenas coincidência, não poderíamos dar uma resposta precisa! - Original Message - From: SILVA Rafael P CONFAB [EMAIL PROTECTED] To: [EMAIL PROTECTED] Sent: Tuesday, October 15, 2002 5:04 PM Subject: RE: [java-list] Instâncias Pessoal, Tem muito mais coisas envolvidas nisso... O fato da primeira comparação ter dado TRUE é pura coinscidência, tanto poderia como não poderia ter dado TRUE. A questão é como o Java aloca os objetos na memória e acaba reutilizando objetos iguais com endereços diferentes. Vale a pena dar uma olhada no tema HEAP, procurem na WEB. Para quem tem o Core Java vol. 1 lá tb tem boas explicações. -Original Message- From: Giovani Salvador [mailto:giovani-salvador;procergs.rs.gov.br] Sent: terça-feira, 15 de outubro de 2002 13:07 To: [EMAIL PROTECTED] Subject: Re: [java-list] Instâncias Legal a questão. Depurei o código dentro do JBuilder e dei uma olhada nas propriedades dos objetos. No primeiro exemplo, tudo igual, no segundo, as propriedades Offset e Value estavam diferentes. Em Value foram considerados os zero à esquerda em 9 posições, por isso deu diferente. Abaixo, o código do método toString da classe Integer. Neste código é que deu a diferença. /** * Returns a codeString/code object representing the * specified integer. The argument is converted to signed decimal * representation and returned as a string, exactly as if the * argument and radix 10 were given as arguments to the {@link mailto:{;link * #toString(int, int)} method. * * @param i an integer to be converted. * @return a string representation of the argument in basenbsp;10. */ public static String toString(int i) { int q, r, charPos ; charPos = 12 ; char buf [] = new char [charPos] ; char sign = 0 ; if (i == Integer.MIN_VALUE) { return -2147483648; } if (i 0) { sign = '-' ; i = -i ; } // Generate two digits per iteration while ( i = 65536 ) { q = i / 100 ; // really: r = i - (q * 100) ; r = i - ((q 6) + (q 5) + (q 2)) ; i = q ; buf [--charPos] = DigitOnes [r] ; buf [--charPos] = DigitTens [r] ; } // Fall thru to fast mode for smaller numbers // assert(i = 65536, i); for (;;) { q = (i * 52429) (16+3) ; r = i - ((q 3) + (q 1)) ; // r = i-(q*10) ... buf [--charPos] = digits [r] ; i = q ; if (i == 0) break ; } if (sign != 0) { buf [--charPos] = sign ; } ** Giovani Salvador Site pessoal - http://pagina.de/siglas http://pagina.de/siglas (Siglas de informática) PROCERGS - Cia. de Processamento de Dados do Estado do Rio Grande do Sul - BRASIL Setor TSI - Tecnologia para Sistemas de Informação ICQ #44904309 ** - Original Message - From: Michel mailto:hewlet;ieg.com.br To: [EMAIL PROTECTED] mailto:java-list;soujava.org.br Sent: Tuesday, October 15, 2002 11:36 AM Subject: [java-list] Instâncias Olá galera! Para exemplificar minha dúvida, mostrarei dois exemplos: -EXEMPLO 1-- public static void main(String args[]) { String x = 100; String y = 100; if(x == y) System.out.println(IGUAL!!!) } EXEMPLO 2-- public static void main(String args[]) { String x = 100; String y = Integer.toString(100); if(x == y) System.out.println(IGUAL!!!); } No exemplo 1, aparece na tela IGUAL!!!, no exemplo 2 não aparece nada! Sei que para comparar duas Strings tenho o mótodo equals(String s), mas para fins de conhecimento, gostaria de saber por quê o 1º exemplo funciona e o 2º não. Obrigado. -- LISTA SOUJAVA http://www.soujava.org.br - Sociedade de Usuários Java da Sucesu-SP dúvidas mais comuns: http://www.soujava.org.br/faq.htm regras da lista: http://www.soujava.org.br/regras.htm historico: http://www.mail-archive.com/java-list%40soujava.org.br para sair da lista: envie email para [EMAIL PROTECTED] - -- LISTA SOUJAVA http://www.soujava.org.br - Sociedade de Usuários Java da Sucesu-SP dúvidas mais comuns: http
Re: [java-list] Instâncias
no primeiro, o compilador detecta q os valores das duas strings são iguais e por isso só cria uma referência na memória q aponta para o mesmo valor. Funciona pq o compilador detecta esse detalhe. no segundo, vc volta uma referencia diferente para a variavel 'y' pq vc usa um método da classe Integer q retorna um objeto String, daí o pq de nao funcionar. belê? falowww - Original Message - From: Michel To: [EMAIL PROTECTED] Sent: Tuesday, October 15, 2002 11:36 AM Subject: [java-list] Instâncias Olá galera! Para exemplificar minha dúvida, mostrarei dois exemplos: -EXEMPLO 1-- public static void main(String args[]) { String x = "100"; String y = "100"; if(x == y) System.out.println("IGUAL!!!") } EXEMPLO 2-- public static void main(String args[]) { String x = "100"; String y = Integer.toString(100); if(x == y) System.out.println("IGUAL!!!"); } No exemplo 1, aparece na tela "IGUAL!!!", no exemplo 2 não aparece nada! Sei que para comparar duas Strings tenho o mótodo equals(String s), mas para fins de conhecimento, gostaria de saber por quê o 1º exemplo funciona e o 2º não. Obrigado.
RE: [java-list] Instâncias
Pessoal, Tem muito mais coisas envolvidas nisso... O fato da primeira comparação ter dado TRUE é pura coinscidência, tanto poderia como não poderia ter dado TRUE. A questão é como o Java aloca os objetos na memória e acaba reutilizando objetos iguais com endereços diferentes. Vale a pena dar uma olhada no tema HEAP, procurem na WEB. Para quem tem o Core Java vol. 1 lá tb tem boas explicações. -Original Message- From: Giovani Salvador [mailto:[EMAIL PROTECTED]] Sent: terça-feira, 15 de outubro de 2002 13:07 To: [EMAIL PROTECTED] Subject: Re: [java-list] Instâncias Legal a questão. Depurei o código dentro do JBuilder e dei uma olhada nas propriedades dos objetos. No primeiro exemplo, tudo igual, no segundo, as propriedades Offset e Value estavam diferentes. Em Value foram considerados os zero à esquerda em 9 posições, por isso deu diferente. Abaixo, o código do método toString da classe Integer. Neste código é que deu a diferença. /** * Returns a codeString/code object representing the * specified integer. The argument is converted to signed decimal * representation and returned as a string, exactly as if the * argument and radix 10 were given as arguments to the {@link mailto:{@link * #toString(int, int)} method. * * @param i an integer to be converted. * @return a string representation of the argument in basenbsp;10. */ public static String toString(int i) { int q, r, charPos ; charPos = 12 ; char buf [] = new char [charPos] ; char sign = 0 ; if (i == Integer.MIN_VALUE) { return -2147483648; } if (i 0) { sign = '-' ; i = -i ; } // Generate two digits per iteration while ( i = 65536 ) { q = i / 100 ; // really: r = i - (q * 100) ; r = i - ((q 6) + (q 5) + (q 2)) ; i = q ; buf [--charPos] = DigitOnes [r] ; buf [--charPos] = DigitTens [r] ; } // Fall thru to fast mode for smaller numbers // assert(i = 65536, i); for (;;) { q = (i * 52429) (16+3) ; r = i - ((q 3) + (q 1)) ; // r = i-(q*10) ... buf [--charPos] = digits [r] ; i = q ; if (i == 0) break ; } if (sign != 0) { buf [--charPos] = sign ; } ** Giovani Salvador Site pessoal - http://pagina.de/siglas http://pagina.de/siglas (Siglas de informática) PROCERGS - Cia. de Processamento de Dados do Estado do Rio Grande do Sul - BRASIL Setor TSI - Tecnologia para Sistemas de Informação ICQ #44904309 ** - Original Message - From: Michel mailto:[EMAIL PROTECTED] To: [EMAIL PROTECTED] mailto:[EMAIL PROTECTED] Sent: Tuesday, October 15, 2002 11:36 AM Subject: [java-list] Instâncias Olá galera! Para exemplificar minha dúvida, mostrarei dois exemplos: -EXEMPLO 1-- public static void main(String args[]) { String x = 100; String y = 100; if(x == y) System.out.println(IGUAL!!!) } EXEMPLO 2-- public static void main(String args[]) { String x = 100; String y = Integer.toString(100); if(x == y) System.out.println(IGUAL!!!); } No exemplo 1, aparece na tela IGUAL!!!, no exemplo 2 não aparece nada! Sei que para comparar duas Strings tenho o mótodo equals(String s), mas para fins de conhecimento, gostaria de saber por quê o 1º exemplo funciona e o 2º não. Obrigado. -- LISTA SOUJAVA http://www.soujava.org.br - Sociedade de Usuários Java da Sucesu-SP dúvidas mais comuns: http://www.soujava.org.br/faq.htm regras da lista: http://www.soujava.org.br/regras.htm historico: http://www.mail-archive.com/java-list%40soujava.org.br para sair da lista: envie email para [EMAIL PROTECTED] -
RE: [java-list] Instâncias
Title: Message Caro Michel, No Exemplo1, para salvar espaço e reduzir a complexidade, até mesmo duas strings são inicializadas, o compilador Java cria somente um espaço na memória para armazenar 100 quando o main é executado. O espaço da memória é compartilhado pelos dois objetos Strings na hora da compilação, e as variáveis x e y são simplismente ponteiro para o mesmo espaço de memória. Por isto, que você ve plotar IGUAL quando utiliza ==, os dois são o mesmo espaço de memória. No Exemplo 2,quando o código Java é executado, o conteúdo das Strings x, y será omesmo: a string 100. Entretanto, eles não irão apontar para o mesmo local de memória, então ele não plotará IGUAL neste caso. O objeto String x é alocado e recebe o valor 100 na hora da compilação. Jáo objeto String y é alocado e recebe o valor 100 na hora que o programa roda, portanto ele aloca outro espaço de memória diferente. Espero ter ajudado. Rafael Siqueira Webraska do Brasil (Mobiminds) Director of Development - Automotive Division Tel.: +55-11-3518-9080 r.208 [EMAIL PROTECTED] Perdido?Visite -Original Message- From: Michel [mailto:[EMAIL PROTECTED]] Sent: terça-feira, 15 de outubro de 2002 11:36 To: [EMAIL PROTECTED] Subject: [java-list] Instâncias Olá galera! Para exemplificar minha dúvida, mostrarei dois exemplos: -EXEMPLO 1-- public static void main(String args[]) { String x = 100; String y = 100; if(x == y) System.out.println(IGUAL!!!) } EXEMPLO 2-- public static void main(String args[]) { String x = 100; String y = Integer.toString(100); if(x == y) System.out.println(IGUAL!!!); } No exemplo 1, aparece na tela IGUAL!!!, no exemplo 2 não aparece nada! Sei que para comparar duas Strings tenho o mótodo equals(String s), mas para fins de conhecimento, gostaria de saber por quê o 1º exemplo funciona e o 2º não. Obrigado.
Re: [java-list] Instâncias
Caro SILVA Rafael P CONFAB: O fato do 1º exemplo ter dado TRUE definitivamente não é mera coincidência! Caiu no exame de programador o que seria impresso, se fosse apenas coincidência, não poderíamos dar uma resposta precisa! - Original Message - From: SILVA Rafael P CONFAB [EMAIL PROTECTED] To: [EMAIL PROTECTED] Sent: Tuesday, October 15, 2002 5:04 PM Subject: RE: [java-list] Instâncias Pessoal, Tem muito mais coisas envolvidas nisso... O fato da primeira comparação ter dado TRUE é pura coinscidência, tanto poderia como não poderia ter dado TRUE. A questão é como o Java aloca os objetos na memória e acaba reutilizando objetos iguais com endereços diferentes. Vale a pena dar uma olhada no tema HEAP, procurem na WEB. Para quem tem o Core Java vol. 1 lá tb tem boas explicações. -Original Message- From: Giovani Salvador [mailto:[EMAIL PROTECTED]] Sent: terça-feira, 15 de outubro de 2002 13:07 To: [EMAIL PROTECTED] Subject: Re: [java-list] Instâncias Legal a questão. Depurei o código dentro do JBuilder e dei uma olhada nas propriedades dos objetos. No primeiro exemplo, tudo igual, no segundo, as propriedades Offset e Value estavam diferentes. Em Value foram considerados os zero à esquerda em 9 posições, por isso deu diferente. Abaixo, o código do método toString da classe Integer. Neste código é que deu a diferença. /** * Returns a codeString/code object representing the * specified integer. The argument is converted to signed decimal * representation and returned as a string, exactly as if the * argument and radix 10 were given as arguments to the {@link mailto:{@link * #toString(int, int)} method. * * @param i an integer to be converted. * @return a string representation of the argument in basenbsp;10. */ public static String toString(int i) { int q, r, charPos ; charPos = 12 ; char buf [] = new char [charPos] ; char sign = 0 ; if (i == Integer.MIN_VALUE) { return -2147483648; } if (i 0) { sign = '-' ; i = -i ; } // Generate two digits per iteration while ( i = 65536 ) { q = i / 100 ; // really: r = i - (q * 100) ; r = i - ((q 6) + (q 5) + (q 2)) ; i = q ; buf [--charPos] = DigitOnes [r] ; buf [--charPos] = DigitTens [r] ; } // Fall thru to fast mode for smaller numbers // assert(i = 65536, i); for (;;) { q = (i * 52429) (16+3) ; r = i - ((q 3) + (q 1)) ; // r = i-(q*10) ... buf [--charPos] = digits [r] ; i = q ; if (i == 0) break ; } if (sign != 0) { buf [--charPos] = sign ; } ** Giovani Salvador Site pessoal - http://pagina.de/siglas http://pagina.de/siglas (Siglas de informática) PROCERGS - Cia. de Processamento de Dados do Estado do Rio Grande do Sul - BRASIL Setor TSI - Tecnologia para Sistemas de Informação ICQ #44904309 ** - Original Message - From: Michel mailto:[EMAIL PROTECTED] To: [EMAIL PROTECTED] mailto:[EMAIL PROTECTED] Sent: Tuesday, October 15, 2002 11:36 AM Subject: [java-list] Instâncias Olá galera! Para exemplificar minha dúvida, mostrarei dois exemplos: -EXEMPLO 1-- public static void main(String args[]) { String x = 100; String y = 100; if(x == y) System.out.println(IGUAL!!!) } EXEMPLO 2-- public static void main(String args[]) { String x = 100; String y = Integer.toString(100); if(x == y) System.out.println(IGUAL!!!); } No exemplo 1, aparece na tela IGUAL!!!, no exemplo 2 não aparece nada! Sei que para comparar duas Strings tenho o mótodo equals(String s), mas para fins de conhecimento, gostaria de saber por quê o 1º exemplo funciona e o 2º não. Obrigado. -- LISTA SOUJAVA http://www.soujava.org.br - Sociedade de Usuários Java da Sucesu-SP dúvidas mais comuns: http://www.soujava.org.br/faq.htm regras da lista: http://www.soujava.org.br/regras.htm historico: http://www.mail-archive.com/java-list%40soujava.org.br para sair da lista: envie email para [EMAIL PROTECTED] - -- LISTA SOUJAVA http://www.soujava.org.br - Sociedade de Usuários Java da Sucesu-SP dúvidas mais comuns: http://www.soujava.org.br/faq.htm regras da lista: http://www.soujava.org.br/regras.htm historico: http://www.mail-archive.com/java-list%40soujava.org.br para sair da lista: envie email para [EMAIL PROTECTED] -
RES: [java-list] Instâncias
Vamos lá... no primeiro exemplo, como vc está usando uma string literal para inicializar as duas variáveis, na verdade o que acontece é uma otimização na hora da compilação, criando uma constante para representar a string literal. Sendo assim, as duas variáveis "apontam" para o mesmo objeto. Já quando vc usa o Integer.toString(100), um outro objeto é criado, por isso a comparação == não funciona. Qualquer dúvida, dá ma lida no www.precisejava.com, que têm uma sessão sobre otimização no uso de strings, entre outros ( ejb, servlets, loops, etc ). Abs, Rafael Vilardo. -Mensagem original-De: Michel [mailto:[EMAIL PROTECTED]]Enviada em: terça-feira, 15 de outubro de 2002 11:36Para: [EMAIL PROTECTED]Assunto: [java-list] Instâncias Olá galera! Para exemplificar minha dúvida, mostrarei dois exemplos: -EXEMPLO 1-- public static void main(String args[]) { String x = "100"; String y = "100"; if(x == y) System.out.println("IGUAL!!!") } EXEMPLO 2-- public static void main(String args[]) { String x = "100"; String y = Integer.toString(100); if(x == y) System.out.println("IGUAL!!!"); } No exemplo 1, aparece na tela "IGUAL!!!", no exemplo 2 não aparece nada! Sei que para comparar duas Strings tenho o mótodo equals(String s), mas para fins de conhecimento, gostaria de saber por quê o 1º exemplo funciona e o 2º não. Obrigado.
[java-list] Instâncias
Olá galera! Para exemplificar minha dúvida, mostrarei dois exemplos: -EXEMPLO 1-- public static void main(String args[]) { String x = "100"; String y = "100"; if(x == y) System.out.println("IGUAL!!!") } EXEMPLO 2-- public static void main(String args[]) { String x = "100"; String y = Integer.toString(100); if(x == y) System.out.println("IGUAL!!!"); } No exemplo 1, aparece na tela "IGUAL!!!", no exemplo 2 não aparece nada! Sei que para comparar duas Strings tenho o mótodo equals(String s), mas para fins de conhecimento, gostaria de saber por quê o 1º exemplo funciona e o 2º não. Obrigado.
Re: [java-list] Instâncias
Michael, Voc est tentando comparar dois valores de tipos primrios distintos. Para que o exemplo 2 seja verdadeiro, como voc mesmo disse, voc teria que utilizar o .equals ou o parseInt. if(Integer.parseInt(x) == Integer.parseInt(y)) System.out.println("IGUAL!!!"); Bem, espero ter ajudado. []'s Dalton ___ www.portaljava.com O seu portal sobre java em portugus! Michel wrote: Ol galera! Para exemplificar minha dvida, mostrarei dois exemplos: -EXEMPLO 1-- public static void main(String args[]) { String x = "100"; String y = "100"; if(x == y) System.out.println("IGUAL!!!") } EXEMPLO 2-- public static void main(String args[]) { String x = "100"; String y = Integer.toString(100); if(x == y) System.out.println("IGUAL!!!"); } No exemplo 1, aparece na tela "IGUAL!!!", no exemplo 2 no aparece nada! Sei que para comparar duas Strings tenho o mtodo equals(String s), mas para fins de conhecimento, gostaria de saber por qu o 1 exemplo funciona e o 2 no. Obrigado. -- LISTA SOUJAVA http://www.soujava.org.br - Sociedade de Usuários Java da Sucesu-SP dúvidas mais comuns: http://www.soujava.org.br/faq.htm regras da lista: http://www.soujava.org.br/regras.htm historico: http://www.mail-archive.com/java-list%40soujava.org.br para sair da lista: envie email para [EMAIL PROTECTED] -
Re: [java-list] Instâncias
Por que no segundo exemplo vc esta usando integer que é numérico!! - Original Message - From: Michel To: [EMAIL PROTECTED] Sent: Tuesday, October 15, 2002 11:36 AM Subject: [java-list] Instâncias Olá galera! Para exemplificar minha dúvida, mostrarei dois exemplos: -EXEMPLO 1-- public static void main(String args[]) { String x = "100"; String y = "100"; if(x == y) System.out.println("IGUAL!!!") } EXEMPLO 2-- public static void main(String args[]) { String x = "100"; String y = Integer.toString(100); if(x == y) System.out.println("IGUAL!!!"); } No exemplo 1, aparece na tela "IGUAL!!!", no exemplo 2 não aparece nada! Sei que para comparar duas Strings tenho o mótodo equals(String s), mas para fins de conhecimento, gostaria de saber por quê o 1º exemplo funciona e o 2º não. Obrigado.
Re: [java-list] Instâncias
Legal a questão. Depurei o código dentro do JBuilder e dei uma olhada nas propriedades dos objetos. No primeiro exemplo, tudo igual, no segundo, as propriedades "Offset" e "Value" estavam diferentes. Em "Value" foram considerados os zero à esquerda em 9 posições, por isso deu diferente. Abaixo, o código do método toString da classe Integer. Neste código é que deu a diferença. /** * Returns a codeString/code object representing the * specified integer. The argument is converted to signed decimal * representation and returned as a string, exactly as if the * argument and radix 10 were given as arguments to the {@link * #toString(int, int)} method. * * @param i an integer to be converted. * @return a string representation of the argument in basenbsp;10. */ public static String toString(int i) {int q, r, charPos ; charPos = 12 ; char buf [] = new char [charPos] ; char sign = 0 ; if (i == Integer.MIN_VALUE) { return "-2147483648"; } if (i 0) { sign = '-' ; i = -i ; } // Generate two digits per iterationwhile ( i = 65536 ) { q = i / 100 ; // really: r = i - (q * 100) ; r = i - ((q 6) + (q 5) + (q 2)) ; i = q ; buf [--charPos] = DigitOnes [r] ; buf [--charPos] = DigitTens [r] ; } // Fall thru to fast mode for smaller numbers// assert(i = 65536, i);for (;;) { q = (i * 52429) (16+3) ; r = i - ((q 3) + (q 1)) ;// r = i-(q*10) ...buf [--charPos] = digits [r] ; i = q ; if (i == 0) break ; }if (sign != 0) {buf [--charPos] = sign ; } **Giovani SalvadorSite pessoal - http://pagina.de/siglas(Siglas de informática)PROCERGS - Cia. de Processamento de Dados do Estado do Rio Grande do Sul - BRASILSetor TSI - Tecnologia para Sistemas de InformaçãoICQ #44904309** - Original Message - From: Michel To: [EMAIL PROTECTED] Sent: Tuesday, October 15, 2002 11:36 AM Subject: [java-list] Instâncias Olá galera! Para exemplificar minha dúvida, mostrarei dois exemplos: -EXEMPLO 1-- public static void main(String args[]) { String x = "100"; String y = "100"; if(x == y) System.out.println("IGUAL!!!") } EXEMPLO 2-- public static void main(String args[]) { String x = "100"; String y = Integer.toString(100); if(x == y) System.out.println("IGUAL!!!"); } No exemplo 1, aparece na tela "IGUAL!!!", no exemplo 2 não aparece nada! Sei que para comparar duas Strings tenho o mótodo equals(String s), mas para fins de conhecimento, gostaria de saber por quê o 1º exemplo funciona e o 2º não. Obrigado.
[java-list] Re:[java-list] Instâncias
Porque no segundo exemplo ele não faz a comparação da String e sim da String com os bytes referentes a String que gerou na instancia criada no metodo acima... Porem desaconselho a comparação entre Stringfs com o operador de comparação, tente sempre usar o equals. __ Encontre sempre uma linha desocupada com o Discador BOL! http://www.bol.com.br/discador Ainda não tem AcessoBOL? Assine já! http://www.bol.com.br/acessobol -- LISTA SOUJAVA http://www.soujava.org.br - Sociedade de Usuários Java da Sucesu-SP dúvidas mais comuns: http://www.soujava.org.br/faq.htm regras da lista: http://www.soujava.org.br/regras.htm historico: http://www.mail-archive.com/java-list%40soujava.org.br para sair da lista: envie email para [EMAIL PROTECTED] -
Re: [java-list] Instâncias
Vc deve sempre se lembrar que strings em Java são instâncias da classe String, logo são objetos como quaisquer outros. x e y, no seu exemplo, são referências para objetos String. Quando vc cria constantes String, a maioria dos compiladores Java compartilha constantes string no mesmo endereço, logo as referências ficam iguais. Nos seu primeiro exemplo, as duas constantes são compartilhadas na mesma posição de memória, pois se tratam da mesma constantes string, logo x e y são iguais. No segundo exemplo, como vc usa Integer.toString(100), o compilador não tenta compartilhar o endereço, e armazena a string em uma posição de memória diferente, logo x e y têm valores diferentes. Por isso que só funciona bem a comparação de strings usando x.equals(y), porque o operador == compara não o conteúdo das strings, mas o valor de suas referências. Em Ter, 2002-10-15 às 11:36, Michel escreveu: Olá galera! Para exemplificar minha dúvida, mostrarei dois exemplos: -EXEMPLO 1-- public static void main(String args[]) { String x = 100; String y = 100; if(x == y) System.out.println(IGUAL!!!) } EXEMPLO 2-- public static void main(String args[]) { String x = 100; String y = Integer.toString(100); if(x == y) System.out.println(IGUAL!!!); } No exemplo 1, aparece na tela IGUAL!!!, no exemplo 2 não aparece nada! Sei que para comparar duas Strings tenho o mótodo equals(String s), mas para fins de conhecimento, gostaria de saber por quê o 1º exemplo funciona e o 2º não. Obrigado. Atenciosamente, -- Itamar Almeida de Carvalho Desenvolvimento de Sistemas [EMAIL PROTECTED] - (+85) 281-2223 Oktiva Telecomunicações e Informática Ltda http://www.oktiva.com.br signature.asc Description: PGP signature
RE: [java-list] Instâncias
Title: Message Michel, Vc, provavelmente, sabe que "String" não é um tipo primitivo e por isso quando vc compara dois tipos não-primitivos com " == " vc está na realidade está comparando as instãncias (referências) e não o seu conteúdo(como vc escreveu: "...tenho o mótodo equals(String s)" ).Por exemplo: String a1 = new String("A"); Stringa2 = new String("A"); a1 == a2 é false agora quando vc cria uma string assim: String a1 = "A"; String a2 = "A"; a1==a2 é true Isso acontece por que, ao cirar uma String assim (String a1 = "A";), a string é armazenada em um buffer de strings para que o seu uso seja mais ágil (particularidade da classe String...) e quando elas são comparadascom "==" o conteúdo é comparado caracter a caracter, e não suas instâncias. espero ter ajudado, Michel wrote: Olá galera! Para exemplificar minha dúvida, mostrarei dois exemplos: -EXEMPLO 1-- public static void main(String args[]) { String x = "100"; String y = "100"; if(x == y) System.out.println("IGUAL!!!") } EXEMPLO 2-- public static void main(String args[]) { String x = "100"; String y = Integer.toString(100); if(x == y) System.out.println("IGUAL!!!"); } No exemplo 1, aparece na tela "IGUAL!!!", no exemplo 2 não aparece nada! Sei que para comparar duas Strings tenho o mótodo equals(String s), mas para fins de conhecimento, gostaria de saber por quê o 1º exemplo funciona e o 2º não. Obrigado.-- LISTA SOUJAVA http://www.soujava.org.br - Sociedade de Usuários Java da Sucesu-SP dúvidas mais comuns: http://www.soujava.org.br/faq.htm regras da lista: http://www.soujava.org.br/regras.htm historico: http://www.mail-archive.com/java-list%40soujava.org.br para sair da lista: envie email para [EMAIL PROTECTED] -
Re: [java-list] Instâncias
No exemplo 1, x e y referenciam o mesmo objeto ('100") dentro do programa. Como é uma constanteqq. linguagem não definirá internamente dois "100", mas somente um "100". Assim a referencia para os dois String é a mesma. No exemplo 2, o resultado de "String x = Integer.toString(100)" é um outro objeto totalmente diferente de "100", apesar do conteúdo ser o mesmo. A saida desse metodo é sempre um NOVO objeto String, assim as referencia são diferentes. Se voce mudar o exemplo 1 para "String x = new String("100)" e "Stringy = new String("100)" a condição não será mais igual, pois se trata de dois objetos DISTINTOS, com conteudos iguais. Roberto Tatemoto Subject: [java-list] Instâncias Olá galera! Para exemplificar minha dúvida, mostrarei dois exemplos: -EXEMPLO 1-- public static void main(String args[]) { String x = "100"; String y = "100"; if(x == y) System.out.println("IGUAL!!!") } EXEMPLO 2-- public static void main(String args[]) { String x = "100"; String y = Integer.toString(100); if(x == y) System.out.println("IGUAL!!!"); } No exemplo 1, aparece na tela "IGUAL!!!", no exemplo 2 não aparece nada! Sei que para comparar duas Strings tenho o mótodo equals(String s), mas para fins de conhecimento, gostaria de saber por quê o 1º exemplo funciona e o 2º não. Obrigado.
Re: [java-list] Instâncias
Só para complementar o que falei, ainda no fim do método toString, existe o retorno de uma nova instância de String. O == compara referências e no caso não seriam as mesmas pois são duas instâncias diferentes. - Original Message - From: Giovani Salvador To: [EMAIL PROTECTED] Sent: Tuesday, October 15, 2002 1:06 PM Subject: Re: [java-list] Instâncias Legal a questão. Depurei o código dentro do JBuilder e dei uma olhada nas propriedades dos objetos. No primeiro exemplo, tudo igual, no segundo, as propriedades "Offset" e "Value" estavam diferentes. Em "Value" foram considerados os zero à esquerda em 9 posições, por isso deu diferente. Abaixo, o código do método toString da classe Integer. Neste código é que deu a diferença. /** * Returns a codeString/code object representing the * specified integer. The argument is converted to signed decimal * representation and returned as a string, exactly as if the * argument and radix 10 were given as arguments to the {@link * #toString(int, int)} method. * * @param i an integer to be converted. * @return a string representation of the argument in basenbsp;10. */ public static String toString(int i) {int q, r, charPos ; charPos = 12 ; char buf [] = new char [charPos] ; char sign = 0 ; if (i == Integer.MIN_VALUE) { return "-2147483648"; } if (i 0) { sign = '-' ; i = -i ; } // Generate two digits per iterationwhile ( i = 65536 ) { q = i / 100 ; // really: r = i - (q * 100) ; r = i - ((q 6) + (q 5) + (q 2)) ; i = q ; buf [--charPos] = DigitOnes [r] ; buf [--charPos] = DigitTens [r] ; } // Fall thru to fast mode for smaller numbers// assert(i = 65536, i);for (;;) { q = (i * 52429) (16+3) ; r = i - ((q 3) + (q 1)) ;// r = i-(q*10) ...buf [--charPos] = digits [r] ; i = q ; if (i == 0) break ; }if (sign != 0) {buf [--charPos] = sign ; } **Giovani SalvadorSite pessoal - http://pagina.de/siglas(Siglas de informática)PROCERGS - Cia. de Processamento de Dados do Estado do Rio Grande do Sul - BRASILSetor TSI - Tecnologia para Sistemas de InformaçãoICQ #44904309** - Original Message - From: Michel To: [EMAIL PROTECTED] Sent: Tuesday, October 15, 2002 11:36 AM Subject: [java-list] Instâncias Olá galera! Para exemplificar minha dúvida, mostrarei dois exemplos: -EXEMPLO 1-- public static void main(String args[]) { String x = "100"; String y = "100"; if(x == y) System.out.println("IGUAL!!!") } EXEMPLO 2-- public static void main(String args[]) { String x = "100"; String y = Integer.toString(100); if(x == y) System.out.println("IGUAL!!!"); } No exemplo 1, aparece na tela "IGUAL!!!", no exemplo 2 não aparece nada! Sei que para comparar duas Strings tenho o mótodo equals(String s), mas para fins de conhecimento, gostaria de saber por quê o 1º exemplo funciona e o 2º não. Obrigado.
RES: [java-list] Instâncias
A diferença é que no primeiro exemplo, a declaração das duas variáveis String (x e y) são uma forma especial de inicialização em Java, porque os valores à direita do operador de atribuição são literais, e não objetos String. Os literais tem todos os atributos e procedimentos da classe String, mas são alocados, em tempo de compilação, numa estrutura chamada "pool de Strings". Ao serem alocados, relaciona-se um valor canônico a cada uma dessas literais, que visa identificar unicamente String's de valores iguais. Esse valor que se relaciona a cada String é obtido através do método "intern()", da classe String. Quando esse método é explicitamente chamado, seja numa variável String do tipo literal ou objeto, caso essa String já se encontre no pool de String's, o valor do pool é obtido. Caso contrário, se a String em questão não estiver no pool, o método intern() coloca ela no pool, e retorna a referência atual do objeto String. Simplificando: para quaisquer objetos s e t, da classe String, s.intern() == t.intern(), se e somente se s.equals(t) retorna true... Nas variáveis String do tipo literal, o método intern() é "implicitamente" chamado, sempre que necessário, em operações de comparação, por exemplo. Valores retornados por métodos, como o toString() da classe Integer, não retorna valores literais, e sim uma referência para o objeto String de retorno do método, que varia de acordo com posição alocada por esse valor na área de heap da memória do programa, definida e estruturada dinamicamente em tempo de execução. Rosfran Lins Borges Analista de Sistemas - NDS [EMAIL PROTECTED] Fóton® Informática e Serviços Fone: (61) 328 5060 R.: 272 -Mensagem original- De: Michel [mailto:[EMAIL PROTECTED]] Enviada em: terça-feira, 15 de outubro de 2002 11:36 Para: [EMAIL PROTECTED] Assunto: [java-list] Instâncias Olá galera! Para exemplificar minha dúvida, mostrarei dois exemplos: -EXEMPLO 1-- public static void main(String args[]) { String x = 100; String y = 100; if(x == y) System.out.println(IGUAL!!!) } EXEMPLO 2-- public static void main(String args[]) { String x = 100; String y = Integer.toString(100); if(x == y) System.out.println(IGUAL!!!); } No exemplo 1, aparece na tela IGUAL!!!, no exemplo 2 não aparece nada! Sei que para comparar duas Strings tenho o mótodo equals(String s), mas para fins de conhecimento, gostaria de saber por quê o 1º exemplo funciona e o 2º não. Obrigado.
Re: [java-list] Instâncias
Caro Luiz Barbosa, estou utilizando apenas para exemplificar, se, antes da comparação, voce mandar escrever na tela os valores de x e de y, serão ambos de "100", mas o 1º ele considera iguais, o 2º não. Já que possuem valores iguais, não acha que ambos deveria retornar o mesmo valor na comparação (x == y)??? - Original Message - From: luizbarbosa To: [EMAIL PROTECTED] Sent: Tuesday, October 15, 2002 12:48 PM Subject: Re: [java-list] Instâncias Por que no segundo exemplo vc esta usando integer que é numérico!! - Original Message - From: Michel To: [EMAIL PROTECTED] Sent: Tuesday, October 15, 2002 11:36 AM Subject: [java-list] Instâncias Olá galera! Para exemplificar minha dúvida, mostrarei dois exemplos: -EXEMPLO 1-- public static void main(String args[]) { String x = "100"; String y = "100"; if(x == y) System.out.println("IGUAL!!!") } EXEMPLO 2-- public static void main(String args[]) { String x = "100"; String y = Integer.toString(100); if(x == y) System.out.println("IGUAL!!!"); } No exemplo 1, aparece na tela "IGUAL!!!", no exemplo 2 não aparece nada! Sei que para comparar duas Strings tenho o mótodo equals(String s), mas para fins de conhecimento, gostaria de saber por quê o 1º exemplo funciona e o 2º não. Obrigado.
[java-list] Instâncias no Microsoft SQL Server e Tabelas Temporárias
Olá pessoal da lista!! Estou criando uma aplicação para rodar em WebSphere com o banco de dados Microsoft SQL Server. Para fazer a conexão estou utilizando o Driver FreeTDS que é um driver free que vc pode baixar no http://www.freetds.org, entretanto ele não suporta conexão com uma instância do SQL Server que se encontre debaixa da instância principal. Exemplo: DOTCOM\CLIENTES Recentemente baixei o driver para SQL Server 2000 no site da Microsoft e também não rola. Além disso estou tendo problemas ao trabalhar com Stored Procedures que executem operações e retornem registros de tabelas temporárias. Alguém já passou por uma situação parecida ou conheça algum driver que possa recomendar. Valleww, galera!! Alex