List转Set:
Set<String> set = new HashSet<>(list); (对String这种有去重效果)
Set转List:
List<String> list = new ArrayList<>(set);
在list 转 set 时想要去重对象,则需要重写equals 和hashcode 方法 如下
@Override
public boolean equals(Object arg0) {
CustomerSaleplus CustomerSaleplus = (CustomerSaleplus) arg0;
return name.equals(CustomerSaleplus.name) && phone.equals(CustomerSaleplus.phone);
}//按name和phone去重
@Override
public int hashCode() {
String str = name + phone;
return str.hashCode();
}
要注意的是不要忘了写有参构造和无参构造 至于为什么要重写hashcode方法
String类中的equals()方法的源码如下
public boolean equals(Object anObject) {
if (this == anObject) {
return true;
}
if (anObject instanceof String) {
String anotherString = (String)anObject;
int n = count;
if (n == anotherString.count) {
char v1[] = value;
char v2[] = anotherString.value;
int i = offset;
int j = anotherString.offset;
while (n-- != 0) {
if (v1[i++] != v2[j++])
return false;
}
return true;
}
}
return false;
}
通过观察equals()方法的源码我们可以看出,该方法去比较两个对象时,首先先去判断两个对象是否具有相同的地址,如果是同一个对象的引用,则直接放回true;如果地址不一样,则证明不是引用同一个对象,接下来就是挨个去比较两个字符串对象的内容是否一致,完全相等返回true,否则false
String类中hashCode()方法的源码如下
public int hashCode() {
int h = hash;
if (h == 0 && count > 0) {
int off = offset;
char val[] = value;
int len = count;
for (int i = 0; i < len; i++) {
h = 31*h + val[off++];
}
hash = h;
}
return h;
}
在Object类中的hashCode()方法是返回对象的32位JVM内存地址,2个不同的对象的32位JVM内存地址显然是不同的,所以注释掉重写的hashcode()方法 ,你会发现set去重达不到你要的效果,所以在重写equals的时候,要连着hashcode一起重写
A 1,2
B 2,3
取交集:listA.retainAll(listB); 2
取并集:listA.addAll(listB); 1223
取差集:listA.removeAll(listB); 1