Dúvida com o método HashCode

Estou tentando remover um item da uma Lista dessa forma:

for (FinOutrosCREAs profissional : listaNaoLocalizados) {
			
			if(profissional.getId().equals(profNaolocalizado.getId())){
				listaNaoLocalizados.remove(profissional.hashCode());		
			}			
		}

A exceção que está ocorrendo diz que eu estou tentando remover um hash q teoricamente não existe na lista.

java.lang.IndexOutOfBoundsException: Index: 6045301, Size: 86
	java.util.ArrayList.RangeCheck(ArrayList.java:546)
	java.util.ArrayList.remove(ArrayList.java:389)
	creacorp.financeiro.anuidade.action.BaixaManualPgtoAnuidadesProfOutrosCREAsAction.addPessoa(BaixaManualPgtoAnuidadesProfOutrosCREAsAction.java:265)
	sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
	sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
	java.lang.reflect.Method.invoke(Method.java:585)
	org.apache.struts.actions.DispatchAction.dispatchMethod(DispatchAction.java:280)
	org.apache.struts.actions.DispatchAction.execute(DispatchAction.java:216)
	org.apache.struts.chain.commands.servlet.ExecuteAction.execute(ExecuteAction.java:53)
	org.apache.struts.chain.commands.AbstractExecuteAction.execute(AbstractExecuteAction.java:64)
	org.apache.struts.chain.commands.ActionCommandBase.execute(ActionCommandBase.java:48)
	org.apache.commons.chain.impl.ChainBase.execute(ChainBase.java:190)
	org.apache.commons.chain.generic.LookupCommand.execute(LookupCommand.java:304)
	org.apache.commons.chain.impl.ChainBase.execute(ChainBase.java:190)
	org.apache.struts.chain.ComposableRequestProcessor.process(ComposableRequestProcessor.java:280)
	org.apache.struts.action.ActionServlet.process(ActionServlet.java:1858)
	org.apache.struts.action.ActionServlet.doGet(ActionServlet.java:446)
	javax.servlet.http.HttpServlet.service(HttpServlet.java:697)
	javax.servlet.http.HttpServlet.service(HttpServlet.java:810)
	creacorp.financeiro.security.PainelControleFilter.doFilter(PainelControleFilter.java:33)
	creacorp.financeiro.security.AutorizacaoFilter.doFilter(AutorizacaoFilter.java:111)
	org.jboss.web.tomcat.filters.ReplyHeaderFilter.doFilter(ReplyHeaderFilter.java:96)


Alguém se dispõe???

E você está. O método hashCode() te retorna um int, portanto você está tentando remover da lista o objeto que está na posição desse hashCode. Uma opção seria mandar remover o objeto:listaNaoLocalizados.remove(profissional);

“IndexOutOfBoundsException”

exemplo que vai gerar essa exceção

List<Pessoa> pessoas = new ArrayList<Pessoa>();
Pessoa mae = new Pessoa("Maria");
Pessoa pai = new Pessoa("Joao");

pessoas.add(mae);
pessoas.add(pai);

System.out.println("Nome: " + pessoas.get[2].getNome();

entende o que ocorre? Estou acessando indice não existente. Essa exceção ocorre quando tentamos acessar um objeto dentro de uma lista, mas a posicao desse objeto que estamos tentando acessar é maior do que o tamanho da lista toda.

E outra, vc terá outra exceção aí…você não pode manipular uma lista(remover objeto) que você está iterando.

Você está passando o resultado do método hashCode() como parâmetro para a remoção.
Está correto isso?

Não só quando o índice é maior, como menor do que 0 também ( ocorre quando vamos brincar de fazer conta com índices ).
( http://java.sun.com/javase/6/docs/api/java/util/List.html#remove(int) )
Até!

Muito obrigado a todos que me ajudaram.

encontrei uma solução “feia”, mas muito bem vinda.

int a = 0;
		
		for (FinOutrosCREAs profissional : listaNaoLocalizados) {
			
			if(profissional.getId().equals(profNaolocalizado.getId())){
				break;
			}	
			
			a++;
		}
	        
                listaNaoLocalizados.remove(a);

acho que você viajou quanto ao uso do hashCode

Olá,

Geralmente em listas, em metodos de busca e remoção, a lista usa o mecanismo de hasCode e equals para determinar a identidade de um certo objeto.

Suponhamos que temos a classe pessoa:


class Pessoa
{
    
    String nome;
    int id;
    
    @Override
    public boolean equals(Object outraPessoa)
    {
        if(outraPessoa instanceof Pessoa)
        {
            //Testa se os nome são iguais
            if(this.nome.equals( ((Pessoa)outraPessoa).nome)){
                return true;
            }
                
        }
        return false;
    }
    
    @Override
    public int hashCode()
    {
        //retorna o id ou usa-se algum algoritmo para estabelecer o hasCode
        return id;
    }
    
}

No metodo equals, verificamos se o objeto recebido é do Tipo Pessoa, assim fazemos a conversão e comparamos seus nomes. Porém, podemos ter em uma lista, duas pessoas com o mesmo nome e isso seria um problema. Para evitar isso, é usado o metodo hashCode que deve retornar sempre o mesmo codigo para o mesmo objeto e ele nunca pode repetir para instancias diferentes.

Bom, é mais ou menos isso. Espero ter ajudado.

abraço

Então se eu implementar o equals comparando pelo nome e retornar o id no hashCode, no momento que eu utilizar o equals, ele vai saber automaticamente que duas instancias com nomes diferentes não são o mesmo objeto?
Ou eu terei que usar sempre o hashCode para fazer a busca?

Acho que isso vai ajudar: http://sergiotaborda.wordpress.com/desenvolvimento-de-software/java/colecoes-em-java/

Veja a parte de equals e hashCode.

PS: evite ressuscitar tópicos.