Advanced programming techniques in the Java language. Elementary techniques of software engineering: documentation, coding style, basic testing principles, and informal reasoning about correctness. The notion of an abstract data structure and various important data structures: stacks, queues, linked lists, tree-based structures, and hash tables. Use of object-oriented language constructs for encapsulation of data objects. Lecture, programming projects.