Data Structures in Java: From Abstract Data Types to the Java Collections Framework