Problemas muito báiscos com Hashes

Oi. To tentando fazer um cadastro de empresas, mas parece-me que não está adicionando. Já fiz diversas coisas, mas o problema persiste… ele não adiciona as empresas no HashSet.

import java.util.Set;
import java.util.HashSet;
import java.util.Scanner;

public class CadastroDeEmpresas
{

    private Set<Empresa> empresas = new HashSet<Empresa>();

    public CadastroDeEmpresas()
    {
    
    }
    
    /**
     * Metodo de adicao de emrpesas
     * @param novaEmpresa A nova Empresa.
     */
    public void adiciona(Empresa novaEmpresa)
    {
        System.out.println("Inserindo uma nova empresa.");
        empresas.add(novaEmpresa);
    }
    
    /**
     * Metoo que vai listar todas as empresas
     */
    public void listaEmpresas()
    {
        System.out.println("Listando as " + empresas.size() + " empresas.\n");
        for (int i = 0; i < empresas.size(); i++) 
            System.out.println("> " + empresas.toString());
            
        System.out.println("\n\n");
    }
    
    
    public int numeroDeEmpresas()
    {
        return empresas.size();
    }
    
    /**
     * Metodo main
     */
    public static void main(String[] args)
    {
        String opcao;
        do {
            CadastroDeEmpresas cadastro = new CadastroDeEmpresas();
            Scanner s = new Scanner(System.in);
        
            int i = cadastro.numeroDeEmpresas();
            System.out.println("O que deseja fazer? ( " + i + " )");
            System.out.print(">> ");
            
            opcao = s.next();
            
            if (opcao.equals("adicionar")) {
                System.out.println("Digite o nome da sua empresa: ");
                String nome = s.next();
                
                Empresa e = new Empresa(nome);
                
                cadastro.adiciona(e);
            }
            else if (opcao.equals("listar")) {
                System.out.println("Listando todas as empresas.\n");
                cadastro.listaEmpresas();
            }
            else
                System.out.println("Nao entendo o que voce quer dizer.\n");
                
        } while (!opcao.equals("sair"));
        
        
        
    }
}

Eu sei que ninguém gosta de ficar lendo código, por isso vou postar a parte que eu acredito que esteja dando erros:

Aqui acredito que esteja correto.

public void adiciona(Empresa novaEmpresa)
    {
        System.out.println("Inserindo uma nova empresa.");
        empresas.add(novaEmpresa);
    }

Acredito que o problema esteja aqui:

if (opcao.equals("adicionar")) {
                System.out.println("Digite o nome da sua empresa: ");
                String nome = s.next();
                
                Empresa e = new Empresa(nome);
                
                cadastro.adiciona(e);
            }

Acontece que ele entra em tudo… ele diz que tá inserindo, mas na hora de listar, lista tudo em branco. E a quantidade que é mostrada na hora do usuário digitar o que quer fazer nunca muda, sempre fica 0, que é o tamanho do HashSet.

Não sou muito acostumado em programar com a main, porque uso BlueJ, por isso estou tentando. Foi mal.

Abraço.

Para se trabalhar com conjuntos , precisa ser implementado no bean HashCode e o método equals. Dá uma olhada nestes detalhes.

Usar o Set e depois o HashSet é uma boa prática de programação?