| The Developer's Notebook Series | p. ix |
| Preface | p. xiii |
| What's New? | p. 1 |
| Working with Arrays | p. 1 |
| Using Queues | p. 5 |
| Ordering Queues Using Comparators | p. 7 |
| Overriding Return Types | p. 9 |
| Taking Advantage of Better Unicode | p. 11 |
| Adding StringBuilder to the Mix | p. 12 |
| Generics | p. 15 |
| Using Type-Safe Lists | p. 15 |
| Using Type-Safe Maps | p. 18 |
| Iterating Over Parameterized Types | p. 19 |
| Accepting Parameterized Types as Arguments | p. 21 |
| Returning Parameterized Types | p. 22 |
| Using Parameterized Types as Type Parameters | p. 23 |
| Checking for Lint | p. 24 |
| Generics and Type Conversions | p. 25 |
| Using Type Wildcards | p. 29 |
| Writing Generic Types | p. 30 |
| Restricting Type Parameters | p. 32 |
| Enumerated Types | p. 35 |
| Creating an Enum | p. 35 |
| Declaring Enums Inline | p. 40 |
| Iterating Over Enums | p. 41 |
| Switching on Enums | p. 42 |
| Maps of Enums | p. 46 |
| Sets of Enums | p. 48 |
| Adding Methods to an Enum | p. 51 |
| Implementing Interfaces with Enums | p. 54 |
| Value-Specific Class Bodies | p. 55 |
| Manually Defining an Enum | p. 57 |
| Extending an Enum | p. 58 |
| Autoboxing and Unboxing | p. 60 |
| Converting Primitives to Wrapper Types | p. 60 |
| Converting Wrapper Types to Primitives | p. 62 |
| Incrementing and Decrementing Wrapper Types | p. 63 |
| Boolean Versus boolean | p. 64 |
| Conditionals and Unboxing | p. 65 |
| Control Statements and Unboxing | p. 66 |
| Method Overload Resolution | p. 67 |
| Varargs | p. 70 |
| Creating a Variable-Length Argument List | p. 71 |
| Iterating Over Variable-Length Argument Lists | p. 74 |
| Allowing Zero-Length Argument Lists | p. 76 |
| Specify Object Arguments Over Primitives | p. 78 |
| Avoiding Automatic Array Conversion | p. 79 |
| Annotations | p. 82 |
| Using Standard Annotation Types | p. 82 |
| Annotating an Overriding Method | p. 85 |
| Annotating a Deprecated Method | p. 87 |
| Suppressing Warnings | p. 88 |
| Creating Custom Annotation Types | p. 90 |
| Annotating Annotations | p. 93 |
| Defining an Annotation Type's Target | p. 94 |
| Setting the Retention of an Annotation Type | p. 95 |
| Documenting Annotation Types | p. 96 |
| Setting Up Inheritance in Annotations | p. 99 |
| Reflecting on Annotations | p. 101 |
| The for/in Statement | p. 107 |
| Ditching Iterators | p. 107 |
| Iterating over Arrays | p. 110 |
| Iterating over Collections | p. 111 |
| Avoiding Unnecessary Typecasts | p. 113 |
| Making Your Classes Work with for/in | p. 115 |
| Determining List Position and Variable Value | p. 119 |
| Removing List Items in a for/in Loop | p. 121 |
| Static Imports | p. 123 |
| Importing Static Members | p. 123 |
| Using Wildcards in Static Imports | p. 125 |
| Importing Enumerated Type Values | p. 126 |
| Importing Multiple Members with the Same Name | p. 128 |
| Shadowing Static Imports | p. 130 |
| Formatting | p. 132 |
| Creating a Formatter | p. 132 |
| Writing Formatted Output | p. 133 |
| Using the format() Convenience Method | p. 139 |
| Using the printf() Convenience Method | p. 140 |
| Threading | p. 142 |
| Handling Uncaught Exceptions in Threads | p. 142 |
| Using Thread-Safe Collections | p. 146 |
| Using Blocking Queues | p. 148 |
| Specifying Timeouts for Blocking | p. 152 |
| Separating Thread Logic from Execution Logic | p. 154 |
| Using Executor as a Service | p. 156 |
| Using Callable Objects | p. 158 |
| Executing Tasks Without an ExecutorService | p. 160 |
| Scheduling Tasks | p. 161 |
| Advanced Synchronizing | p. 164 |
| Using Atomic Types | p. 165 |
| Locking Versus Synchronization | p. 167 |
| Index | p. 173 |
| Table of Contents provided by Ingram. All Rights Reserved. |