There are hundreds of Java books.
Most range from bad to terrible.
Almost all are full of style crime,
and few give any help with designing more complex, longer-lived programs.
Here are the best ones.
Java in Practice: Design Styles and Idioms for Effective Java,
Nigel Warren and Philip Bishop, Addison-Wesley, 1999.
[not for beginners, but the gold standard for practicing programmers. except for sometimes weak names, no style crime at all.]
Refactoring: Improving the Design of Existing Code,
Martin Fowler, Addison-Wesley, 1999.
[another excellent book on practical java. very funny too.]
Essential Java Style: Patterns for Implementation,
Jeff Langr, prentice-Hall, 2000.
[a third excellent book on java pragmatics.]
Understanding Object-Oriented Programming with Java,
Timothy Budd, Addison-Wesley, 1998.
[an excellent book for beginners marred by several coding style crimes]
Thinking in Java,
Bruce Eckel, Prentice Hall, 1998.
[an excellent book for programmers coming to java from c++. probably the overall best book on java. unsuitable for beginners.]
The Java Programming Language,
Ken Arnold and James Gosling, second edition, Addison-Wesley, 1998.
[the standard in the field, coauthored by java's inventor, james gosling. far too cryptic for beginners though.]
Cutting-Edge Java Game Programming,
Neil Bartlett, Steve Simkin, and Chris Stranc, Coriolis Group Books, 1996.
[not only a good book on java, but a good book on games too. the book is old however, so it only covers java 1.0]
Patterns in Java: Volume 1: A Catalog of Reusable Design Patterns Illustrated with UML,
Mark Grand, Wiley, 1998.
[required reading for every serious Java programmer. flawed, but still useful. don't on any circumstances buy volume 2.]
Concurrent Programming in Java: Design Principles and Patterns,
Doug Lea, Addison-Wesley, 1997.
[the definitive book on threads in java. also great for advanced patterns. new edition coming out soon.]
Java in a Nutshell: A Desktop Quick Reference,
David Flanagan, second edition, O'Reilly 1997.
[the best overall reference for the Java APIs. not recommended for its coding style.]