Think Java : How to Think Like a Computer Scientist