codice:
for(int i=0;i<listanew.size();i++){
				for(int y=0;y<listaold.size();y++){
					if(listanew.get(i).Specifica.equals(listaold.get(y).Specifica)&&listanew.get(i).Ordine.equals(listaold.get(y).Ordine)&&listanew.get(i).Item.equals(listaold.get(y).Item)){
						if(!listanew.get(i).Data_sped.equals(listaold.get(y).Data_sped)||!listanew.get(i).Quantita.equals(listaold.get(y).Quantita)){
							ApoSpeMod ogg = new ApoSpeMod();
							ogg.Specifica=listanew.get(i).Specifica;
							ogg.Ordine=listanew.get(i).Ordine;
							ogg.Item=listanew.get(i).Item;
							ogg.Data_old=listaold.get(y).Data_sped;
							ogg.Data_new=listanew.get(i).Data_sped;
							ogg.Quantita_old=listaold.get(y).Quantita;
							ogg.Quantita_new=listanew.get(i).Quantita;
							ogg.Nota=listanew.get(i).Descrizione;
							ogg.Nota2=listanew.get(i).Gtec;
							ogg.Plant=listanew.get(i).Plant;
							listamod.add(ogg);
						}
						
						listanew.remove(i);
					
					}
				}
			}
Secondo me l'errore è nella rimozione dalla lista. Non puoi rimuovere oggetti dalla lista mentre la cicli, il istanew.size() cambia in continuazione e si incasina.
Se usavi i generics ti dava immediatamente errore.
Prova a creare una lista di appoggio dove ci metti gli oggetti da rimuovere e poi dopo che hai fatto le operazioni.
Cicli la lista da rimuovere e togli l'oggetto dalla listanew, il riferimento all'oggetto è lo stesso quindi puoi usare direttamente .remove(oggetto).