No es lo mismo.
Una cosa es liberar memoria que no se usa (free en C, recolector de basura en java).
Otra cosa es obligar a un stream a escribir los bytes que puede tener en memoria y no ha escrito. Por ejemplo, cuando escribes en disco duro un fichero, es más costoso hacer muchas escrituras pequeñas que una grande, por eso las clases java o C que escriben en disco, muchas veces son listas y los datos que tu escribes los van guardando en memoria. Cuando tienen bastantes datos, hacen una única escritura en disco. Esas clases, tanto java como C, tienen un método flush() que obliga a escribir en disco todo lo que tengan en memoria, independientemente de que sea mucho o poco. En general no es bueno llamar a flush() porque pierdes la eficiencia que te da la clase al hacer una única escritura grande, pero a veces es necesario hacer esa llamada a flush(). Mira por ejemplo la clase java BufferedWriter
http://docs.oracle.com/javase/7/docs...redWriter.html Veras que tiene un método flush()
Puesto que hablabas de Scanner y de stdin, simplemente indicar que no tiene ningún sentido hacer un flush de algo donde se lee, sólo lo tiene sentido en escritura. Hay algunos compiladoes de C/C++ que interpretan un flush de stdin como descartar el resto de datos que haya disponibles, pero no es un comportamiento estándar y puede que unos compiladores lo hagan así y otros no. Es mejro hacer una lectura real y tirar lo que no quieras que hacer un flush stdin. En el caso de java no existe flush de un stream de lectura (Scanner, ...)
Se bueno.