Most efficient way to see if an ArrayList contains an object in Java

It depends on how efficient you need things to be. Simply iterating over the list looking for the element which satisfies a certain condition is O(n), but so is ArrayList.Contains if you could implement the Equals method. If you’re not doing this in loops or inner loops this approach is probably just fine.

If you really need very efficient look-up speeds at all cost, you’ll need to do two things:

  1. Work around the fact that the class
    is generated: Write an adapter class which
    can wrap the generated class and
    which implement equals() based
    on those two fields (assuming they
    are public). Don’t forget to also
    implement hashCode() (*)
  2. Wrap each object with that adapter and
    put it in a HashSet.
    HashSet.contains() has constant
    access time, i.e. O(1) instead of O(n).

Of course, building this HashSet still has a O(n) cost. You are only going to gain anything if the cost of building the HashSet is negligible compared to the total cost of all the contains() checks that you need to do. Trying to build a list without duplicates is such a case.


*
() Implementing hashCode() is best done by XOR’ing (^ operator) the hashCodes of the same fields you are using for the equals implementation (but multiply by 31 to reduce the chance of the XOR yielding 0)

Leave a Comment