Boa tarde a todos,
Gostaria de pedir a ajuda de vocês para uma escolha aqui:
O meu cenário é o seguinte: Tenho uma aplicação rodando sobre java 1.4, sendo que esta aplicação possui uma coleção que eu quero usar como uma fila sem repetições, nessa coleção eu insiro itens no final, antes de inserir o item eu chamo o método contains para verificar se o item a ser inserido ja existe na fila (é uma “fifa” como eu costumo chamar, do inglês first in first out, que é uma fila mesmo). Enquanto em uma Thread eu estou obtendo o primeiro item processando e em seguida removendo, em outras várias threads eu insiro itens no final da fila.
Os itens desta fila são VOs, nos quais eu gerei direto no eclipse o equals e o hash code usando apenas um int que representa um identificador único na base de dados, creio que é um equals rápido e funcional ja que esse identificador não se repete.
Isso se encaixaria perfeitamente no que temos o LinkedList como uma Queue, porém Queue não existe no java 1.4, então não tenho os métodos pool e peek de Queue em LinkedList, não sei se deveria usa-lo, então na incerteza estou usando ArrayList mesmo.
Não estou usando um Set por que para obter os itens teria que itera-los, assim ao adicionar um item em uma thread, a próxima iteração geraria uma cocurrentModificationException, não estou usando um map por que para obter os itens teria que iterar as chaves tendo assim o mesmo problema, java 4 não tem queue, só me sobrou list (correto né?).
Estou usando um ArrayList como fila, obtendo e removendo o primeiro item da lista, inserindo sempre no final, porém ao inserir, eu verifico se o item em questão ja existe, como disse, pelo contains da lista, que usa o equals que citei (comparando por um int apenas), e é ai que está o meu problema, essa verificação está lenta em produção quando a lista fica muito grande (em horários de pico de transações). Essa verificação é necessária pro que List permite repetições e eu não quero, um Set não aceitaria mas pelo que eu sei não da para eu usar um set como citei.
Alguém tem alguma sugestão para manter isso funcionando e de forma mais performatica? alguma sugestão?