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. Javascript之深入浅出prototype

    我们先来讲一个故事,一个大大的池塘,里面有很多鱼.这是属于我们大家的池塘所以里面的鱼我们都可以吃,但是我们也会从集市买一些鱼放在家里,那么放在家里的鱼肯定是属于我们私人的,外人是不会拥有的.那么在js ...

  2. Extjs学习笔记之九 数据模型(上)-extjs

    来源:niutuku.com | vincent上传于2012-07-20 | 1802次浏览 | 0条评论 本文开始进入Extjs最核心最优秀的部分. 标签:Extjs 数据模型   Extjs的数 ...

  3. JS 与 OC

    做项目需要从网页点击跳转到app的一个页面上,并且需要获取参数. 当时后台给写的参数是这样的.自己打开浏览器看的源码 JavaScript:window.location.href=   这句话在js ...

  4. UICollectionView 很简单的写个瀑布流

    你项目中要用到它吗? 可能会在你的项目中用到这玩意,最近也是要用就简单的写了一个 Demo.没多少代码,就不放Git了,下面会详细点的说说代码的,要还有什么问题的小伙伴可以直接Q我,也可以把Demo发 ...

  5. 使用ViewPagerAdapter 页面引导适配器设置app启动页,引导页面的实现

    一般的app第一次安装启动的时候,都会有一个启动页面和引导页的画面,然后才进入主程序.anndroid中的ViewPagerAdapter 是一个继承与PageAdapter的 页面引导适配器.由于我 ...

  6. kali linux live(persistence)+PE+windows7安装多启动菜单优盘制作

    需要以下工具: 下载链接: 一.制作kali linux persistence 将32GU盘格式化为FAT32格式,使用win32diskimager将kalilinux镜像写入优盘,占用优盘3.4 ...

  7. Java LinkedList特有方法程序小解 && 使用LinkedList 模拟一个堆栈或者队列数据结构。

    package Collection; import java.util.LinkedList; /* LinkedList:特有的方法 addFirst()/addLast(); getFirst( ...

  8. 对Unity注入技术最简单的理解和应用

    Unity注入技术,我决定最大的作用在于一个项目,尤其是WEB项目在更远其中一个类时,不需要重新生成,直接通过WEBCONFIG文件的修改就可以更改对应关系和功能,实验步骤如下: 1:新建一个接口IS ...

  9. C# 图片平移及缩放

    1.图片平移 Monitor.rar 在CSDN上下载,是个有地图编辑功能. http://download.csdn.net/detail/gxingmin/883699 2.图片缩放 http:/ ...

  10. iOS开发学习路径的一些建议

    结合自己情况聊下iOS学习建议,这里不讲大道理,说说具体怎么做.欢迎大家拍砖. 1.第一点要求 ,能比较顺畅的阅读官方的文档 如果你连官方的文档读起来都非常困难,那你还谈什么提高和进阶,咱们学习iOS ...