转自:http://blog.163.com/xiaohui_1123@126/blog/static/3980524020108281931944/
还找到了另一个:http://www.blogjava.net/kissyan4916/articles/279119.html
HashSet按Hash函数排序
LinkedHashSet按插入顺序排序
TreeSet按字母顺序排序
HashSet
此类实现 Set 接口,由哈希表(实际上是一个 HashMap 实例)支持。它不保证集合的迭代顺序;特别是它不保证该顺序恒久不变。此类允许使用 null 元素。
此类为基本操作提供了稳定性能,这些基本操作包括 add、remove、contains 和 size,假定哈希函数将这些元素正确地分布在桶中。对此集合进行迭代所需的时间与 HashSet 实例的大小(元素的数量)和底层 HashMap 实例(桶的数量)的“容量”的和成比例。因此,如果迭代性能很重要,则不要将初始容量设置得太高(或将加载因子设置得太低)。
我们应该为要存放到散列表的各个对象定义hashCode()和equals();
import java.util.HashSet;
import java.util.Iterator;
public class HashSetTest {
public static void main(String[] args)
{
HashSet hs=new HashSet();
/*hs.add("one");
hs.add("two");
hs.add("three");
hs.add("four");*/
hs.add(new Student(1,"zhangsan"));
hs.add(new Student(2,"lishi"));
hs.add(new Student(3,"wangwu"));
hs.add(new Student(1,"zhangsan"));
Iterator it=hs.iterator();
while(it.hasNext())
{
System.out.println(it.next());
}
}
}
//HashSet要重写hashCode和equals方法
class Student
{
int num;
String name;
Student(int num,String name)
{
this.num=num;
this.name=name;
}
public String toString()
{
return "num :"+num+" name:"+name;
}
public int hashCode()
{
return num*name.hashCode();
}
public boolean equals(Object o)
{
Student s=(Student)o;
return num==s.num && name.equals(s.name);
}
}
TreeSet
此类实现 Set 接口,该接口由 TreeMap 实例支持。此类保证排序后的 set 按照升序排列元素,根据使用的构造方法不同,可能会按照元素的自然顺序 进行排序,或按照在创建 set 时所提供的比较器进行排序。
是一个有序集合,元素中安升序排序,缺省是按照自然顺序进行排序,意味着TreeSet中元素要实现Comparable接口;
我们可以构造TreeSet对象时,传递实现了Comparator接口的比较器对象.
import java.util.*;
public class TreeSetTest {
public static void main(String[] args)
{
//TreeSet ts=new TreeSet();
TreeSet ts=new TreeSet(new Students.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 it=ts.iterator();
while(it.hasNext())
{
System.out.println(it.next());
}
}
}
class Students implements Comparable
{
int num;
String name;
Students(int num,String name)
{
this.num=num;
this.name=name;
}
//定义一个内部类来实现比较器
static class compareToStudent implements Comparator
{
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;
}
}
//写具体的比较方法
public int compareTo(Object 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;
}
public String toString()
{
return num+":"+name;
}
}
HashSet是基于Hash算法实现的,其性能通常优于TreeSet,我们通常都应该使用HashSet,在我们需要排序的功能时,我门才使用TreeSet;
说了这么多废话就是一点compareTo这个方法,当等于的时候就返回0,当大于就返回1,当小于就返回-1.
分享到:
相关推荐
本文主要探讨了三种基于Set接口的实现类:HashSet、LinkedHashSet和TreeSet,它们各自有不同的特性和使用场景。 首先,HashSet是最基础的Set实现,它不保证元素的特定顺序,也不保证在多次操作后保持元素的顺序不变...
比较遗憾的是,TreeSet 虽然实现起来也比较简单,但它有着和 HashSet 一样的问题,会自动排序 5:LinkedHashSet去重(有序) 从代码和执行结果可以看出,LinkedHashSet 是到目前为止,实现比较简单,且最终生成的新...
`HashSet`基于哈希表,提供了快速的插入、删除和查找,而`TreeSet`则保证元素的排序,适用于需要排序的场景。`Comparator`接口则允许我们自定义排序规则,增强了集合的灵活性。理解并熟练运用这些概念和工具,对于...
本文将深入探讨Java中四个主要的Set实现类:HashSet、LinkedHashSet、TreeSet以及EnumSet。 首先,Set集合的核心特性是不存储重复元素。在尝试通过`add()`方法添加相同元素时,如果集合中已经存在该元素,`add()`...
java8 源码 学习笔记(持续更新中) 所有文章均同步发布到微信公众号...LinkedHashSet TreeSet HashSet Concurrent源码系列 待完善 JVM(Java虚拟机) 类加载 垃圾回收算法 JavaConcurrent(Java并发系列) 【Java并发系列】
Set集合是JavaSE中的一种重要数据结构,主要包括HashSet、TreeSet和LinkedHashSet三个子类。下面我们将对Set集合的原理、特点、使用场景等进行详细的探索和分析。 HashSet HashSet是Set集合中的一种重要实现类,...
本文将深入探讨如何对ArrayList、HashSet、TreeSet以及数组中的对象进行排序。理解这些排序机制对于编写高效且可维护的代码至关重要。 首先,让我们从ArrayList开始。ArrayList是Java中实现List接口的一个动态数组...
与HashSet不同,TreeSet内部基于TreeMap实现,它维护了元素的排序。元素的排序可以是自然排序,即实现`Comparable`接口并重写`compareTo()`方法,也可以是客户排序,即创建一个实现了`Comparator`接口的类并在构造...
AbstractSet 抽象类SortedSet 接口HashSet LinkedHashSet TreeSet List 接口 AbstractList 和 AbstractSequentialList Vector Stack ArrayList LinkedList Queue接口Deque 接口 AbstractQueue 抽象类LinkedList ...
4. LinkedHashSet:继承于HashSet,并且其内部是通过LinkedHashMap实现的。 5. TreeSet:红黑树(自平衡的排序二叉树)。 6. HashMap:JDK1.8之前由数组+链表组成,JDK1.8以后在解决哈希冲突时有了较大的变化。 7. ...
在Java集合框架中,TreeSet是一个重要的数据结构,它是Set接口的实现类之一,与HashSet和LinkedHashSet不同,TreeSet具有排序功能,这是因为其不仅继承自AbstractSet,还实现了SortedSet和NavigableSet接口。...
Set接口不允许重复元素,如HashSet、LinkedHashSet和TreeSet。HashSet基于哈希表,不保证元素顺序;LinkedHashSet保留插入顺序;TreeSet基于红黑树,元素按自然顺序或自定义比较器排序。 Queue接口用于先进先出...
Set接口中的HashSet、LinkedHashSet和TreeSet分别提供了不同的元素排序和唯一性保证。 面试题中还会涉及具体实现类的选择,例如HashMap和TreeMap。HashMap提供快速的插入和查找,基于哈希表实现,而TreeMap则维护了...
GoDS(Go数据结构) Go中各种数据结构和算法的实现。 数据结构 货柜 所有数据结构都通过以下方法实现容器接口: type Container interface { Empty () bool Size () int Clear () Values () [] interface {} ...
ava基础 基础知识 面向对象基础 Java基本数据类型 string和包装类 final关键字特性 Java类和包 抽象类和接口 ...Java集合详解7:HashSet,TreeSet与LinkedHashSet Java集合详解8:Java集合类细节精讲 JavaWeb
TreeSet内部通过红黑树算法对元素进行排序,可以按照自然排序(实现了Comparable接口的类)或者构造TreeSet时传入的Comparator接口实现来排序。 Map接口是一组键值对映射的数据结构,每个键映射到一个值。Map接口...
HashSet:如果没有任何排序要求,用HashSet,因为效率高 TreeSet: 如果有排序要求用TreeSet, 如果是自然排序,需要元素实现Comparable接口,重写compareTo方法 如果是定制排序,需要创建TreeSet对象的时候,传入...
HashSet 和 TreeSet 有什么区别? HashMap 和 TreeMap 有什么区别? 什么是迭代器?如何使用它来遍历集合? 什么是 fail-fast 机制? 如何使用 Collections 类对集合进行排序? 什么是 Comparable 和 Comparator ...
TreeSet内部实现为红黑树,保证元素排序,可以按照自然顺序或自定义比较器进行排序。 Map接口则用于存储键值对,常见的实现有HashMap、LinkedHashMap和TreeMap。HashMap提供了高效的查找和插入,但不保证键值对的...