The standard assignment operator semantics return the assigned value as a result of the assignment.
So really it should return either an ArrayList or a const ArrayList&. The later is preferred with large objects, since it only passes around an address, not a full copy of the value in question.
btw, its returning *this, since after having completed the assignment, *this is the value that was assigned.