Data Structures and Abstractions with Java