Think Java: How to Think Like a Computer Scientist

ThinkJava
HowtoThinkLikeaComputerScientist