Central to all software systems are data structures that provide methods for organizing and accessing information. Selecting appropriate data structures for an application is essential for both ease of implementation and efficiency of execution. This is because the efficiency of algorithms that operate on data depend heavily upon the organization that data structures provide. Therefore, the design of data structures and algorithms are closely intertwined. Object-oriented programming languages like Java capture this relationship through classes that provide both a data representation (e.g., a data structure) and methods that implement algorithms for operating on that representation.