大家都知道,set集合的特点就是没有重复的元素。如果集合中的数据类型是基本数据类型,可以直接将list集合转换成set,就会自动去除重复的元素,这个就相对比较简单。
如下例:
public class Test {
public static void main(String[] args) {
List list = new ArrayList();
list.add(11);
list.add(12);
list.add(13);
list.add(14);
list.add(15);
list.add(11);
System.out.println(list);
Set set = new HashSet();
List newList = new ArrayList();
set.addAll(list);
newList.addAll(set);
System.out.println(newList);
}
}
运行结果发现去重成功了。
但是,当list集合中存储的类型是对象类型的时候,我们就不能简单的只把list集合转换成set集合。解释这个原因很简单,首先了解:如何去重?
一般我们肯定先比较两个变量是不是相等的。
对于字符型、整型等简单变量,java就有它们的比较机制。但是对于我们用户自定义的变量即对象来说,java也有它自己的比较机制,例如比较它们的引用地址值是否相等。
但是我们一般不比较地址值,例如,一个对象有姓名、学号两个成员变量,比较地址值没有任何现实意义,我们一般会比较对象里的姓名属性是否相等、学号属性是否相等,如果都相等,就认为两个对象相等了。
所以,之所以对象集合去重不能简单的只把list集合转换成set集合就是这个道理,人家是比较地址值的,肯定每个对象地址值都不一样啊,所以转换成set也不会做任何改变。如果想实现转换去重,必须要重写equals方法(同样也要重写hashCode方法),这时人家在比较去重时,就会调用你自己的equals方法来实现比较去重。还有一点就是,set集合你可以添加重复的对象,但是它会把之前的那个对象删掉,把这个新对象加入。
这里可以参考下equals的重写问题https://blog.csdn.net/qq_36923376/article/details/83652958