Alguem pode testar esse código, e me dizer porque que isso acontece ? Eu tava fazendo uns experimentos doidos aqui, e quando eu usei um set nesse caso, ele não adiciona mais do que uma conta, mesmo eu falando pra ele que eu quero que ele compare uma conta com a outra apenas pelo limite. Mesmo assim eu entendi, mas o que eu achei estranho é que , quando eu mando ele comprara pelo limite , ele só add a conta c1 e a outra não , se eu colocar para comparar pelo saldo ele add as duas contas , porem na hora de imprimir, ele inverte a ordem das contas. Se alguem puder me explicar agradeço. Com outras implementações como ArrayList e LinkedList , funciona, normal.
package Threds_Exercicios4;
import java.util.Set;
public class Conta implements Runnable {
private double saldo;
private int limite;
private Set<Conta> lista;
public Conta(double saldo, Set<Conta> lista, int limite) {
this.saldo = saldo;
this.lista = lista;
}
public void run() {
synchronized (lista) {
for (int i = 0; i < 300; i++) {
lista.add(this);
}
}
}
@Override
public int hashCode() {
final int prime = 31;
int result = 1;
result = prime * result + limite;
return result;
}
@Override
public boolean equals(Object obj) {
if (this == obj)
return true;
if (obj == null)
return false;
if (getClass() != obj.getClass())
return false;
Conta other = (Conta) obj;
if (limite != other.limite)
return false;
return true;
}
public double getSaldo() {
return this.saldo;
}
@Override
public String toString() {
return this.getSaldo() + "";
}
}
package Threds_Exercicios4;
import java.util.HashSet;
import java.util.Set;
public class TestaConta {
public static void main(String[] args) throws InterruptedException {
long inicio = System.currentTimeMillis();
Set<Conta> lista = new HashSet<Conta>();
Conta c1 = new Conta(333, lista, 500);
Conta c2 = new Conta(1000, lista, 500);
Thread t1 = new Thread(c1);
Thread t2 = new Thread(c2);
t1.start();
t2.start();
t1.join();
t2.join();
for (Conta conta : lista) {
System.out.println(conta);
}
long finall = System.currentTimeMillis();
double total = finall - inicio;
System.out.println(total);
}
}