Fortunately this is one of the easiest questions to answer thanks to the really good quality online material provided by
Sun Oracle. The official java tutorial is simply superb, I wouldn't spend a penny on books before reading the official online documentation. After reading that doc you will be able to decide from the table of contents of a book whether it is a good book for you or not, and most importantly - you become a very good java programmer if your read the online docs carefully and you try things in simple example programs in parallel.
You can find the online doc here:
http://docs.oracle.com/javase/tutorial/[
^]
It has been split to 2 main paragraphs: The first paragraph (Trails Covering the Basics) is about the java language elements and the very basic runtime libraries (like collections: arrays, maps, ...). The following sections (Creating Graphical User Interfaces, and Specialized Trails and Lessons) are about java libraries.
While you are learning the basics (the java language) you don't really have tools to solve really interesting problems, you can deal only with simpler ones. You will find such simple problems in the doc, as it will demonstrate language features with example code. Always try the example code yourself, compile it and run it. I would first do this without using an advanced ide (like eclipse/netbeans) only on the commandline as this helps you to understand whats goin on in the background even if you are speeding up your work with nice ides.
The first paragraph (Trails Covering the Basics) is very important, and its is relatively short compared to the libraries part. Learn everything from the libraries paragraph (Specialized Trails and Lessons) is wasteful as it is very large part of the whole tutorial and you will see no point of those libraries (like jaxb, security, and javabeans) because they are not very useful for a hobby programmer/beginner as they are intended to simplify the development of enterprise applications. First you should encounter some enterprise problems to understand why are those "overcomplicated" libraries are "fun" to use. Libraries you should definitely master even as a beginner/hobby programmer:
- swing(gui)
- networking/socket/rmi(all of these is networking related)
With the java language and gui programming and some network programming knowledge (for example socket or rmi) you should be able to put together a chat server/client by yourself without cheating from other server progs. Don't cheat try to find the solutions yourself (the tricky part will be handling multiple connectsions and/or threads on the server). There are millions of good solutions to the server side problems. Later you can make an 1v1 multiplayer amoeba game.
- later 2D graphics and sound if you are interested in more serious games (make on online 2v2 multiplayer amoeba game)
- jdbc is also a useful topic if you want to save data into databases, this one can be very useful if you later want to do some basic web programming and you decide to use a lightweight database handling mechanism (jdbc) instead of a more complicated one (jpa). If you decide to learn jdbc then put together a gui(swing) calendar application that can be used to save events/notes to specific data/time and optionally it should be able to alert a few hours before the specific event.
- generics and reflection: these are more advanced topics that rather belong to the java language but it worth taking a look at these, you may find it interesting and they may ask this on interviews
There are a lot more technologies and libraries (for example for web/enterprise software programming) than what is mentioned in the tutorial but even learning the basics carefully takes weeks and the same is true for the libraries part.
If you think you became a master then take a look at the java virtual machine specification document to understand the java language/memory management a bit more.
Good luck, have fun!