java从零开始系列(十一)集合:Set集合

luoyjx · 2015-02-17 22:16 · 1049次阅读

Set

  • Set继承于Collection
  • 由于其不允许元素重复
  • 没有顺序概念

相对于Collection无需扩展方法,限制add类方法不要放入重复元素就可以(set判断两个对象是否相等的标准是两个对象通过equals方法比较相等,并且两个对象的hashCode()方法返回值相同)。

由于Set只是接口,实例化的时候需要使用Set的实现类。

  • EnumSet  
  • HashSet 
  • LinkedHashSet
  • TreeSet

LinkedHashSet 从名字来看,是实现了链表的数据结构。

链表的特点,插入删除时的效率比较高,但是遍历的效率比较低。

TreeSet 是体现了元素排序的数据结构。

import java.util.Iterator;
import java.util.*;

public class TreeSetTest {
    public static void main(String[] args) {
        Set ts = new TreeSet();
        ts.add("abc");
        ts.add("xyz");
        ts.add("rst");
        Iterator it = ts.iterator();
        while (it.hasNext()) {
            System.out.println(it.next());
        }
    }
}

输出:
abc
rst
xyz

可见输出顺序是经过了排序的。

原因:

    String类是实现了Comparable接口

所以如果要添加按自己的规则排序的实体实现Comparable接口并实现其中的 compareTo方法 。

import java.util.Iterator;
import java.util.*;

public class TreeSetTest {
    public static void main(String[] args) {
        Set ts = new TreeSet();
        ts.add(new Teacher("zhangsan", 1));
        ts.add(new Teacher("lisi", 2));
        ts.add(new Teacher("wangmazi", 3));
        ts.add(new Teacher("mazi", 3));
        Iterator it = ts.iterator();
        while (it.hasNext()) {
            System.out.println(it.next());
        }
    }
}


class Teacher implements Comparable {
    int num;
    String name;

    Teacher(String name, int num) {
        this.num = num;
        this.name = name;
    }

    public String toString() {
        return "学好" + num + "姓名" + name;
    }

    public int compareTo(Object o) {
        Teacher ss = (Teacher) o;
        int result = num > ss.num ? 1 : (num == ss.num ? 0 : -1);
        if (result == 0) {
            result = name.compareTo(ss.name);
        }
        return result;
    }
}

性能比较  HashSet > LinkedHashSet > TreeSet

但是如果从遍历效率来考虑的话可能顺序会反过来。

像数组一样连续的数据结构在遍历上更有优势。

迭代(说白了就是把所有元素拿出来做一次某种操作)

集合通常遇到的场景就是迭代。

而Set集合不支持直接通过下标或者foreach****循环来迭代。

而是通过iterator方法返回一个Iterator迭代器类型,再通过while循环来迭代。

public class TestSet {
	public static void main(String[] args) {
		Set set = new HashSet();
		
		set.add(new String("11"));
		set.add(new String("222"));
		
		Iterator i = set.iterator();//先迭代出来
		
		while(i.hasNext()){//遍历
			System.out.println(i.next());
		}
		
	}
}

回顾本节:

    1.Set接口以及一些实现类的比较。

    2.Set迭代方法。

收藏

暂无评论

登录后可以进行评论。没有账号?马上注册