Ir para conteúdo

POWERED BY:

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

gilsonmv

Qual a diferença entre String Literal "aaa" e new String("

Recommended Posts

Olá,

 

Isso deve ser bem básico, mas vamos lá, eu estava estudando sobre threads e vi o seguinte código (Preste atenção na linha em vermelho):

 

public class TestThead1 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 TestThead1(), "A").start();

new Thread(new TestThead1(), "B").start();

}

}

 

Pois bem este código Java imprime "AABB" ou "BBAA", a explicação é que "hello" é uma string literal e portanto é compartilhada pelas duas threads e portanto a sincronização é feita com objeto "hello".

 

Mais adiante vi o seguinte código (Preste atenção na linha em vermelho):

 

public class TestThead1 implements Runnable {

public void run() {

String str = new String("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 TestThead1(), "A").start();

new Thread(new TestThead1(), "B").start();

}

}

 

Veja que a diferença é apenas de "hello" para new String("hello") e o resultado desta thread é "BABA" ou "ABAB". A explicação é de que esta string é local do método e não há sincronização, pois, são objetos "hello" diferentes.

 

Uma vez ouvi falar que a JVM fazia referência para strings iguais (e todo aquele papo de ser imutável), então se eu atribuísse uma string "aaa" (ex.: String a = "aaa") para uma variável e a mesma representação literal para outra variável "aaa" (ex.: String aa = "aaa"), na JVM haveria apenas um objeto string e inclusive a comparação das duas variáveis retornaria TRUE (ex.: a == aa retornaria true).

 

Alguém sabe me explicar como a JVM trata Strings?

 

Abraços,

 

Gilson.

Compartilhar este post


Link para o post
Compartilhar em outros sites

"aaa" chama o construtor uma só vez. new String("aaa") chama o construtor duas vezes.

 

No final o resultado é o mesmo, só que o primeiro caso, além de ser mais simples, é mais eficiente.

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.