ArrayList наследует реализацию equals из своего родительского класса AbstractList, что не очень эффективно.
Сначала он может проверить размер двух ArrayLists, а затем вернуть false сразу, если эти размеры разные. Почему это не делает ArrayList?