首页 > 编程知识 正文

什么时候用treeset(hashmap和treeset)

时间:2023-05-04 19:26:56 阅读:101071 作者:662

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群讨论,有全套资源分享,经验探讨,没错,我们等着你,分享互相的故事!

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。