HashSet和TreeSet
设置界面
集合不允许包含相同的元素。如果试图将两个相同的元素添加到同一个集合中,add方法将返回false。
Set不使用==运算符来判断两个对象是否相同,而是根据equals方法。也就是说,只要用equals方法比较两个对象并返回true,Set就不会接受这两个对象,最多包含一个null元素。
HashSet和TreeSet都是基于Set接口的实现类。TreeSet是Set的子接口SortedSet的实现类。Set接口、其子接口和实现类的结构如下:
| ——存储集接口——存储集实现类
接口——|——HashSet实现类
| ——LinkedHashSet实现类
HashSet
元素的排列顺序无法保证,顺序可能会改变。非同步集合的元素可以为null,但只能放置一个null。当一个元素存放到HashSet组合中时,HashSet会调用对象的hashCode()方法获取对象的hashCode值,然后根据hashCode值确定对象在HashSet中的存储位置。
简单来说,HashSet集合判断两个元素是否相等的标准是两个对象通过equals方法相等,两个对象的hashCode()方法返回值相等。
请注意,如果您想将一个对象放入HashSet并重写该对象的相应类的equals方法,您还应该重写其hashCode()方法。规则是,如果两个对象通过equals方法的比较返回true,它们的hashCode应该是相同的。此外,应该使用对象中用作等于比较标准的所有属性来计算hashCode的值。
例如:
#
导入Java . util . hashset;
导入Java . util . iterator;
公共类HashSetTest {
公共静态void main(String[]args){ 0
HashSet hs=new HashSet();
/*//hs . add(' one ');
hs . add(' two ');
hs.add('三');
hs.add('四');*/
hs.add(新学生(1,‘张三’);
hs.add(新学生(2,‘离石’);
新学生(3,“吴王”);
hs.add(新学生(1,‘张三’);
iterator it=hs . iterator();
while(it . HasNeXt()){ 0
system . out . println(it . next());
}
}
}
学生类{ //HashSet想要覆盖hashCode和equals方法。
int num
字符串名称;
学生(整数,字符串名称){ 0
this.num=num
this.name=name
}
公共字符串ToString(){ 0
返回“num :”num“name :”名称;
}
public int HashCode(){ 0
返回num * name . hashcode();
}
公共布尔等于(对象o){ 0
学生s=(学生)o;
返回num==s . num name . equals(s . name);
}
}
#
TreeSet类
TreeSet是SortedSet接口唯一的实现类。TreeSet可以确保集合元素被排序。TreeSet支持自然排序和自定义排序两种排序方式,其中自然排序是默认的排序方式。应该添加到TreeSet的是同一个类的对象。
TreeSet通过equals方法返回false或CompareTo方法不返回0来判断两个对象不相等。
1.自然分类
自然排序使用要排序的元素的CompareTo(Object obj)方法来比较元素之间的大小关系,然后按升序排列元素。
Java提供了一个Comparable接口,其中定义了一个compareTo(Object obj)方法,该方法返回一个整数值,实现这个接口的对象可以在大小上进行比较。
如果obj1。comparison (obj2)方法返回0,表示被比较的两个对象相等;如果它返回一个正数,这意味着
Obj1大于obj2。如果为负,则表示obj1小于obj2。
如果两个对象的equals方法总是返回true,那么这两个对象的compareTo方法应该返回0。
2.自定义排序
自然排序根据集合元素的大小按升序排列。如果要自定义排序,应该使用Comparator接口实现int compare(T o1,T o2)方法。我们能
构造TreeSet对象时,传递实现了Comparator接口的比较器对象.import java.util.Comparator; import java.util.Iterator; import java.util.TreeSet; public class TreeSetTest { public static void main(String[] args) { TreeSet<Students> ts = new TreeSet<Students>(new CompareToStudent()); ts.add(new Students(2, "zhangshan")); ts.add(new Students(3, "lishi")); ts.add(new Students(1, "wangwu")); ts.add(new Students(4, "maliu")); Iterator<Students> it = ts.iterator(); while (it.hasNext()) { System.out.println(it.next()); } } } class Students implements Comparable<Students> { int num; String name; Students(int num, String name) { this.num = num; this.name = name; } public String toString() { return num + ":" + name; } @Override public int compareTo(Students o) { int result; Students s = (Students) o; result = num > s.num ? 1 : (num == s.num ? 0 : -1); if (result == 0) { result = name.compareTo(s.name); } return result; } } class CompareToStudent implements Comparator<Object> { public int compare(Object o1, Object o2) { Students s1 = (Students) o1; Students s2 = (Students) o2; int rulst = s1.num > s2.num ? 1 : (s1.num == s2.num ? 0 : -1); if (rulst == 0) { rulst = s1.name.compareTo(s2.name); } return rulst; } }与HashSet相比,TreeSet还提供了几个额外的方法:
1、Comparator comparator():返回当前set使用的Comparator,或者返回null,表示以自然方式排序。
2、Object first():返回集合中的第一个元素。
3、Object last():返回集合中的最后一个元素。
4、Object lower(Object e):返回集合中位于指定元素之前的一个元素。
5、Object higher(Object e):返回集合中位于指定元素之后的一个元素。
6、SortedSet subSet(from Element,to Element):返回此set的子集合,范围从from Element到to Element(闭包)。
7、SortedSet headSet(toElement):返回此Set的子集,由小于toElement的元素组成。
8、SortedSet tailSet(fromElement):返回此Set的子集,由大于等于fromElement的元素组成。
LinkedHashSet
HashSet还有一个子类LinkedHashSet,其集合也是根据元素hashCode值来决定元素的存储位置,但它同时用链表来维护元素的次序,这样使得元素看起来是以插入的顺序保存的,也就是说,当遍历LinkedHashSet集合元素时,它将会按元素的添加顺序来访问集合里的元素。所以LinkedHashSet的性能略低于HashSet,但在迭代访问全部元素时将有很好的性能,因为它以链表来维护内部顺序。
===============================
感谢您能看完,希望能够帮到您。
关注公众号,免费领取-【java核心知识点】
QQ讨论群组:984370849 706564342 欢迎加入讨论
想要深入学习的同学们可以加入QQ群讨论,有全套资源分享,经验探讨,没错,我们等着你,分享互相的故事!