The Java programming language provides some standard data structures (such as arrays or files) that are adequate for many standard problems. Other problems require further data types to represent more complex structures, improve algorithm efficiency, or provide for more sophisticated memory management. Although Java implements many different types of container class for the convenience of programmers, students are expected to be able to develop their own ADTs from first principles. Higher level students must demonstrate mastery of some of these techniques in the program dossier and should be able to use any of these techniques during the examination. This topic extends several aspects of topics 1 and 2.