To who is learning Java I also suggest to apply to the two courses at Coursera called
They are the product of the work of Kevin Wayne and Robert Sedgewick, and are a good example of how to implement algorithms in Object Oriented language (and in a scientific context), and examples are in Java. I listen to some of the classes and they are nicely implemented, even if programming always require a specific application, i.e. writing yourself the code, it is a nice exercise even just to listen to. Particularly interesting I found the use of generics and data structures, if you do want just to understand when it can be interesting to use them.
On Sedgewick's site, additional material can also be found.