Set里的元素是不能重复的,那么用什么方法来区分重复与否呢? 是用==还是equals()? 它们有何区别?

说明:其实这个题目本身有问题!因为Set只是一个接口,它的不同实现类判断元素是否相等的标准是不同的。笼统地说,Set里的元素是不能重复的,判断元素重复使用equals()。而不是==

对于HashSet而言,判断两个对象是否相等是通过equals()hashCode()方法,只要两个对象通过 equals()比较返回false、或两个对象的hashCode()不相等,那么HashSet就会把它们当成不相同。

对于TreeSet而言,判断两个对象相等的唯一标准是:两个对象通过compareTo(Object obj)比较是否返回0,与equals()方法无关。只要两个对象通过compareTo(Object obj)比较没有返回0Java就会把它们当成两个对象处理——这一点是很多人容易误解的,一个示例来说明:

class Z implements Comparable

{

int age;

public Z(int age)

{

this.age = age;

}

// 重写equals()方法,总是返回true

public boolean equals(Object obj)

{

return true;

}

//重写了compareTo(Object obj)方法,总是返回正整数

public int compareTo(Object obj)

{

return 1;

}

}

public class TreeSetTest2

{

public static void main(String[] args)

{

TreeSet set = new TreeSet();

Z z1 = new Z(6);

set.add(z1);

//输出true,表明添加成功

System.out.println(set.add(z1));    //

//下面输出set集合,将看到有两个元素

System.out.println(set);

//修改set集合的第一个元素的age变量

 ((Z)(set.first())).age = 9;

//输出set集合的最后一个元素的age变量,将看到也变成了9

System.out.println(((Z)(set.last())).age);

}

}

上面程序中两个Z对象通过equals()比较总会返回true,但通过compareTo(Object obj)比较总是不会返回0,因此两次向TreeSet中添加同一个元素,TreeSet会把它们当成不同的对象进行处理,最后TreeSet集合中会显示有两个对象,但实际上是同一个对象。

Java Program!
原文地址:https://www.cnblogs.com/programb/p/14068523.html