您的位置:首页 > 编程语言 > Java开发

疯狂JAVA讲义---第七章(上):集合set(转)

2014-04-18 11:07 225 查看
集合是j2se中非常重要的一部分

我先列些基础操作:foreach遍历集合

public class TestForeach
{
    public static void main(String[] args) 
    {
        //创建一个集合
        Collection books = new HashSet();
        books.add(new String("轻量级J2EE企业应用实战"));
        books.add(new String("Struts2权威指南"));
        books.add(new String("基于J2EE的Ajax宝典"));
        for (Object obj : books)
        {
            String book = (String)obj;
            System.out.println(book);
            if (book.equals("Struts2权威指南"))
            {
                //下面代码会引发ConcurrentModificationException异常

                books.remove(book);
            }
        }
        System.out.println(books);
    }
}

现在开始正式讲集合,先讲set中最重要的HashSet

集合HashSet的重点是要学会重写其equals和hashcode的方法

注意:应该尽量保证两个对象通过equals比较返回true,他们的hashcode返回也相等。

大家可以通过下面的代码来体会其中的奥秘,eg

class A
{
    public boolean equals(Object obj)
    {
        return true;
    }
}
//类B的hashCode()方法总是返回1,但没有重写其equals()方法
class B
{
    public int hashCode()
    {
        return 1;
    }
}
//类C的hashCode()方法总是返回2,但没有重写其equals()方法
class C
{
    public int hashCode()
    {
        return 2;
    }
    public boolean equals(Object obj)
    {
        return true;
    }
}
public class TestHashSet
{
    public static void main(String[] args) 
    {
        HashSet books = new HashSet();
        //分别向books集合中添加2个A对象,2个B对象,2个C对象
        books.add(new A());
        books.add(new A());
        books.add(new B());
        books.add(new B());
        books.add(new C());
        books.add(new C());
        System.out.println(books);
    }
}

HashSet最主要的优点是快。

然后讲下LinkedHashSet,他的优点是按照插入顺序排列,速度略慢,eg



public class TestLinkedHashSet
{
    public static void main(String[] args) 
    {
        LinkedHashSet books = new LinkedHashSet();
        books.add("Struts2权威指南");
        books.add("轻量级J2EE企业应用实战");
        //删除 Struts2权威指南
        books.remove("Struts2权威指南");
        //重新添加 Struts2权威指南
        books.add("Struts2权威指南");
        System.out.println(books);
    }
}

TreeSet具体原理用到了红黑树http://baike.baidu.com/view/133754.htm比较复杂

主要TreeSet会调用对象的compareTo进行元素比较,

自然排序(根据集合元素的大小,将他们以升序排列)eg

class Z implements Comparable
{
    int age;
    public Z(int age)
    {
        this.age = age;
    }
    public boolean equals(Object obj)
    {
        return false;
    }
    public int compareTo(Object obj)
    {
        return 1;
    }
}
public class TestTreeSet
{
    public static void main(String[] args) 
    {
        TreeSet set = new TreeSet();
        Z z1 = new Z(6);
        set.add(z1);
        System.out.println(set.add(z1));
        //下面输出set集合,将看到有2个元素
        System.out.println(set);
        //修改set集合的第一个元素的age属性
        ((Z)(set.first())).age = 9;
        //输出set集合的最后一个元素的age属性,将看到也变成了9
        System.out.println(((Z)(set.last())).age);
    }
}

定制排序:eg

class M
{
    int age;
    public M(int age)
    {
        this.age = age;
    }
}
class N
{
    int age;
    public N(int age)
    {
        this.age = age;
    }
}
public class TestTreeSet3
{
    public static void main(String[] args) 
    {
        TreeSet ts = new TreeSet(new Comparator()
        {
            public int compare(Object o1, Object o2)
            {
                int age1 = o1 instanceof M ? ((M)o1).age :((N)o1).age;
                int age2 = o1 instanceof M ? ((M)o2).age :((N)o2).age;
                return age1 - age2;

                /*
                M m1 = (M)o1;
                M m2 = (M)o2;

                if (m1.age > m2.age)
                {
                    return -1;
                }
                else if (m1.age == m2.age)
                {
                    return 0;
                }
                else
                {
                    return 1;
                }
                */
            }
        }); 
        ts.add(new M(5));
        ts.add(new M(-3));
        ts.add(new N(9));
        System.out.println(ts);
    }
}

最后讲下EnumSet,这个是专为枚举类准备(具体知识请看我前几天的博客)这里我就举了例子,eg

enum Season
{
    SPRING,SUMMER,FALL,WINTER
}
public class EnumSetDemo
{
    public static void main(String[] args) 
    {
        //创建一个EnumSet集合,集合元素就是Season枚举类的全部枚举值
        EnumSet es1 = EnumSet.allOf(Season.class);
        //输出[SPRING,SUMMER,FALL,WINTER]
        System.out.println(es1);
        //创建一个EnumSet空集合,指定其集合元素是Season类的枚举值。
        EnumSet es2 = EnumSet.noneOf(Season.class); 
        //输出[]
        System.out.println(es2);
        //手动添加两个元素
        es2.add(Season.WINTER);
        es2.add(Season.SPRING);
        //输出[SPRING,WINTER]
        System.out.println(es2);
        //以指定枚举值创建EnumSet集合
        EnumSet es3 = EnumSet.of(Season.SUMMER  , Season.WINTER); 
        //输出[SUMMER,WINTER]
        System.out.println(es3);
        EnumSet es4 = EnumSet.range(Season.SUMMER  , Season.WINTER); 
        //输出[SUMMER,FALL,WINTER]
        System.out.println(es4);
        //新创建的EnumSet集合的元素和es4集合的元素有相同类型,
        //es5的集合元素 + es4集合元素 = Season枚举类的全部枚举值
        EnumSet es5 = EnumSet.complementOf(es4); 
        //输出[SPRING]
        System.out.println(es5);
    }
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  java 集合 set