Acho que você não entendeu bem o funcionamento do List (ArrayList/ LinkedList/ etc).
O List basicamente armazena uma coleção de endereços de memória objetos (endereços da JVM), não o objeto em si. Quando você mantém fora da lista uma referência (variável) para um objeto que está na lista, e altera o objeto através dessa referência, o objeto dentro da lista também é alterado porque é o mesmo objeto, não um objeto diferente. Mesmo que você faça get(), o objeto permanece dentro da lista.
Um exemplo com código:
import java.util.*;
import java.lang.*;
import java.io.*;
class Ideone
{
public void testaTudo(){
List<ClasseTeste> lista = new ArrayList<ClasseTeste>();
ClasseTeste teste1 = new ClasseTeste("Joao", 100);
teste1.imprimir();
lista.add(teste1); // adiciona teste1 na lista
// note que a variável teste1 ainda está apontando para um objeto do tipo Classeteste
// o valor não some automaticamente
teste1.imprimir(); // imprime a mesma coisa que da primeira vez
ClasseTeste teste2 = new ClasseTeste("Pedro", 200);
teste2.imprimir(); // imprime Pedro
lista.add(teste2); // adiciona teste2 na lista
// daí podemos fazer:
lista.get(0).imprimir(); // imprime o Joao, que foi o primeiro adicionado à lista
lista.get(1).imprimir(); // imprime o Pedro
ClasseTeste teste3 = lista.get(0); // coloca em teste3 o primeiro elemento da lista : Joao
// note que o elemento não é removido da lista
teste3.setValor(300);
teste3.imprimir(); // imprime o Joao, mas com valor 300
teste1.imprimir(); // também imprime Joao, e com valor 300
lista.get(0).imprimir(); // tambem imprime Joao, e com valor 300
// Nós não mudamos a referência da variável teste1, então
// tanto teste1 quanto teste3 e lista.get(0) retornam o mesmo objeto.
// inclusive, podemos fazer:
lista.get(0).setValor(500);
lista.get(0).imprimir(); // Joao, com valor 500
teste1.imprimir(); // Joao, com valor 500
}
public static void main (String[] args) throws java.lang.Exception
{
new Ideone().testaTudo();
}
class ClasseTeste{
String nome;
int valor;
public ClasseTeste(String nome, int valor){
this.nome = nome;
this.valor = valor;
}
// permite alterar o valor
public void setValor(int novovalor){
this.valor = novovalor;
}
// exibe nome e valor
public void imprimir(){
System.out.println("Nome : " + this.nome + " Valor : " + this.valor);
}
}
}
Veja em http://ideone.com/23yO7u . E recomendo a leitura : https://www.caelum.com.br/apostila-java-orientacao-objetos/collections-framework/
O contains basicamente faz uma busca pelo objeto inteiro (não por um atributo, com nome). Baseado no meu código, seria algo assim:
lista.contains(teste1); // retorna true, o objeto referenciado por teste1 está na lista
ClasseTeste teste4 = new ClasseTeste("Mateus", 700);
lista.contains(teste4); // retorna false, o objeto referenciado por teste4 não está na lista
Se você quer fazer a busca por nome dentro do List, precisaria percorrê-la (for, while, …) e comparar o nome de cada elemento com o nome que você está procurando. Ou pode usar um HashMap e usar o nome como chave, o que torna a busca bem mais fácil, mas é preciso ver o que você deseja obter ante de simplesmente trocar de biblioteca.
Abraço.