java set与另一个set是否有交集 java set相等
转载
- Set和Collection相比并没有提供更多处理数据的方法,Set中的对象是无序的,可以说Set就是Collection
- 需要指出的是Set中不允许有相同的元素(说明:Set中不是 == 来判断两个元素是否相等的(以前的博文有说明过 == 是比较物理地址的),Set是通过equals()方法和hashCode()来判断的,即equals()返回true,同时hashCode()返回值相同时将两个对象判定为同一个对象)
- HashSet是Set类的主要实现类,以下代码说明了Set如何判定两个对象是否相同
//当向HashSet中存入A,B对象时,只有这连个对象的equals返回为true
// 和hashCode一样的时候,HashCode才会把它们当成一个对象
//可以看到的是,Set中之存在一个C对象,因为C的equals方法返回true和hashCode方法返回值固定,所有Set会把所有的C对象都当作是一样的。
package Set;
import java.util.HashSet;
class A{
public boolean equals(Object obj){
return true;
}
}
class B{
public int hashCode(){
return 2;
}
}
class C{
public int hashCode(){
return 3;
}
public boolean equals(Object obj){
return true;
}
}
public class HashSetTest {
public static void main(String args[]){
HashSet books = new HashSet();
books.add(new A());
books.add(new A());
books.add(new B());
books.add(new B());
books.add(new C());
books.add(new C());
System.out.println(books);
}
}
//输出结果为
// [Set.B@2, Set.B@2, Set.C@3, Set.A@13b6d03, Set.A@f5f2bb7]
- 介绍一下LinkedHashSet类,LinkedHashSet类就是使用链表来维护集合元素的顺序~~也没啥好特殊的
- 以下为代码实例
//LinkedHashSet就是普通的hashset加上链式结构存储
package Set;
import java.util.LinkedHashSet;
public class LinkedHashSetTest {
public static void main(String args[]){
LinkedHashSet books = new LinkedHashSet();
books.add("java1");
books.add("java2");
System.out.println(books);
// 输出 [java1, java2]
books.remove("java1");
books.add("java1");
System.out.println(books);
// 输出 [java2, java1]
}
}
- 接下来介绍TreeSet类,TreeSet类最大的特点就是TreeSet集合中的元素排列不是无序的,它将输入的元素按照从小到大的顺序排列(字符类型的按照其Unicode值排序,字符串类型的按照字符串中的字符的Unicode值排序,Boolean类型的按照True大于False,数值型的按照数值大小排序),所以,TreeSet中元素的类型必须是相同的,因为只有相同类型的变量才可以比较。
- 以下是TreeSet类一些方法使用的实例
package Set;
import java.util.TreeSet;
public class TreeSetTest {
public static void main(String args[]){
TreeSet nums = new TreeSet();
nums.add(1);
nums.add(2);
nums.add(3);
nums.add(4);
// 这里需要特别指出的是,add()方法中的变量类型应该是一致的,具体的原因是:
// TreeSet会对集合里面的每一个元素进行比较,以决定其顺序,这样子的话就需要
// 大部分类在时间comparedTo()(也就是比较的时候),都需要把被比较的对象
// 强制转换为相同的类型,因为只有相同的类的实例才可以比较大小
System.out.println(nums);
// 这里需要特别指出:TreeSet并不是通过元素加入TreeSet的顺序来保存元素数据的
// 而是通过元素的大小来保存数据的
System.out.println(nums.first());
// first()方法返回TreeSet里的第一个元素
System.out.println(nums.last());
// last()方法返回TreeSet里的最后一个元素
System.out.println(nums.headSet(4));
// headSet()返回TreeSet中所有不大于参数里的数
System.out.println(nums.subSet(-3,4));
// subSet(arg1,arg2)返回TreeSet中大于大于等于arg1但小于arg2的数
}
}
//输出结果:
// [1, 2, 3, 4]
// 1
// 4
// [1, 2, 3]
// [1, 2, 3]
- TreeSet是可以定制排序的,实现方法是在实例化TreeSet的时候提供一个Comparator对象与其相关联,由该Cpmparator管理TreeSet的排列顺序,以下为代码实例
package Set;
import java.util.Comparator;
import java.util.TreeSet;
class M{
int age;
public M(int age){
this.age = age;
}
public String toString(){
return "M[age:" + age + "]";
}
}
public class TreeSetTest4 {
public static void main(String args[]){
TreeSet treeSet = new TreeSet(new Comparator() {
@Override
public int compare(Object o1, Object o2) {
M m1 = (M)o1;
M m2 = (M)o2;
return m1.age > m2.age ? -1
:m1.age < m2.age ? 1 : 0;
// 相当于下面的语句(来自幕后大佬)
// if(m1.age > m2.age){
// return -1;
// }else if (m1.age < m2.age){
// return 1;
// }else {
// return 0;
// }
}
});
treeSet.add(new M(5));
treeSet.add(new M(-3));
treeSet.add(new M(9));
System.out.println(treeSet);
}
}
本文章为转载内容,我们尊重原作者对文章享有的著作权。如有内容错误或侵权问题,欢迎原作者联系我们进行内容更正或删除文章。