Java - como listar e atualizar valores do HashMap

Map é uma interface, enquanto HashMap é uma das implementações de Map. É dessa forma pq há outras implementações além da HashMap, como a TreeMap, por exemplo, que já ordena de forma natural com base nas chaves na medida em que os itens são adicionados.

O mais correto é declarar usando Map, recebendo uma instância de HashMap:

Map<String, Funcionario> myMap = new HashMap<>();

Peguei seu código e coloquei algumas observações:

Classe Funcionario

// evite usar nomes de pacotes com letras maiúsculas. Seria melhor se fosse: crud, ou melhor: br.com.sistemaa.crud
package CRUD;

// não use caracteres especiais em nomes de classes. Esse acento não deveria ter aqui
public class Funcionário {

  private String nome;

  // evite criar variaveis com todas as letras em maiusculo
  // o correto é que toda variável comece com letra minúscula
  // apenas "cpf" seria o ideal
  private String CPF;

  private String telefone;
  private int idade;

  public String getNome() {
    return nome;
  }

  // o parâmetro não precisa ter esse "f" no final
  public void setNome(String nomeF) {
    nome = nomeF; // aqui vc poderia apenas fazer assim: this.nome = nome
  }

  public String getCPF() {
    return CPF;
  }

  public void setCPF(String CPFf) {
    CPF = CPFf;
  }

  public String getTelefone() {
    return telefone;
  }

  public void setTelefone(String telefoneF) {
    telefone = telefoneF;
  }


  public int getIdade() {
    return idade;
  }

  public void setIdade(int idadeF) {
    idade = idadeF;
  }

  void setIdade(String temp) {
    throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.
  }
}

Classe Principal

// evite usar nomes de pacotes com letras maiúsculas. Seria melhor se fosse: crud, ou melhor: br.com.sistemaa.crud
package CRUD;

import java.util.HashMap;
import java.util.Scanner;

public class Principal {
  
  public static void main (String [] args) {
    // Vc não precisa dessa variável, ele parece não está servindo para muita coisa
    Funcionário func1 = new Funcionário();

    // Essa variável poderia se chamar apenas "funcionarios"
    // pois como está no plural, já indica que são vários
    // Melhor declarar assim: Map<String, Funcionario> funcionarios = new HashMap<>();
    HashMap<String, Funcionário> colecaoFuncionários = new HashMap<>();
    
    // Esse while que vc fez, funciona, porém um "do ... while" funcionaria bem também
    while (true) {
      System.out.println(" -------- Selecione uma opção -------- ");
      System.out.println(" 1 -- Cadastrar novo funcionário ");
      System.out.println(" 2 -- Remover um funcionário ");
      System.out.println(" 3 -- Atualizar dados de um funcionário ");
      System.out.println(" 4 -- Lista de funcionarios ");
      System.out.println(" 5 -- Sair \n ");
      
      // Melhor deixar o Scanner fora do while, pq vc só precisa criar ele uma vez
      // desse jeito ele será recriado a cada iteração do while
      Scanner input = new Scanner(System.in);
      String j = input.nextLine();
      int alternativa = Integer.parseInt(j);
      
      switch (alternativa) {
        case 1:
          // Em vez de declarar o funcionario no início do método
          // faz mais sentido declarar aqui, pois é onde vc irá criar o funcionário
          // Ex.: Funcionario funcionarioCadastro = new Funcionario();

          System.out.println(" -- OPÇÃO 1 -- ");    

          System.out.println(" Informe o nome do funcionário ");
          func1.setNome(input.nextLine());

          System.out.println(" Informe o CPF do funcionário ");
          func1.setCPF(input.nextLine());


          System.out.println(" Informe o telefone do funcionário ");
          func1.setTelefone(input.nextLine());

          System.out.println(" Informe a idade do funcionário ");
          func1.setIdade(input.nextInt());

          colecaoFuncionários.put(func1.getCPF(), func1);
          System.out.println(" Funcionário cadastrado com sucesso. ");
          break;
        
        case 2:
          System.out.println(" -- OPÇÃO 3 -- "); 
          System.out.println(" Informe o CPF do funcionário a ser removido");

          // Tente usar variavel com nomes que explicam melhor o que está acontecendo
          // Ex.: String cpfRemover = input.nextLine();
          String remove = input.nextLine();
          colecaoFuncionários.remove(remove);
          System.out.println(" Funcionário removido do banco de dados. ");

          break;
        
        case 3: 
          System.out.println(" Informe o CPF do funcionário ");

          // Aqui tb poderia ter um nome de variavel mais indicativo
          // Ex.: Funcionario funcionarioAlteracao = funcionarios.get(input.nextLine());
          Funcionário  func = colecaoFuncionários.get(input.nextLine());
          
          if (func == null) {
            System.out.println("Funcionário não encontrado");
            continue;
          }
          
          System.out.println(" Informe o novo nome do funcionário (enter para manter "+colecaoFuncionários.get(func.getCPF())+ ")" );
          String temp = input.nextLine();
          
          if (!temp.trim().isEmpty()) {
            func.setNome(temp);
          }
          
          // Aqui vc tinha usado o CPF do funcionario da variavel "func1", e gravou o funcionario da variável "func"
          colecaoFuncionários.put(func1.getCPF(), func);
          System.out.println("Dados do funcionário atualizados com sucesso. ");
          break;
        
        case 4:
          System.out.println("Tem-se " + colecaoFuncionários.size() + " funcionários(s) cadastrado(s) no sistema\n");
          break;
        
        // Como a opção 5 é de sair, vc nem precisaria declarar
        // Pois, ao entrar com a opção 5, ele iria cair automaticamente na opção default
        case 5:
          System.out.println(" -- OPÇÃO 5 -- ");     
        
        default:
          System.out.println(" O sistema foi fechado \n ");
          return;
      }
    }
  }
}

Dê uma lida nessas anotações e tente alterar seu código. Boa sorte!

Pode-se dizer que todo o código está quase pronto, o que falta agora é só estética, e o que eu quero é: Conseguir printar na tela dados(número de telefone, nome, idade…) de um funcionário especifico.
Como que faço isso ? Eu quero digitar o CPF desse funcionário, e na minha tela irá aparecer os seus dados. Dá para realizar isso com Map ou HashMap ?

package sistemaCrud;

class Funcionario {

String nome;
int idade;
String cpf;
String telefone;

public String getNome() {
    return nome;
}

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

public int getIdade() {
    return idade;
}

public void setIdade(int idade) {
    this.idade = idade;
}

public String getCpf() {
    return cpf;
}

public void setCpf(String cpf) {
    this.cpf = cpf;
}

public String getTelefone() {
    return telefone;
}

public void setTelefone(String telefone) {
    this.telefone = telefone;
}

package sistemaCrud;

import java.util.HashMap;
import java.util.Map;
import java.util.Scanner;

class Principal {
public static void main (String [] args){

Map<String, Funcionario> colecaoFuncionarios = new HashMap<>();
Scanner input = new Scanner(System.in);
Funcionario f1 = new Funcionario();

while(true){

System.out.println(" — Selecione uma opção — “);
System.out.println(” 1 – Cadastrar um funcionário “);
System.out.println(” 2 – Remover um funcionário “);
System.out.println(” 3 – Atualizar dados de um funcionário “);
System.out.println(” 4 – Listar quantidade de funcionários cadastrados “);
System.out.println(” 5 – Sair");

String j = input.nextLine();
int opcao = Integer.parseInt(j);

switch (opcao){

case 1:

System.out.println(" – Opção 1 --");

System.out.println(" Infome o nome do funcionário “);
f1.setNome(input.nextLine());
System.out.println(” Informe o CPF do funcionário “);
f1.setCpf(input.nextLine());
System.out.println(” Informe a idade do funcionário “);
f1.setIdade(input.nextInt());
System.out.println(” Informe o telefone do funcionário ");
f1.setTelefone(input.nextLine());

colecaoFuncionarios.put(f1.getCpf(), f1);
System.out.println(" Funcionário cadastrado com sucesso");
break;

case 2:

System.out.println(" – Opção 2 --");
System.out.println(" Informe o CPF do funcionário a ser removido ");

Funcionario cpfRemover = colecaoFuncionarios.get(input.nextLine());

if (cpfRemover == null){

System.out.println(" Funcionário não encontrado ");
continue;

}
colecaoFuncionarios.remove(cpfRemover);

System.out.println(" Funcionário removido do Banco de Dados ! ");

break;

case 3:

System.out.println(" – Opção 3 – “);
System.out.println(” Informe o CPF do funcionário");

Funcionario funcionarioAlteracao = colecaoFuncionarios.get(input.nextLine());

if (funcionarioAlteracao == null){

System.out.println(" Funcionário não encontrado ");
continue;

}

System.out.println(" Informe o novo nome do funcionário (enter para manter "+f1.nome+ “)” );
String temp = input.nextLine();

if (!temp.trim().isEmpty()) {
funcionarioAlteracao.setNome(temp);
}

colecaoFuncionarios.put(funcionarioAlteracao.getCpf(), f1);
System.out.println("Dados do funcionário atualizados com sucesso. ");
break;

case 4:

System.out.println(" – Opção 4 --");
System.out.println(“Tem-se " + colecaoFuncionarios.size() + " funcionário (s) cadastrado(s) no sistema\n”);
break;

case 5:

return;

}}}}

Implemente o método toString na classe Funcionario. E faça o método retornar os dados do funcionário formatado (concatenado)

Em uma classe, pode-se encontrar atributos. Esses atributos são as características que a classe pode apresentar. Sendo assim, eles podem ser alterados de qualquer outra classe, utilizando-se objetos.
Isso é verdade ou falso ?