Search code examples
javacollectionshashsetcomparable

Java - Make an object collection friendly


If an object holds a unique primary key, what interfaces does it need to implement in order to be collection friendly especially in terms of being efficiently sortable, hashable, etc...?

If the primary key is a string, how are these interfaces best implemented?

Thanks!


Solution

  • You must override Object.equals() and Object.hashCode(), and also implement the Comparable interface. This will make your class fully "compliant" when doing any kind of sorting or hashing including using Collections.sort(), any Map class, or any Set class. If there's even a tiny chance that the class will be put in some sort of collection, then it should definitely implement all three of these methods.

    public class A implements Comparable<A>{
        private String key;
    
        @Override
        public boolean equals(Object obj){
            if (this == obj) return true;
            if (!(obj instanceof A)) return false;
    
            A that = (A)obj;
            return this.key.equals(that.key);    
        }
    
        @Override
        public int hashCode(){
            return key.hashCode();
        }
    
        @Override
        public int compareTo(A that){
            //returns -1 if "this" object is less than "that" object
            //returns 0 if they are equal
            //returns 1 if "this" object is greater than "that" object
            return this.key.compareTo(that.key);
        }
    }
    

    Keep in mind that if two objects are equal, then:

    1. their hash codes must also be equal and
    2. compareTo() must return 0.