Set集合及其实现类

Set接口有2个子类,HashSet类和TreeSet类,要使用Set集合,通常情况下需要声明为Set类型,然后通过Set接口类来实例化,Set接口的实现类常用HashSet和TreeSet类
Set set=new HashSet();
Set set=new TreeSet();

HashSet类:
Java.util.HashSet类实现Java.util.Set接口。
它不允许出现重复元素,不保证集合中的元素的顺序,允许包含值为null的元素,但最多只能有null元素

HashSet类直接实现Set接口,其底层其实是包装了一个HashMap去实现的。HashSet采用HashCode算法来存取集合中的元素,因此具有比较好的读取和查找功能。

public class TestHashSet
{
    public static void main(String [] args)
    {
       HashSet h=new HashSet();
       h.add("1st");
       h.add("2nd");
       h.add(new Integer(3));
       h.add(new Double(4.0));
       h.add("2nd");            //重复元素,未被添加
       h.add(new Integer(3));      //重复元素,未被添加
       h.add(new Date());
       System.out.println("开始:size="+h.size());
       Iterator it=h.iterator();
       while(it.hasNext())
       {
           Object o=it.next();
           System.out.println(o);
       }

       h.remove("2nd");
       System.out.println("移除元素后:size="+h.size());
       System.out.println(h);
    }
}

TreeSet
描述的是Set的一种变体——可以实现排序等功能的集合,它在将对象元素添加到集合中会自动按照某种比较规则将其插入到有序的对象序列中,并保证该集合元素组成的读序列按照升序排列。
TreeSet实现了SortedSet接口,顾名思义是一种排序的Set集合,查看JDK源码发现底层使用TreeMap实现的,本质上是一个红黑树原理。正因为它是排序了的,所以相对于HashSet来说,TreeSet提供了一些额外的按排序位置访问元素的方法,例如first(),lower(),subSet(),headSet(),tailSet()。

TreeSet的排序分为两种类型,一种是自然排序,另一种是定制排序。
通过实现Comparable接口(compareTo(Object o)),和Comparator接口(compare(x,y))

Comparable接口的,它返回整数类型,对于表达式x.compareTo(y),如果返回值为0,表示x和y相等,如果返回值大于0,表示x大于y,如果小于0,表示x TreeSet调用对象的compareTo()方法比较集合中对象的大小,然后进行升序排序,这种方式称为自然排序.

java.util.Comparator接口用于指定具体的排序方式,它有个compare(Object obj1,Object obj2),用于比较两个对象的大小.

当表达式compare(x,y)的值大于0,表示x大于y,小于0,表示x小于y,等于0,表示x等于y,如果想让TreeSet进按照Customer对象的 name属性进行降序排列,可以先创建实现Comparator接口的类

public class TestTreeSet
{
    public static void main(String [] args)
    {
       TreeSet ts=new TreeSet();
       ts.add("orange");
       ts.add("apple");
       ts.add("banana");
       ts.add("grape");

       Iterator it=ts.iterator();
       while(it.hasNext())
       {
           String fruit=(String)it.next();
           System.out.println(fruit);
       }
    }

参考博客:http://blog.163.com/asd_wll/blog/static/210310402010112833332260/

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值