Imprimir endereço de String  XML
Índice dos Fóruns » Java Avançado
Autor Mensagem
marques_eder
Thread.start()
[Avatar]

Membro desde: 21/05/2005 11:29:27
Mensagens: 29
Localização: Rio Preto/SP
Offline

Olá galera, blz.

Eu estou com um desafio pra vcs. Eu quero imprimir o endereço de memória de um objeto String. Será que tem jeito de fazer isso?

Se fosse outra classe, eu poderia sobrepor o toString() e fazer uma chamada super pra pegar o toString da classe Object que imprime o nome da classe e o hexa da memória. No entanto, a classe String é final, logo não posso estendê-la pra fazer a sobreposição.!!

E ai, existe um jeito de fazer isso???

------------------------------------------------------
Nunca percas a humildade de eterno aprendiz.

Sun Certified Java Programmer SCJP 1.5
Bacharel em Física - USP, São Paulo
Curioso & Apaixonado por Java

davidbuzatto
Moderador
[Avatar]

Membro desde: 07/08/2004 23:47:57
Mensagens: 4013
Localização: Vargem Grande do Sul - SP
Offline

Pq vc quer isso?

Seja educado. Agradeça quem te ajudou. Não custa nada.
Dúvidas de Java? Utilize o fórum! Não respondo via MP.

"Any fool can write code that a computer can understand. Good programmers write code that humans can understand." (Fowler)
"A vida é um escândalo, e no final dá sempre errado. O que humaniza o homem é o fracasso."

http://davidbuzatto.com.br | GitHub | uHunt | CV Lattes | Last.fm
[WWW]
dudaskank
GUJ Ranger
[Avatar]
Membro desde: 12/09/2003 14:59:26
Mensagens: 850
Localização: Suzano, SP, Brasil
Offline

hmm, na verdade o toString() da classe Object é isso aqui olha:



Ou seja, nada de endereço de memória, e sim o seu hashCode...

Porém, acho que teria um meio de se imprimir o endereço de memória sim... mas usando JNI. Você passa o objeto pra rotina em C, e ele pega e retorna o endereço, que tal?

flw

Eduardo Oliveira

Toque a balada do amor inabalável, eterna love song de nós dois...

Página
[WWW]
marques_eder
Thread.start()
[Avatar]

Membro desde: 21/05/2005 11:29:27
Mensagens: 29
Localização: Rio Preto/SP
Offline

Eu estou estudando pra certificação e uma das coisas que pega é que strings literais são compartilhadas . Eu quero fazer testes do tipo são tomé (ver pra crer).
Isso significa que, por exemplo:
class A {
String literalString = "ze";
String stringRef = new String("Mane");
}
class Test {
public static void main (String[] args) {
A a1 = new A();
A a2 = new A();
System.out.println("endereco a1.literalString" + pegaEndString(a1.literalString));
System.out.println("endereco a2.literalString" + pegaEndString(a2.literalString));
System.out.println("endereco a1.stringRef" + pegaEndString(a1.stringRef));
System.out.println("endereco a2.stringRef" + pegaEndString(a2.stringRef));
}
}

Se eu tivesse esse método "pegaEndString" que me dá o endereço, stringRef seriam diferentes, agora, EM TESE, literalString seria o mesmo endereço pros dois objetos a1 e a2.
Isso porque os strings literais, Java joga na memória principal e os compartilha com todos. Dizem que é uma otimização da linguagem.
Mas eu estou inseguro, gostaria de checar mesmo isso.

------------------------------------------------------
Nunca percas a humildade de eterno aprendiz.

Sun Certified Java Programmer SCJP 1.5
Bacharel em Física - USP, São Paulo
Curioso & Apaixonado por Java

davidbuzatto
Moderador
[Avatar]

Membro desde: 07/08/2004 23:47:57
Mensagens: 4013
Localização: Vargem Grande do Sul - SP
Offline

é verdade... num tem nada de endereço de memória... o máximo q vc conseue é o ódigo de hash.

como o dudaskank falou, talvez consiga usando o jni, mas ainda num entendi para q vc quer isso...

Seja educado. Agradeça quem te ajudou. Não custa nada.
Dúvidas de Java? Utilize o fórum! Não respondo via MP.

"Any fool can write code that a computer can understand. Good programmers write code that humans can understand." (Fowler)
"A vida é um escândalo, e no final dá sempre errado. O que humaniza o homem é o fracasso."

http://davidbuzatto.com.br | GitHub | uHunt | CV Lattes | Last.fm
[WWW]
davidbuzatto
Moderador
[Avatar]

Membro desde: 07/08/2004 23:47:57
Mensagens: 4013
Localização: Vargem Grande do Sul - SP
Offline

Mas eu estou inseguro, gostaria de checar mesmo isso.


Pq ta inseguro? Com medo q estejam mentindo para vc Hehehehehehe?

Num precisa pegar endereço de uma String para verificar se duas Strings são o mesmo objeto (ou seja, estão no mesmo bloco de memória... ou seja ainda, são a mesma coisa hehehe)

é só usar o operador ==.

Vc deve ter pulado esse detalhe nos seus estudos para a certificação... Para objetos o operador == verifica se duas referências apontam para a mesma região da memória.

Falow!

Seja educado. Agradeça quem te ajudou. Não custa nada.
Dúvidas de Java? Utilize o fórum! Não respondo via MP.

"Any fool can write code that a computer can understand. Good programmers write code that humans can understand." (Fowler)
"A vida é um escândalo, e no final dá sempre errado. O que humaniza o homem é o fracasso."

http://davidbuzatto.com.br | GitHub | uHunt | CV Lattes | Last.fm
[WWW]
marques_eder
Thread.start()
[Avatar]

Membro desde: 21/05/2005 11:29:27
Mensagens: 29
Localização: Rio Preto/SP
Offline

Verdade dudaskank!!

Num dá pra imprimir mas posso resolver meu problema comparando as referencias com "==".
A origem desse meu incômodo é essa aqui oH:

class Test implements Runnable{
public void run(){
String str = "hello";
synchronized(str){
try
{
System.out.print(Thread.currentThread().getName());
Thread.sleep(500);
System.out.print(Thread.currentThread().getName());
}
catch(InterruptedException e){}
}
}

public static void main(String[] args){
new Thread(new Test(), "A").start();
new Thread(new Test(), "B").start();
}
}

Selecione uma alternativa:

A) Imprime "ABAB" ou "BABA"
B) Imprime "AABB" ou "BBAA"
C) Resultado não pode ser previsto
D) Erro de compilação

resposta B.
Mesmo sendo duas instancias de Test diferentes como alvo nas Threads, mesmo str sendo local, ainda assim a sincronização funciona pq a referencia do objeto str é compartilhada com os dois, dai aquele que obtiver o lock não permite ao outro acessar o bloco, já que sleep não libera lock.
Obrigado!!

------------------------------------------------------
Nunca percas a humildade de eterno aprendiz.

Sun Certified Java Programmer SCJP 1.5
Bacharel em Física - USP, São Paulo
Curioso & Apaixonado por Java

marques_eder
Thread.start()
[Avatar]

Membro desde: 21/05/2005 11:29:27
Mensagens: 29
Localização: Rio Preto/SP
Offline

Foi mal davidbuzatto Errei o colega. Eu agradeci o dudaskank.

Mas agradeço tambem ao dudaskank; só que sua ideia dudaskank me dá o mesmo hashcode dos atributos pra ambos os objetos a1 e a2.

------------------------------------------------------
Nunca percas a humildade de eterno aprendiz.

Sun Certified Java Programmer SCJP 1.5
Bacharel em Física - USP, São Paulo
Curioso & Apaixonado por Java

davidbuzatto
Moderador
[Avatar]

Membro desde: 07/08/2004 23:47:57
Mensagens: 4013
Localização: Vargem Grande do Sul - SP
Offline

Hehehehe sussu!
Da umas estrelinhas para mim que fica tudo certo

Té mais! Precisando tamos ai hehehehe!

Seja educado. Agradeça quem te ajudou. Não custa nada.
Dúvidas de Java? Utilize o fórum! Não respondo via MP.

"Any fool can write code that a computer can understand. Good programmers write code that humans can understand." (Fowler)
"A vida é um escândalo, e no final dá sempre errado. O que humaniza o homem é o fracasso."

http://davidbuzatto.com.br | GitHub | uHunt | CV Lattes | Last.fm
[WWW]
dudaskank
GUJ Ranger
[Avatar]
Membro desde: 12/09/2003 14:59:26
Mensagens: 850
Localização: Suzano, SP, Brasil
Offline

marques_eder wrote:Foi mal davidbuzatto Errei o colega. Eu agradeci o dudaskank.

Mas agradeço tambem ao dudaskank; só que sua ideia dudaskank me dá o mesmo hashcode dos atributos pra ambos os objetos a1 e a2.


Sim, o hashcode é o mesmo para strings com conteúdos iguais.

Mas eu não sabia dessa de usar a mesma região da memória não, achei interessante

flw

Eduardo Oliveira

Toque a balada do amor inabalável, eterna love song de nós dois...

Página
[WWW]
 
Índice dos Fóruns » Java Avançado
Ir para:   
Powered by JForum 2.1.8 © JForum Team