Pq não consigo simplesmente alterar o map em dois métodos diferentes?

import java.util.*;

public class ListaDeUsuarios {
	
	
	
	Map<String,Usuario> map;
	public ListaDeUsuarios(){
	map=new HashMap<String,Usuario>();
}
	
	public boolean adiciona(String l, Usuario us) {
		if(!map.containsKey(l)) {
			map.put(l, us);
			if(map.containsKey(l)) {
				System.out.println("Usuário Registrado" + map);

		}return true;
			}else {
			System.out.println("Esse usuário já existe!");
			return false;
		}
	}
	public boolean consultaLista(String L, String S) {
		if(map.containsKey(L)) {
			
		//	Usuario A=map.get(L);
			if(S.contentEquals( map.get(L).getSenha())) {
				
				return true;
			}else { 
				
				return false;}
			
		
		}else {System.out.print(map +""+ map.get(L));
			return false;
		}
		
	}
	

}

pq quando adiciono um objeto no map, quando vou consultar no outro método, ela diz que ta vazia?

obs: o código ta todo bagunçado pq eu revirei ele todo e enchi de println pra saber onde tava o problema.

Você está instanciando o Map no construtor da classe ListaDeUsuarios. Logo, toda vez que tu cria um objeto do tipo ListaDeUsuarios, ele cria uma nova instância de HashMap (classe que implementa a interface Map), portanto sem dados. Como tu está chamando esses métodos?

Obs.: prefira nomes no singular para classe. Em vez de ListaDeUsuarios, poderia ser ListagemDeUsuario.

na vdd eu coloquei no construtor na esperança de resolver, originalmente ele estava em uma linha só, sem construtor.

eu chamo através de um método de outra classe login, mas já fiz vários testes na própria classe, veja que a cada passo tô checando com está o map de novo, com um println.

Mas funciona, veja:

1 - Classe Usuario

public class Usuario {
	private long id;
	private String nomeUsuario;
	private String senha;
	
	public void setId(long id){
		this.id = id;
	}
	
	public long getId(){
		return id;
	}
	
	public void setNomeUsuario(String nomeUsuario){
		this.nomeUsuario = nomeUsuario;
	}
	
	public String getNomeUsuario(){
		return nomeUsuario;
	}
	
	public void setSenha(String senha){
		this.senha = senha;
	}
	
	public String getSenha(){
		return senha;
	}
}

2 - Classe Listagem

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

public class Listagem {
	private Map<String, Usuario> mapeamento = new HashMap<>();
	
	public boolean adicionarUsuario(String chave, Usuario usuario){
		System.out.println("Chave: " + chave);
		if(!mapeamento.containsKey(chave)){
			mapeamento.put(chave, usuario);
			System.out.println("-> " + mapeamento.get(chave).getNomeUsuario());
			if(mapeamento.containsKey(chave)){
				System.out.println("Usuário registrado: " + mapeamento.get(chave).getNomeUsuario());
				return true;
			}
		}else
			System.out.println("Usuário já está registrado!");
		
		return false;
	}
	
	public boolean consultarMapa(String chave, Usuario usuario){
		if(mapeamento.containsKey(chave)){
			if(usuario.getSenha().equals(mapeamento.get(chave).getSenha()))
				return true;
			else
				return false;
		}else
			System.out.println("Chave " + chave +  " não cadastrada!");
		return false;
	}
}

3 - Classe Mapping (Teste)

public class Mapping {
	public static void main(String[] args){
		boolean status;
		Listagem listagem = new Listagem();
		Usuario usuario1 = new Usuario();
		usuario1.setId(2253L);
		usuario1.setNomeUsuario("Fulano");
		usuario1.setSenha("Ful@n0");
		
		Usuario usuario2 = new Usuario();
		usuario2.setId(1860L);
		usuario2.setNomeUsuario("Beltrano");
		usuario2.setSenha("B3ltr4n0");
		
		Usuario usuario3 = new Usuario();
		usuario3.setId(497L);
		usuario3.setNomeUsuario("Sicrano");
		usuario3.setSenha("$1cr@n0");
		
		status = listagem.adicionarUsuario("user1", usuario1);
		if(status)
			System.out.println("Sim! [inserção]");
		else
			System.out.println("Não! [inserção]");
		status = listagem.consultarMapa("user01", usuario1);
		if(status)
			System.out.println("Sim![chave: user01]");
		else
			System.out.println("Não! [chave: user01]");
		
		status = listagem.consultarMapa("user1", usuario1);
		if(status)
			System.out.println("Sim! [chave: user1]");
		else
			System.out.println("Não! [chave: user1]");
		
	}
}

Rodando…

image

ué? pq o meu n roda?

Então, poste como chama os métodos…

main

import java.util.*;

public class App {

public static void main(String[] args) {
	ListaDeUsuarios lis= new ListaDeUsuarios();
	Scanner ler=new Scanner(System.in);
	Login l= new Login();
	Cadastrar c= new Cadastrar();
	System.out.println("Escolha um login");
	 String L=ler.next();
	System.out.println("Escolha uma senha");
	 String S=ler.next();

	c.cadastro(L, S);
while(!L.equalsIgnoreCase("cancelar")) {	
	System.out.print("Login: ");	 
	 L=ler.next();
	System.out.print("Senha: ");
	 S=ler.next();
	l.entrar(L, S);
}	
}

}

cadastra

   import java.util.*;
public class App {

	public static void main(String[] args) {
		ListaDeUsuarios lis= new ListaDeUsuarios();
		Scanner ler=new Scanner(System.in);
		Login l= new Login();
		Cadastrar c= new Cadastrar();
		System.out.println("Escolha um login");
		 String L=ler.next();
		System.out.println("Escolha uma senha");
		 String S=ler.next();
	
		c.cadastro(L, S);
	while(!L.equalsIgnoreCase("cancelar")) {	
		System.out.print("Login: ");	 
		 L=ler.next();
		System.out.print("Senha: ");
		 S=ler.next();
		l.entrar(L, S);
	}	

	}

}

login

public class Login {

	public void entrar (String L, String S) {
		ListaDeUsuarios lis= new ListaDeUsuarios();
	//	Usuario us=new Usuario("Alysson","1234");
		

		if(lis.consultaLista(L,S)){
			
			System.out.print("Login com sucesso "+lis.consultaLista(L,S));
			
		}else {System.out.println("errado "+lis.consultaLista(L,S));}
			
		;
		
	}

}

Lista

  import java.util.*;

    public class ListaDeUsuarios {
    	
        Map<String,Usuario> map=new HashMap<String,Usuario>();
    	
    	public boolean adiciona(String l, Usuario us) {
    		if(!map.containsKey(l)) {
    			map.put(l, us);
    			if(map.containsKey(l)) {
    				System.out.println("Usuário Registrado" + map);

    		}return true;
    			}else {
    			System.out.println("Esse usuário já existe!");
    			return false;
    		}
    	}
    	public boolean consultaLista(String L, String S) {
    		if(map.containsKey(L)) {
    			
    		//	Usuario A=map.get(L);
    			if(S.contentEquals( map.get(L).getSenha())) {
    				
    				return true;
    			}else { 
    				
    				return false;}
    			
    		
    		}else {System.out.print(map +""+ map.get(L));
    			return false;
    		}
    		
    	}
    	

    }

usuario

class Usuario {
	private String Login;
	private String Senha;
	private String Pacote;
	public Usuario(String Login, String Senha) {
		this.Login=Login;
		this.Senha=Senha;
	}
	
	protected String getLogin() {
		return this.Login;
	}
	protected void setLogin(String l) {
		this.Login=l;
	}
	protected String getSenha() {
		return this.Senha;
	}
	protected void setSenha(String s) {
		this.Senha=s;
	}
//
	
	private String exibirPacote() {
		
		System.out.println("COnta verificada");
	
		return Pacote;
	}
	

}

Você não está invocando o método adiciona, não encontrei nenhuma chamada no seu código.

no cadastrar
ele chama o adiciona

import java.util.*;
    public class Cadastrar {

    	ListaDeUsuarios UserList=new ListaDeUsuarios();
    	
    	Scanner ler=new Scanner(System.in);
    	boolean cadastro(String L, String S) { 
    		
    	if(UserList.adiciona(L, (new Usuario(L,S)))) {	
    	
    		return true;
    	}else {
    		return false;}
    	}
    	
    }

qual Java vc usa?

Você tem vários objetos do tipo ListaDeUsuarios:

1 - No main: lis;
2 - Na classe Cadastrar;
3 - No método entrar da classe Login: lis.

Cada novo objeto do tipo ListaDeUsuarios cria um novo mapa, já que:

Java version: 1.8.0_251.

Chamadas com um mesmo objeto:

image

Se eu adicionar um dos usuários com um outro objeto, suponhamos, listagem2:

image

mas no caso não estou fazendo referência nenhuma ao Map em questão, e sim a classe ListaDeUsuarios, da pra notar isso com o println(map); que tem no caso de não achar o objeto no Map,

`public boolean consultaLista(String L, String S) {
    		if(map.containsKey(L)) {
    			
    		//	Usuario A=map.get(L);
    			if(S.contentEquals( map.get(L).getSenha())) {
    				
    				return true;
    			}else { 
    				
    				return false;}
    			
    		
    		}else {System.out.print(map +""+ map.get(L));
    			return false;
    		}
    		`

através do lis, eu consigo acesso a classe ListaDeUsuarios, que por sua vez da acesso ao método consultaLista() , que me notifica se o conteúdo está presente no map, me mostrando o map, que está vazio como se fosse outro map, mesmo fazendo refenrência a um Map instânciado na classe. Eu cheguei cogitar que o metodo adiciona não está adicionando, por isso coloquei um println() toda vez que é registrado um novo objeto, mesmo adicionando.
Eu tbm pedi pra ele checar se o a chave está na lista, ele checa e está, mas se eu checar em outro método, é como se nada tivesse sido alterado.

Mas cabe a classe ListaDeUsuarios criar uma instância de Map.

Exemplo: listaDeUsuario1 -> cria uma instância de de Map, por exemplo map1. se tu colocar algum dado, ficará em map1.

listaDeUsuario2 -> cria a instância map2. Se adicionar algum dado, ficará em map2.
listaDeUsuario3 -> ao fazer a consulta, será no objeto map3 que está vazio.

Você pode tornar essa variável que é de instância (uma para cada objeto) se tornar uma variável de classe (uma para qualquer objeto) tornando-a estática:

static Map<String,Usuario> map=new HashMap<String,Usuario>();

Para mais detalhes, sugiro que veja esse post: Qual o uso de uma variável estática ou final em java?

valeu, era isso mesmo

já tinha outros projetos que eu havia tentado criar e alterar listas e dava esse mesmo problema, nunca suspeitei

Veja, mesmo eu usando dois objetos, como no exemplo anterior, mas agora o map como variável de instância:

image

Para você confirmar:

public class Mapping {
	public static void main(String[] args){
		boolean status;
		String[] chaves;
		Listagem listagem = new Listagem(); //Objeto 1
		Listagem listagem2 = new Listagem(); //Objeto 2
		Usuario usuario1 = new Usuario();
		usuario1.setId(2253L);
		usuario1.setNomeUsuario("Fulano");
		usuario1.setSenha("Ful@n0");
		
		Usuario usuario2 = new Usuario();
		usuario2.setId(1860L);
		usuario2.setNomeUsuario("Beltrano");
		usuario2.setSenha("B3ltr4n0");
		
		Usuario usuario3 = new Usuario();
		usuario3.setId(480L);
		usuario3.setNomeUsuario("Sicrano");
		usuario3.setSenha("$1cr@n0");
		
		chaves = new String[2];
		chaves[0] = "user1";
		chaves[1] = "user1860";
		
		listagem2.adicionarUsuario("user1860", usuario2); //objeto 2 sendo usado
		status = listagem.adicionarUsuario("user1", usuario1); //objeto 1 sendo usado
		if(status)
			System.out.println("Sim! [inserção]");
		else
			System.out.println("Não! [inserção]");
		status = listagem.consultarMapa("user01", usuario1); //objeto 1 sendo usado
		if(status)
			System.out.println("Sim![chave: user01]");
		else
			System.out.println("Não! [chave: user01]");
		
		status = listagem.consultarMapa("user1", usuario1); //objeto 1 sendo usado
		if(status)
			System.out.println("Sim! [chave: user1]");
		else
			System.out.println("Não! [chave: user1]");
		
		
		listagem.mostrarUsuarios(chaves);
	}
}

Mas…

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

public class Listagem {
	private static Map<String, Usuario> mapeamento = new HashMap<>();
	
	public boolean adicionarUsuario(String chave, Usuario usuario){
		System.out.println("Chave: " + chave);
		if(!mapeamento.containsKey(chave)){
			mapeamento.put(chave, usuario);
			System.out.println("-> " + mapeamento.get(chave).getNomeUsuario());
			if(mapeamento.containsKey(chave)){
				System.out.println("Usuário registrado: " + mapeamento.get(chave).getNomeUsuario());
				return true;
			}
		}else
			System.out.println("Usuário já está registrado!");
		
		return false;
	}
	
	public boolean consultarMapa(String chave, Usuario usuario){
		if(mapeamento.containsKey(chave)){
			if(usuario.getSenha().equals(mapeamento.get(chave).getSenha()))
				return true;
			else
				return false;
		}else
			System.out.println("Chave " + chave +  " não cadastrada!");
		return false;
	}
	
	public void mostrarUsuarios(String[] chaves){
		for(int i = 0; i < mapeamento.size(); i++){
			System.out.println("\nID: " + mapeamento.get(chaves[i]).getId() 
				+ " Nome de usuario: " + mapeamento.get(chaves[i]).getNomeUsuario());
		}
	}
}

Leu o post? É bem esclarecedor… O melhor mesmo é usar o padrão Singleton como ele indicou lá.

sim, inclusive eu não sabia que era possivel ter duas classes em um .java, mesmo como condição que apenas uma seja pública

Classes aninhadas (nested classes) … sim pode. Sugiro que veja isso: Java Tutorials: Nested Classes.

vou ver sim, mt obrigado, resolvido esse problema, agr posso passar pro próximo desafio. “Vem ai, Java.io…”.