Lectures
Lecture 1: The Essence of Objects
Lecture 2: Unions of Objects
Lecture 3: Cancelled
Lecture 4: Classes of Objects:   Data Definitions
Lecture 5: Classes of Objects:   Interface Definitions
Lecture 6: Interface Design:   Independent and Extensible
Lecture 7: Parametric Interface Definitions and Methods
Lecture 8: Introducing Java:   Syntax and Semantics
Lecture 9: Union, Interfaces, and Lists in Java
Lecture 10: Testing in Java
Lecture 11: Parametric Interfaces in Java
Lecture 12: Computations on Many Structural Arguments:   Double Dispatch
Lecture 13: Parameterized Types and Double Dispatch; Abstracting Values
Lecture 14: Abstracting Computation with Function Objects
Lecture 15: Function Objects & Parameterized Types; Anonymous Classes & Lambda
Lecture 16: The Fundamental List Abstraction:   Fold
Lecture 17: University Closed:   Wind
Lecture 18: Midterm Review
Lecture 19: Properties of Equality:   Reflexive, Symmetric, Transitive, and Total
Lecture 20: Structural Equality with Double Dispatch; Abstracting and Overridding
Lecture 21: More Double Dispatch
Lecture 22: Optional, Maps, Sets, and Lifting Default Code to Abstract Classes
Lecture 23: The Visitor Pattern
Lecture 24: Implementing Visitors; Bank Accounts
Lecture 25: Imperatives:   Implicit Communication via Side-Effects
Lecture 26: Aside:   List Exercises
Lecture 27: Imperatives:   Cyclic Data
Lecture 28: Imperatives:   Methods over Cylic Data
Lecture 29: BSTs, Maps, The Law of Hash  Code, and Comparable vs Comparators
Lecture 30: Random access and Array  Lists
Lecture 31: Implementing Hash Tables
Lecture 32: Resizing Hash Tables
Lecture 33: Simple Iterators
Lecture 34: List Iterators and Iterator Combinators
Lecture 35: List Iterators and Iterator Combinators
Lecture 36: Zippers
Lecture 37: Naive Tree Iterators
Lecture 38: Efficient Pre-Order Tree Iterators
Lecture 39: Drills
Lecture 40: Drill Solutions
Lecture 41: Wrap-up
6.12

Lectures

    Lecture 1: The Essence of Objects

    Lecture 2: Unions of Objects

    Lecture 3: Cancelled

    Lecture 4: Classes of Objects: Data Definitions

    Lecture 5: Classes of Objects: Interface Definitions

    Lecture 6: Interface Design: Independent and Extensible

    Lecture 7: Parametric Interface Definitions and Methods

    Lecture 8: Introducing Java: Syntax and Semantics

    Lecture 9: Union, Interfaces, and Lists in Java

    Lecture 10: Testing in Java

    Lecture 11: Parametric Interfaces in Java

    Lecture 12: Computations on Many Structural Arguments: Double Dispatch

    Lecture 13: Parameterized Types and Double Dispatch; Abstracting Values

    Lecture 14: Abstracting Computation with Function Objects

    Lecture 15: Function Objects & Parameterized Types; Anonymous Classes & Lambda

    Lecture 16: The Fundamental List Abstraction: Fold

    Lecture 17: University Closed: Wind

    Lecture 18: Midterm Review

    Lecture 19: Properties of Equality: Reflexive, Symmetric, Transitive, and Total

    Lecture 20: Structural Equality with Double Dispatch; Abstracting and Overridding

    Lecture 21: More Double Dispatch

    Lecture 22: Optional, Maps, Sets, and Lifting Default Code to Abstract Classes

    Lecture 23: The Visitor Pattern

    Lecture 24: Implementing Visitors; Bank Accounts

    Lecture 25: Imperatives: Implicit Communication via Side-Effects

    Lecture 26: Aside: List Exercises

    Lecture 27: Imperatives: Cyclic Data

    Lecture 28: Imperatives: Methods over Cylic Data

    Lecture 29: BSTs, Maps, The Law of HashCode, and Comparable vs Comparators

    Lecture 30: Random access and ArrayLists

    Lecture 31: Implementing Hash Tables

    Lecture 32: Resizing Hash Tables

    Lecture 33: Simple Iterators

    Lecture 34: List Iterators and Iterator Combinators

    Lecture 35: List Iterators and Iterator Combinators

    Lecture 36: Zippers

    Lecture 37: Naive Tree Iterators

    Lecture 38: Efficient Pre-Order Tree Iterators

    Lecture 39: Drills

    Lecture 40: Drill Solutions

    Lecture 41: Wrap-up