package br.com.caelum.fj11.modelo;
import javax.management.RuntimeErrorException;
import br.com.caelum.fj11.excecao.ValorInvalidoException;
//public abstract class Conta {
public abstract class Conta implements  Comparable<Conta> {// este formato significa que Conta pode ser classificada
//  private double saldo;
    protected double saldo;
    private int numero;
    private String nome;
    public double getSaldo() {
        return this.saldo;
    }
    public void setSaldo(double saldo) {
        this.saldo = saldo;
    }
    public String toString() {    
        return "esse objeto é uma conta com saldo R$" + this.saldo;
    }   
    public int getNumero() {
        return this.numero;
    }
    public int setNumero(int numero) {
        return this.numero;
    }
    public String getNome() {
        return this.nome;
    }
    public String setNome(String nome) {
        return this.nome;
    }
    /**
     * realiza um saque na conta dado o valor passado
     * @param valor_saque valor a ser sacado
     * @return
     * @throws Exception Excption caso saldo seja insuficiente
     */
    public boolean saca(double valor_saque) throws Exception {
        if (this.saldo < valor_saque) {
            //return false;
            throw new SaldoInsuficienteException(saldo);
        }
        else {
            this.saldo = this.saldo - valor_saque;
            return true;
        }
    }
// public void deposita(double valor_dep) {//use este formato quando a classe filha de RuntimeException
     public void deposita(double valor_dep) throws ValorInvalidoException  {//use este formato quando a classe filha de Exception       
//     if (valor_dep > 0) {// neste formato utiliza a exeption do java  
//      this.saldo += valor_dep;
//     }
//     else  {
//         throw new IllegalArgumentException("Você tentou depositar" + " um valor negativo");
//     }
       if (valor_dep > 0) {// neste formato utiliza a exeption pelo programador
          this.saldo += valor_dep;
         }
         else  {
             throw new ValorInvalidoException(valor_dep);
         }       
    }      
     /**
         * atualiza nome e numero de conta
         * 
         */
        public void idConta(int numero, String nome) {
            this.numero = numero;
            this.nome   = nome;
        }
        @Override
    public int hashCode() {
        final int prime = 31;
        int result = 1;
        result = prime * result + ((nome == null) ? 0 : nome.hashCode());
        result = prime * result + numero;
        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 (nome == null) {
                if (other.nome != null)
                    return false;
            } else if (!nome.equals(other.nome))
                return false;
            if (numero != other.numero)
                return false;
            return true;
        }
        public int compareTo(Conta outra) {
            if(this.saldo < outra.saldo) return -1;
            if(this.saldo > outra.saldo) return 1;
            return 0;
        }
   //public void atualiza(double taxa) {                                                                                                   
   //     this.saldo += (this.saldo * taxa);                                                                                                       
   // };       
    abstract public void atualiza(double taxa);
} 
----
package br.com.caelum.fj11.modelo;
public class ContaCorrente extends Conta implements Tributavel {
    public  ContaCorrente(int numero, String nome) {
        // TODO Auto-generated constructor stub
        return;
    }
    public void atualiza(double taxa) {
             this.saldo += this.saldo * taxa * 2;
      }
    @Override
    public double calculaTributos() {
        return this.getSaldo() * 0.01;
    }
}
----
package Testes;
import java.util.ArrayList;
import java.util.Collections;
import java.util.HashMap;
import java.util.HashSet;
import java.util.LinkedList;
import java.util.List;
import java.util.Map;
import java.util.Set;
import br.com.caelum.fj11.excecao.ValorInvalidoException;
import br.com.caelum.fj11.modelo.Conta;
import br.com.caelum.fj11.modelo.ContaCorrente;
public class TestaColecoes1 {
    public static void main(String[] args) {
        // utilizando a interface List com LinkedList
        //a interface list permite duplicidade de dado
        List<String> nomes = new LinkedList<String>(); 
        nomes.add("Mauricio");
        nomes.add("Guilherme");
        nomes.add("Guilherme");
        System.out.println(nomes.get(1));
        System.out.println(nomes.get(2));
        System.out.println(nomes.size());
        // Utilizando o metodo Set
        // este metodo não permite duplicidade de dados
        //evita duplicidade
        Set<String> nomes1 = new HashSet<String>(); 
        nomes1.add("Mauricio");
        nomes1.add("Guilherme");
        nomes1.add("Guilherme");
        System.out.println(nomes1.size());
        //utilizando o método set
        Set<Conta>    contas = new HashSet<Conta>();
        ContaCorrente c1 = new ContaCorrente(1, "Mauricio");
        try {
            c1.deposita(2000);
        } 
        catch (ValorInvalidoException e) {            
            System.out.println(e.getMessage()); //utilizando mensagem ca classe ValorInvalidoException
        }
        ContaCorrente c2 = new ContaCorrente(2, "Guilherme");
        try {
            c2.deposita(1000);
        } 
        catch (ValorInvalidoException e) {            
            System.out.println(e.getMessage()); //utilizando mensagem ca classe ValorInvalidoException
        }
        contas.add(c1);
        contas.add(c1);
        contas.add(c2);
        System.out.println("Quantidade de contas " + contas.size());
        // não entendi porque esta listado 1 onde devertia listar 2
        //utilizando classe Mapa
        Map<String, Conta>    contas1 = new HashMap<String, Conta>();
        ContaCorrente c3 = new ContaCorrente(1, "Mauricio");
        try {
            c1.deposita(2000);
        } 
        catch (ValorInvalidoException e) {            
            System.out.println(e.getMessage()); //utilizando mensagem ca classe ValorInvalidoException
        }
        ContaCorrente c4 = new ContaCorrente(2, "Guilherme");
        try {
            c2.deposita(1000);
        } 
        catch (ValorInvalidoException e) {            
            System.out.println(e.getMessage()); //utilizando mensagem ca classe ValorInvalidoException
        }
        contas1.put("diretor", c1);
        contas1.put("gerente", c2);
        System.out.println("Diretor " + contas1.get("diretor").getSaldo());
        System.out.println("Gerente " + contas1.get("gerente").getSaldo());
        System.out.println("Quantidade de contas " + contas.size());
    }
}
Não consegui entender, o que fiz de errado, na utilização do método "Set contas = new HashSet();"
Na metodo hashCode, na classe Contas, utilizei como base nome e numero e mesmo enviando informações diferente sempre retona 1 como quantidade de contas
Nomes Guilherme Guilherme 3 2
Contas Quantidade de contas 1 Diretor 4000.0 Gerente 2000.0 Quantidade de contas 1