- •Contents at a Glance
 - •Contents
 - •About the Authors
 - •About the Technical Reviewer
 - •Acknowledgments
 - •Introduction
 - •Oracle Java Certifications: Overview
 - •FAQ 1. What are the different levels of Oracle Java certification exams?
 - •FAQ 4. Is OCPJP 7 prerequisite for other Oracle certification exams?
 - •FAQ 5. Should I take the OCPJP 7 or OCPJP 6 exam?
 - •The OCPJP 7 Exam
 - •FAQ 7. How many questions are there in the OCPJP 7 exam?
 - •FAQ 8. What is the duration of the OCPJP 7 exam?
 - •FAQ 9. What is the cost of the OCPJP 7 exam?
 - •FAQ 10. What are the passing scores for the OCPJP 7 exam?
 - •FAQ 11. What kinds of questions are asked in the OCPJP 7 exam?
 - •FAQ 12. What does the OCPJP 7 exam test for?
 - •FAQ 13. I’ve been a Java programmer for last five years. Do I have to prepare for the OCPJP 7 exam?
 - •FAQ 14. How do I prepare for the OCPJP 7 exam?
 - •FAQ 15. How do I know when I’m ready to take the OCPJP 7 exam?
 - •Taking the OCPJP 7 Exam
 - •FAQ 16. What are my options to register for the exam?
 - •FAQ 17. How do I register for the exam, schedule a day and time for taking the exam, and appear for the exam?
 - •The OCPJP 7 Exam: Pretest
 - •Answers with Explanations
 - •Post-Pretest Evaluation
 - •Essentials of OOP
 - •FunPaint Application: An Example
 - •Foundations of OOP
 - •Abstraction
 - •Encapsulation
 - •Inheritance
 - •Polymorphism
 - •Class Fundamentals
 - •Object Creation
 - •Constructors
 - •Access Modifiers
 - •Public Access Modifier
 - •Private Access Modifier
 - •Protected and Default Access Modifier
 - •Overloading
 - •Method Overloading
 - •Constructor Overloading
 - •Overload resolution
 - •Points to Remember
 - •Inheritance
 - •Runtime Polymorphism
 - •An Example
 - •Overriding Issues
 - •Overriding: Deeper Dive
 - •Invoking Superclass Methods
 - •Type Conversions
 - •Upcasts and Downcasts
 - •Casting Between Inconvertible Types
 - •Using “instanceof” for Safe Downcasts
 - •Java Packages
 - •Working with Packages
 - •Static Import
 - •Summary
 - •Abstract Classes
 - •Points to Remember
 - •Using the “final” Keyword
 - •Final Classes
 - •Final Methods and Variables
 - •Points to Remember
 - •Using the “static” Keyword
 - •Static Block
 - •Points to Remember
 - •Flavors of Nested Classes
 - •Static Nested Classes (or Interfaces)
 - •Points to Remember
 - •Inner Classes
 - •Points to Remember
 - •Local Inner Classes
 - •Points to Remember
 - •Anonymous Inner Classes
 - •Points to Remember
 - •Enum Data Types
 - •Points to Remember
 - •Summary
 - •Interfaces
 - •Declaring and Using Interfaces
 - •Points to Remember
 - •Abstract Classes vs. Interfaces
 - •Choosing Between an Abstract Class and an Interface
 - •Object Composition
 - •Composition vs. Inheritance
 - •Points to Remember
 - •Design Patterns
 - •The Singleton Design Pattern
 - •Ensuring That Your Singleton Is Indeed a Singleton
 - •The Factory Design Pattern
 - •Differences Between Factory and Abstract Factory Design Patterns
 - •The Data Access Object (DAO) Design Pattern
 - •Points to Remember
 - •Summary
 - •Generics
 - •Using Object Type and Type Safety
 - •Using the Object Class vs. Generics
 - •Container Implementation Using the Object Class
 - •Container Implementation Using Generics
 - •Creating Generic Classes
 - •Diamond Syntax
 - •Interoperability of Raw Types and Generic Types
 - •Generic Methods
 - •Generics and Subtyping
 - •Wildcard Parameters
 - •Limitations of Wildcards
 - •Bounded Wildcards
 - •Wildcards in the Collections Class
 - •Points to Remember
 - •The Collections Framework
 - •Why Reusable Classes?
 - •Basic Components of the Collections Framework
 - •Abstract Classes and Interfaces
 - •Concrete Classes
 - •List Classes
 - •ArrayList Class
 - •The ListIterator Interface
 - •The LinkedList Class
 - •The Set Interface
 - •The HashSet Class
 - •The TreeSet Class
 - •The Map Interface
 - •The HashMap Class
 - •Overriding the hashCode() Method
 - •The NavigableMap Interface
 - •The Queue Interface
 - •The Deque Interface
 - •Comparable and Comparator Interfaces
 - •Algorithms (Collections Class)
 - •The Arrays Class
 - •Methods in the Arrays Class
 - •Array as a List
 - •Points to Remember
 - •Summary
 - •Generics
 - •Collections Framework
 - •Processing Strings
 - •String Searching
 - •The IndexOf() Method
 - •The regionMatches() Method
 - •String Parsing
 - •String Conversions
 - •The Split() Method
 - •Regular Expressions
 - •Understanding regex Symbols
 - •Regex Support in Java
 - •Searching and Parsing with regex
 - •Replacing Strings with regex
 - •String Formatting
 - •Format Specifiers
 - •Points to Remember
 - •Summary
 - •Reading and Writing from Console
 - •Understanding the Console Class
 - •Formatted I/O with the Console Class
 - •Special Character Handling in the Console Class
 - •Using Streams to Read and Write Files
 - •Character Streams and Byte Streams
 - •Character Streams
 - •Reading Text Files
 - •Reading and Writing Text Files
 - •“Tokenizing” Text
 - •Byte Streams
 - •Reading a Byte Stream
 - •Data Streams
 - •Writing to and Reading from Object Streams: Serialization
 - •Serialization: Some More Details
 - •Points to Remember
 - •Summary
 - •A Quick History of I/O APIs
 - •Using the Path Interface
 - •Getting Path Information
 - •Comparing Two Paths
 - •Using the Files Class
 - •Checking File Properties and Metadata
 - •Copying a File
 - •Moving a File
 - •Deleting a File
 - •Walking a File Tree
 - •Revisiting File Copy
 - •Finding a File
 - •Watching a Directory for Changes
 - •Points to Remember
 - •Summary
 - •Introduction to JDBC
 - •The Architecture of JDBC
 - •Two-Tier and Three-Tier JDBC Architecture
 - •Types of JDBC Drivers
 - •Setting Up the Database
 - •Connecting to a Database Using a JDBC Driver
 - •The Connection Interface
 - •Connecting to the Database
 - •Statement
 - •ResultSet
 - •Querying the Database
 - •Updating the Database
 - •Getting the Database Metadata
 - •Points to Remember
 - •Querying and Updating the Database
 - •Performing Transactions
 - •Rolling Back Database Operations
 - •The RowSet Interface
 - •Points to Remember
 - •Summary
 - •Define the Layout of the JDBC API
 - •Connect to a Database by Using a JDBC driver
 - •Update and Query a Database
 - •Customize the Transaction Behavior of JDBC and Commit Transactions
 - •Use the JDBC 4.1 RowSetProvider, RowSetFactory, and RowSet Interfaces
 - •Introduction to Exception Handling
 - •Throwing Exceptions
 - •Unhandled Exceptions
 - •Try and Catch Statements
 - •Programmatically Accessing the Stack Trace
 - •Multiple Catch Blocks
 - •Multi-Catch Blocks
 - •General Catch Handlers
 - •Finally Blocks
 - •Points to Remember
 - •Try-with-Resources
 - •Closing Multiple Resources
 - •Points to Remember
 - •Exception Types
 - •The Exception Class
 - •The RuntimeException Class
 - •The Error Class
 - •The Throws Clause
 - •Method Overriding and the Throws Clause
 - •Points to Remember
 - •Custom Exceptions
 - •Assertions
 - •Assert Statement
 - •How Not to Use Asserts
 - •Summary
 - •Introduction
 - •Locales
 - •The Locale Class
 - •Getting Locale Details
 - •Resource Bundles
 - •Using PropertyResourceBundle
 - •Using ListResourceBundle
 - •Loading a Resource Bundle
 - •Naming Convention for Resource Bundles
 - •Formatting for Local Culture
 - •The NumberFormat Class
 - •The Currency Class
 - •The DateFormat Class
 - •The SimpleDateFormat Class
 - •Points to Remember
 - •Summary
 - •Introduction to Concurrent Programming
 - •Important Threading-Related Methods
 - •Creating Threads
 - •Extending the Thread Class
 - •Implementing the Runnable Interface
 - •The Start( ) and Run( ) Methods
 - •Thread Name, Priority, and Group
 - •Using the Thread.sleep() Method
 - •Using Thread’s Join Method
 - •Asynchronous Execution
 - •The States of a Thread
 - •Two States in “Runnable” State
 - •Concurrent Access Problems
 - •Data Races
 - •Thread Synchronization
 - •Synchronized Blocks
 - •Synchronized Methods
 - •Synchronized Blocks vs. Synchronized Methods
 - •Deadlocks
 - •Other Threading Problems
 - •Livelocks
 - •Lock Starvation
 - •The Wait/Notify Mechanism
 - •Let’s Solve a Problem
 - •More Thread States
 - •timed_waiting and blocked States
 - •waiting State
 - •Using Thread.State enum
 - •Understanding IllegalThreadStateException
 - •Summary
 - •Using java.util.concurrent Collections
 - •Semaphore
 - •CountDownLatch
 - •Exchanger
 - •CyclicBarrier
 - •Phaser
 - •Concurrent Collections
 - •Apply Atomic Variables and Locks
 - •Atomic Variables
 - •Locks
 - •Conditions
 - •Multiple Conditions on a Lock
 - •Use Executors and ThreadPools
 - •Executor
 - •Callable, Executors, ExecutorService, ThreadPool, and Future
 - •ThreadFactory
 - •The ThreadLocalRandom Class
 - •TimeUnit Enumeration
 - •Use the Parallel Fork/Join Framework
 - •Useful Classes of the Fork/Join Framework
 - •Using the Fork/Join Framework
 - •Points to Remember
 - •Summary
 - •Using java.util.concurrent Collections
 - •Applying Atomic Variables and Locks
 - •Using Executors and ThreadPools
 - •Using the Parallel Fork/Join Framework
 - •Chapter 3: Java Class Design
 - •Chapter 4: Advanced Class Design
 - •Chapter 5: Object-Oriented Design Principles
 - •Chapter 6: Generics and Collections
 - •Chapter 7: String Processing
 - •Chapter 8: Java I/O Fundamentals
 - •Chapter 9: Java File I/O (NIO.2)
 - •Chapter 10: Building Database Applications with JDBC
 - •Chapter 11: Exceptions and Assertions
 - •Chapter 12: Localization
 - •Chapter 13: Threads
 - •Chapter 14: Concurrency
 - •OCPJP7 Exam (1Z0-804 a.k.a. Java SE 7 Programmer II) Topics
 - •OCPJP 7 Exam (1Z0-805, a.k.a. Upgrade to Java SE 7 Programmer) Topics
 - •Answers and Explanations
 - •Answer Sheet
 - •Answers and Explanations
 - •Index
 
Chapter 6 ■ Generics and Collections
Table 6-3. Methods in the Collection Interface That Apply to Multiple Elements
  | 
	
  | 
Method  | 
	Short Description  | 
boolean addAll(Collection<? extends  | 
	Adds all the elements in coll into the underlying container.  | 
Element> coll)  | 
	
  | 
boolean containsAll(Collection<?> coll)  | 
	Checks if all elements given in coll are present in the underlying  | 
  | 
	container.  | 
boolean removeAll(Collection<?> coll)  | 
	Removes all elements from the underlying container that are  | 
  | 
	also present in coll.  | 
boolean retainAll(Collection<?> coll)  | 
	Retains elements in the underlying container only if they are also  | 
  | 
	present in coll; it removes all other elements.  | 
  | 
	
  | 
Concrete Classes
Numerous interfaces and abstract classes in the Collection hierarchy provide the common methods that specific concrete classes implement/extend. The concrete classes provide the actual functionality, and you’ll have to learn only a handful of them to be properly prepared for the OCPJP 7 exam. Table 6-4 summarizes the features of the classes you should know.
Table 6-4. Important Concrete Classes in Collection Framework
Concrete Class  | 
	Short Description  | 
ArrayList  | 
	Internally implemented as a resizable array. This is one of the most widely used concrete  | 
  | 
	classes. Fast to search, but slow to insert or delete. Allows duplicates.  | 
LinkedList  | 
	Internally implements a doubly-linked list data structure. Fast to insert or delete elements,  | 
  | 
	but slow for searching elements. Additionally, LinkedList can be used when you need a stack  | 
  | 
	(LIFO) or queue (FIFO) data structure. Allows duplicates.  | 
HashSet  | 
	Internally implemented as a hash-table data structure. Used for storing a set of elements—it  | 
  | 
	does not allow storing duplicate elements. Fast for searching and retrieving elements. It does  | 
  | 
	not maintain any order for stored elements.  | 
TreeSet  | 
	Internally implements a red-black tree data structure. Like HashSet, TreeSet does not allow  | 
  | 
	storing duplicates. However, unlike HashSet, it stores the elements in a sorted order. It uses a  | 
  | 
	tree data structure to decide where to store or search the elements, and the position is decided  | 
  | 
	by the sorting order.  | 
HashMap  | 
	Internally implemented as a hash-table data structure. Stores key and value pairs. Uses  | 
  | 
	hashing for finding a place to search or store a pair. Searching or inserting is very fast. It does  | 
  | 
	not store the elements in any order.  | 
TreeMap  | 
	Internally implemented using a red-black tree data structure. Unlike HashMap, TreeMap stores  | 
  | 
	the elements in a sorted order. It uses a tree data structure to decide where to store or search  | 
  | 
	for keys, and the position is decided by the sorting order.  | 
PriorityQueue  | 
	Internally implemented using heap data structure. A PriorityQueue is for retrieving elements  | 
  | 
	based on priority. Irrespective of the order in which you insert, when you remove the  | 
  | 
	elements, the highest priority element will be retrieved first.  | 
  | 
	
  | 
174
