Set是java中一个不包含重复元素的collection。更正式地说,set 不包含满足 e1.equals(e2) 的元素对 e1e2,并且最多包含一个 null 元素。正如其名称所暗示的,此接口模仿了数学上的 set 抽象。

HashSet与TreeSet都是基于Set接口的实现类。其中TreeSet是Set的子接口SortedSet的实现类。Set接口及其子接口、实现类的结构如下所示:

|——SortedSet接口——TreeSet实现类

Set接口——|——HashSet实现类

|——LinkedHashSet实现类

HashSet实现Set 接口,由哈希表(实际上是一个 HashMap 实例)支持。它不保证集合的迭代顺序;特别是它不保证该顺序恒久不变。此类允许使用 null 元素。HashSet为基本操作提供了稳定性能,这些基本操作包括 add、remove、contains 和 size,假定哈希函数将这些元素正确地分布在桶中。对此集合进行迭代所需的时间与 HashSet 实例的大小(元素的数量)和底层 HashMap 实例(桶的数量)的“容量”的和成比例。因此,如果迭代性能很重要,则不要将初始容量设置得太高(或将加载因子设置得太低)。HashSet的实现是不同步的。如果多个线程同时访问一个集合,而其中至少一个线程修改了该集合,那么它必须 保持外部同步。

当需要向HashSet中放置元素时,应该为要存放到散列表的各个对象定义hashCode()和equals();

例如:

package com.test.www;
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());
}
}
} class Student
// HashSet要重写hashCode和equals方法
{
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接口的比较器对象.

例如:

 
package com.test.www;
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,就这么简单。

TreeSet类型是J2SE中唯一可实现自动排序的类型,用法如下:

 
package com.test.www;
import java.util.Comparator; public class MyComparator<T> implements Comparator<T>
{ public int compare(T arg0, T arg1)
{
if (arg0.equals(arg1))
{
return 0;
}
return ((Comparable<T>) arg0).compareTo(arg1) * -1;
} }
 
package com.test.www;
import java.util.Iterator;
import java.util.TreeSet; public class TreeSetTest
{ /** */
/** * @param args */
public static void main(String[] args)
{ MyComparator<String> myComparator = new MyComparator<String>(); // -------------不添加自定义排序 -------------
TreeSet<String> treeSet1 = new TreeSet<String>();
treeSet1.add("c");
treeSet1.add("a");
treeSet1.add("b"); Iterator<String> iterator1 = treeSet1.iterator();
while (iterator1.hasNext())
{
System.out.println(iterator1.next());
} // -------------添加自定义排序-----------------
TreeSet<String> treeSet2 = new TreeSet<String>(myComparator);
treeSet2.add("c");
treeSet2.add("a");
treeSet2.add("b"); Iterator<String> iterator2 = treeSet2.iterator();
while (iterator2.hasNext())
{
System.out.println(iterator2.next());
}
} }

运行结果:

a

b

c

c

b

a

HashSet和TreeSet 的区别与分析的更多相关文章

  1. hashset和treeset的区别

    hashset 和 treeset的区别 hashset 和 treeset的区别 1.TreeSet 是二差树实现的,Treeset中的数据是自动排好序的,不允许放入null值. 2.HashSet ...

  2. HashSet,LinkedHashSet,TreeSet的区别

    Set接口Set不允许包含相同的元素,如果试图把两个相同元素加入同一个集合中,add方法返回false.Set判断两个对象相同不是使用==运算符,而是根据equals方法.也就是说,只要两个对象用eq ...

  3. linkedhashSet和hashSet和TreeSet的区别(转)

    Set接口Set不允许包含相同的元素,如果试图把两个相同元素加入同一个集合中,add方法返回false.Set判断两个对象相同不是使用==运算符,而是根据equals方法.也就是说,只要两个对象用eq ...

  4. 安卓 ArrayList,LinkedList,HashSet,Vector,TreeSet的区别和使用

    java的集合就那么几种 总体为:List,Set,Map (都是接口由其子类去实现具体的方法) ArrayList,LinkedList,Vector都属于List List:元素是有顺序的,元素可 ...

  5. Java——HashSet和TreeSet的区别

    HashSetHashSet有以下特点 不能保证元素的排列顺序,顺序有可能发生变化 不是同步的 集合元素可以是null,但只能放入一个null当向HashSet集合中存入一个元素时,HashSe ...

  6. HashSet与TreeSet的区别

    HashSet元素唯一,无序,依靠hashcode(),toString()实现元素的唯一性 TreeSet元素唯一,有序,依靠bTo实现比较,即继承Comparable类并重写compareTo(O ...

  7. HashSet 与TreeSet和LinkedHashSet的区别

    Set接口      Set不允许包含相同的元素,如果试图把两个相同元素加入同一个集合中,add方法返回false.      Set判断两个对象相同不是使用==运算符,而是根据equals方法.也就 ...

  8. 【java提高】---HashSet 与TreeSet和LinkedHashSet的区别

    HashSet 与TreeSet和LinkedHashSet的区别 今天项目开发,需要通过两个条件去查询数据库数据,同时只要满足一个条件就可以取出这个对象.所以通过取出的数据肯定会有重复,所以要去掉重 ...

  9. HashSet,TreeSet和LinkedHashSet的区别

    1. Set接口 Set不允许包含相同的元素,如果试图把两个相同元素加入同一个集合中,add方法返回false. Set判断两个对象相同不是使用==运算符,而是根据equals方法.也就是说,只要两个 ...

随机推荐

  1. Ionic在windows下的环境配置难题

    具体的配置方法网上有很多,可以参考http://my.oschina.net/JeeChou/blog/219699?fromerr=k1hPtBUs,但问题还是会有,我总结的主要有以下几个方面: 1 ...

  2. CodeForces757A

    A. Gotta Catch Em' All! time limit per test 1 second memory limit per test 256 megabytes input stand ...

  3. WebForm 控件(一)、连接数据库

    一.控件 [简单控件] (一)文字显示 1.Label → 在html中相当于span  <asp:Label ID="控件名 runat="server" Tex ...

  4. Import Statements 导入语句

    Syntax of an Import Statement 导入语句的语法 An import statement allows clients to tell the engine which mo ...

  5. 导入AS项目出现类文件全部报红色J 原因

    大家可能遇到过这么一个问题  就是用androidStudio 导入一个新的demo的时候会出现下图的字样 看了是不是很懵逼 我当时看了也是一脸懵逼 这是什么玩意啊.也不报错.也不提示哪里错了 后来我 ...

  6. BZOJ 3391: [Usaco2004 Dec]Tree Cutting网络破坏(搜索)

    这道直接遍历一遍求出每个点的子节点数目就行了= = CODE: #include<cstdio>#include<iostream>#include<algorithm& ...

  7. Windows内存管理简介:

    1:连续的内存空间分配: (1)单一连续分配:只能单作业,单任务运行: 分为系统和用户区:用户区是指除了系统需外左右的内存,由于单用户,单任务,要不都被占用,要不全空   (2):固定空间分配:固定分 ...

  8. ASP.NET Web API 基本操作(CRUD)

    上一篇介绍了ASP.NET Web API的基本知识和原理,这一篇我们通过一个更直观的实例,对产品进行CRUD操作(Create/Read/Update/Delete)来继续了解一下它的基本应用. 创 ...

  9. 【转】Nutch的Hadoop方式爬取效率优化

    原文地址:http://my.oschina.net/junfrank/blog/290404

  10. JSP-表单元素示例

    <%@ page language="java" pageEncoding="UTF-8"%><%@ page import="ja ...