Solucionado (ver solução)
Solucionado
(ver solução)
3
respostas

HashSet aceitando inclusão de objetos iguais

Olá senhores,

O que deveria ocorrer quando inserimos um objeto "igual" à outro dentro de um HashSet? Uma exceção seria lançada? Pergunto isto porque mesmo após sobrescrever o método hashCode na classe Conta e inserindo duas contas de mesmo número em um HashSet, a adição está ocorrendo normalmente. Poderiam verificar se a implementação abaixo está correta?

Outra coisa que percebi ao realizar o debug no código é que o método sobrescrito equals da classe Conta é chamado a partir da segunda chamada do método add() do objeto HashSet e mesmo retornando true a operação é concluída com sucesso.

O que não estou percebendo aqui?

public abstract class Conta {

    Cliente titular;
    private int numero;
    protected double saldo;
    private double limite;
    private static int contaIncremental = 1;
    private String nome;

    public Conta() {

        this.setNumero(contaIncremental);
        contaIncremental++;
    }

    public Conta(int numero, double limite) {

        this(numero, limite, 0);
    }

    public Conta(int numero, double limite, double saldoInicial) {

        this.setNumero(numero);
        this.limite = limite;
        this.saldo = saldoInicial;
    }

    public void saca(double valor) {

        if (valor > this.saldo + this.limite) {

            System.out.println("Saque invalido");
        } else {

            this.saldo = this.saldo - valor;
        }
    }

    public void deposita(double valor) {

        if (valor <= 0) {

            throw new IllegalArgumentException("Valor depositado não pode ser negativo ou igual a zero");
        }
        this.saldo = this.saldo + valor;
    }

    public double getSaldo() {

        return this.saldo;
    }

    public void atualiza(double taxa) {

        this.saldo += saldo * taxa;
    }

    public boolean equals(Object obj) {

        if (!(obj instanceof Conta)) {

            return false;
        }

        Conta outraConta = (Conta) obj;
        return this.getNumero() == outraConta.getNumero();
    }

    @Override
    public int hashCode() {
        final int prime = 31;
        int result = 1;
        result = prime * result + numero;
        return result;
    }

    public int getNumero() {
        return numero;
    }

    public void setNumero(int numero) {
        this.numero = numero;
    }

    public String getNome() {
        return nome;
    }

    public void setNome(String nome) {
        this.nome = nome;
    }
}

public class ContaPoupanca extends Conta implements Comparable<Conta> {

    public void atualiza(double taxa) {
        this.saldo += this.saldo * taxa * 3;
    }

    @Override
    public int compareTo(Conta o) {

        if (this.getNumero() > o.getNumero())

            return 1;
        else if (this.getNumero() < o.getNumero())

            return -1;

        return 0;
    }
}

public class TestaCollections {

    public static void main(String[] args) {

        Conta nc = new ContaPoupanca();
        nc.setNumero(1234);
        nc.setNome("Bruno Miranda");
        nc.deposita(100);

        Conta np = new ContaPoupanca();
        np.setNumero(1234);
        np.setNome("Tamires Lima");
        np.deposita(100);

        Set<Conta> sc = new HashSet<>();
        sc.add(nc);
        sc.add(np);    
    }
}
3 respostas

Bom dia bruno!

A interface Set não permite valores duplicados, ele vai sobrescrever o item com o mesmo Hash na sua coleção.

Bons estudos!

Obrigado Phelipe,

Estava esperando que algum erro fosse ocorrer durante a adição.

solução!

Oi Bruno, tudo bem?

Você não receberá uma Exception. Ao tentar adicionar um segundo elemento que seja igual a outro que esteja no conjunto, o método add simplesmente irá ignorar a adição não modificando a lista e retornará false.

Para mais detalhes, você pode consultar na documentação do método: https://docs.oracle.com/javase/6/docs/api/java/util/HashSet.html#add(E)

E se quiser, vale fazer o teste:

// TestaCollections.java

Set<Conta> sc = new HashSet<>();
boolean primeira = sc.add(nc);
boolean segunda = sc.add(np);

System.out.println(primeira);
System.out.println(segunda);

No console você verá true e false.

Abraços!