Imprimir endereço de String

Olá galera, blz. :smiley:

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??? :?

Pq vc quer isso?

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

getClass().getName() + '@' + Integer.toHexString(hashCode())

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

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.

é 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…

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!

Verdade dudaskank!!:idea:

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!! :slight_smile:

Foi mal davidbuzatto :oops: 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.
:lol:

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

Té mais! Precisando tamos ai hehehehe!

[quote=marques_eder]Foi mal davidbuzatto :oops: 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.
:lol: [/quote]

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 :slight_smile:

flw