Scusa ma...
codice:
public static void main(String[] args) {
		//...Insersci, bla bla bla, anche se non capisco il ciclo for.
                //Situazione attuale:hai inserito 1 oggetto nella mappa e il reference i1 punta 
		//ancora a quell'oggetto

		// visualizzazione con input da tastiera: mi stampa quello che scrivo
		BufferedReader stdIn = new BufferedReader(new InputStreamReader(System.in));
		for (i=0; i<3; i++) {
			try {
                                //setti il messaggio dell'oggetto della mappa alla stringa 
                                //appena letta in quanto i1 punta ancora all'oggetto.
				i1.setMessage((String) stdIn.readLine());
			} catch (IOException e) {
				e.printStackTrace();
			}
			i1.setState(i);

			if (mappa.containsKey(i1))   
                        //E certo che lo contiene c'e' solo quello
                        //Il messaggio naturalmente e' quello che hai scritto da tastiera
                        //perche' sopra l'hai sovrascritto. Quindi la stampa e' corretta
                        {                                         
				i2 = (classmappa) mappa.get(i1);
				System.out.println(i2.getMessage());
			}
                }
       }
Secondo me il codice fa quello che hai scritto di fare, il problema e' che quello che hai scritto non e' cio' che vuoi fare. Prova a risistemarlo.