Melhorando pergunta: Troca de variáveis

8 respostas
S

Bom dia Galera!!!
Na sexta feira deixei uma pergunta no fórum que ficou mal feita. A questão é a seguinte:
Tenho duas variáveis: A com o conteúdo ?x? e a variável B com o conteúdo 1 (isso uma com um numero inteiro e outra com um caracter)eu gostaria de trocar o conteúdo das variáveis sem ter que declarar uma terceira. Pra isso eu poderia armazenar o conteúdo de uma das variáveis na memória (swap). Com que comando eu poderia fazer isso?. Pode ser em qqr linguagem.

8 Respostas

C

Kra… pelo menos q eu tenha visto isso n e possivel, pois vc tera de armazenar o conteudo d uma em algum lugar pra conseguir fazer a troca de variaveis!

C

Opa,
Cara… queria saber o porquê que vc não quer usar outra variável?? É algum desafio???

S

“clv”:
Opa,
Cara… queria saber o porquê que vc não quer usar outra variável?? É algum desafio???

é um desafio sim…

J

Usando a mesma idéia do mmpaulo naquele outro tópico:

class Troca
{
  public static void main(String args[])
  {
    String a = "omega";
    String b = "iota";
    System.out.println("a: " + a + " e b: " + b);
    a = a.concat(b);
    System.out.println("a: " + a + " e b: " + b);

    b = a.substring(0,a.length()-b.length());

    a = a.substring(b.length(),a.length());

    System.out.println("a: " + a + " e b: " + b);
    
  }

}
Mas você vai acabar usando mais memória do que se usasse uma terceira variável.
J

Mas agora quem ficou com uma dúvida fui eu :stuck_out_tongue:

Nesse post:
http://www.portaljava.com/home/modules.php?name=Forums&file=viewtopic&p=103292#103292
o jairelton fala que String é imutável.

Fui olhar a StringBuffer que ele citou e diz:
“A string buffer implements a mutable sequence of characters. A string buffer is like a String, but can be modified.”

E como pôde funcionar o que eu fiz no código acima se a String não pode ser modificada? Ou na verdade eu usei três novas posições de memória?

S

Em se tratando de objetos, as variáveis armazenam a posição de memória onde eles estão.

String s1 = "a"; s1 = "b";
A String “a” não foi modificada. s1 passou a referenciar (apontar para) a String “b”.
A variável muda, o objeto não.

Uma outra coisa que não costuma ficar clara:

public static final ArrayList list = new ArrayList(5);

O que é final é a variável list, não o ArrayList em si. Ele pode mudar, mas list não pode referenciar outro objeto.

J

Então quando eu faço:
a = a.concat(b);
Estou na verdade com 3 objetos String: “omega”, “iota” e “omegaiota”. Só que nesse momento não tem uma variável apontando para o “omega” já que o a passou a apontar para o “omegaiota”, certo?

2º. E quando o b passa a apontar para “omega” e o a passa a apontar para “iota” foram criados outros 2 objetos ou aqueles “omega” e “iota” existentes foram reaproveitados? Ou seja, no final do aplicativo eu estou com 3 objetos ocupando memória ou com 5?

thanks

S
1- Quase. Você tem esses 3 objetos, e ninguém referencia o "omega", ok. Só que ao fazer isso:
System.out.println("a: " + a + " e b: " + b);
Você criou mais 2 objetos: "a: " e " e b: ". São 5 Strings.

2- Se você não usar o construtor (new String() ), vão ser reaproveitados, sim.

Faz esse teste:
String s1 = "oi";
String s2 = "oi";
System.out.println(s1 == s2);

String s3 = "ae";
String s4 = new String("ae");
System.out.println(s3 == s4);
Criado 22 de agosto de 2005
Ultima resposta 23 de ago. de 2005
Respostas 8
Participantes 5