I was trying to answer [this](https://stackoverflow.com/questions/17608422/i-am-able-to-insert-duplicate-entries-in-treeset-how-to-overcome-this/17608436?noredirect=1#comment25630834_17608436) question in the forum and I found that despite of overriding the `equals` method in the `Employee` class, I am still able to add duplicate elements to the `TreeSet`.

The Javadoc of [TreeSet.add(E)](http://docs.oracle.com/javase/6/docs/api/java/util/TreeSet.html#add%28E%29) method says

> 
> Adds the specified element to this set if it is not already present.
>  More formally, adds the specified element e to this set if the set
>  contains no element e2 such that (e==null ? e2==null : e.equals(e2)).
>  If this set already contains the element, the call leaves the set
>  unchanged and returns false.
> 
> 
> 

This essentially means that no 2 equals objects will be inserted into `TreeSet` and equality is determined solely by `equals()` method of contained objects.

However, below code is adding 2 elements to the `Set` even though they are equal

```
public class Employee implements Comparable<Employee> {

    String employeeName;
    int employeeId;

    public Employee(String name, int id) {
        this.employeeName = name;
        this.employeeId = id;
    }

    public int compareTo(Employee emp) {
        //return this.employeeName.compareTo(emp.employeeName);
        return (this.employeeId - emp.employeeId);
    }

    @Override
    public String toString() {
        return ("Name is: " + employeeName + " Emp id is: " + employeeId);
    }

    @Override
    public boolean equals(Object emp) {
        if(emp instanceof Employee &&((Employee)emp).employeeName.equals(this.employeeName)){
            return true;
        }
        return false;
    }

    /**
     * @param args
     */
    public static void main(String[] args) {
        // TODO Auto-generated method stub
        Set<Employee> set = new TreeSet<Employee>();
        Employee e1 = new Employee("A", 1);
        Employee e2 = new Employee("A", 2);
        System.out.println(e1.equals(e2));
        set.add(e1);
        set.add(e2);
        System.out.println(set);
    }

}

```

And here is the output

```
true
[Name is: A Emp id is: 1, Name is: A Emp id is: 2]

```

**Why is `TreeSet` allowing multiple elements even if they are equal?**

Now I changed the `compareTo` method of `Employee` like this

```
public int compareTo(Employee emp) {
    return this.employeeName.compareTo(emp.employeeName);
}

```

And the output is 

```
true
[Name is: A Emp id is: 1]

```

**How the `TreeSet` working properly after overriding `compareTo` ?**