java、Set

来源:互联网 发布:win7加密文件夹,软件 编辑:程序博客网 时间:2024/06/02 06:29

HashSet

1、不能保证元素的排列顺序,顺序有可能发生变化
2、 HashSet 是哈希表实现的,HashSet中的数据是无 序的,可以放入null,但只能放入一个null(无重复)
3、当向HashSet集合中存入一个元素时,HashSet会调用该对象的hashCode()方法来得到该对象的hashCode值, 然后根据 hashCode值来决定该对象在HashSet中存储位置。如果这个位置上没有元素,它就可以直接存储在这个位置上,不用再进行任何比较了;如果这个位置上已经有元素了, 就调用它的equals方法与新元素进行比较,相同的话就不存了,不相同就散列其它的地址。

HashSet<Student> stu = new HashSet<Student>();    HashSet<Student> stu2 = new HashSet<Student>();    Student student1 = new Student("小斌",23);    Student student2 = new Student("小赵",21);    Student student3 = new Student("Tds",20);    Student student4 = new Student("黑有有",23);    Student student5 = new Student("helloword",20);    Student student6 = new Student("Jan",19);    stu.add(student1);    stu.add(student2);    stu.add(student3);    stu.add(student4);    stu.clear();    stu2.add(student5);    stu2.add(student6);    stu.addAll(stu2);    stu.removeAll(stu2);//把一个集合放到另外一个集合中    stu.containsAll(stu2);    Iterator<Student> integer = stu.iterator();    while(integer.hasNext()){        Student student = integer.next();        System.out.println("学生姓名:"+student.getUsername()+" 年龄:"+student.getAge());    }

TreeSet

TreeSet追加元素不允许是空的

//TreeSet默认是升序TreeSet<Integer> ts = new TreeSet<Integer>();    ts.add(10);    ts.add(8);    ts.add(5);    ts.add(1000);    ts.add(20);    ts.first();//排序好的第一个元素    ts.last();//排序好的最后一个元素    ts.lower(10);//排序好了之后,比10还小的,在10旁边的一个元素    ts.higher(10));//排序好了之后,比10还大的,在10旁边的一个元素    ts.subSet(10, 100);//返回大于10 小于100  排好序的一堆元素    ts.headSet(10);//小于10的所有排序好的元素    ts.tailSet(20);//大于等于20的所有排序好的元素    for (Integer integer : ts) {        System.out.print(integer+"  ");    }//TreeSet降序import java.util.Comparator;public class IntegerComparator implements Comparator<Integer>{    private boolean flag;    public IntegerComparator(boolean flag) {        this.flag = flag;    }    @Override    public int compare(Integer o1, Integer o2) {        if(o1>o2){            return flag?1:-1;        }else if (o1<o2) {            return flag?-1:1;        }else {            return 0;        }    }}import java.util.TreeSet;public class TreeSetDemo02 {    public static void main(String[] args) {        TreeSet<Integer> ts = new TreeSet<Integer>(new IntegerComparator(false));        ts.add(100);        ts.add(20);        ts.add(30);        ts.add(50);        ts.add(-30);        ts.add(-600);        ts.add(-100);        for (Integer integer : ts) {            System.out.print(integer+" ");        }    }}

LinkedHashSet

1、LinkedHashSet继承了HashSet集合,同样是根据元素的hashCode值来决定元素的存储位置,但是它同时使用链表维护元素的次序。
2、这样使得元素看起 来像是以插入顺序保存的,也就是说,当遍历该集合时候,LinkedHashSet将会以元素的添加顺序访问集合的元素。
3、LinkedHashSet在迭代访问Set中的全部元素时,性能比HashSet好,但是插入时性能稍微逊色于HashSet。

import java.util.LinkedHashSet;public class LinkedHashSetDemo {    public static void main(String[] args) {        LinkedHashSet<Integer> hashSet = new LinkedHashSet<Integer>();        hashSet.add(1);        hashSet.add(100);        hashSet.add(50);        hashSet.add(20);        hashSet.add(30);        hashSet.add(30);        for (Integer integer : hashSet) {            System.out.print(integer+" ");        }    }}

例子

public class Student{    private String username;    private int age;    public Student() {        // TODO Auto-generated constructor stub    }    public Student(String username,int age) {        this.username = username;        this.age = age;    }    public String getUsername() {        return username;    }    public void setUsername(String username) {        this.username = username;    }    public int getAge() {        return age;    }    public void setAge(int age) {        this.age = age;    }}import java.util.Comparator;import java.util.TreeSet;public class StudentCompare {    public static void main(String[] args) {    //用匿名内部类实现    TreeSet<Student> students = new TreeSet<Student>(new Comparator<Student>(){        @Override        public int compare(Student o1, Student o2) {            if(o1.getAge()>o2.getAge()){                return -1;            }else if (o1.getAge()<o2.getAge()) {                return 1;            }else {                return 0;            }        }    });    Student student = new Student("looker",25);    Student student2 = new Student("三哥",20);    Student student3 = new Student("易通",24);    Student student4 = new Student("大师兄",22);    Student student5 = new Student("小赵",20);    students.add(student);    students.add(student2);    students.add(student3);    students.add(student4);    students.add(student5);    for (Student stu : students) {        System.out.print(stu.getUsername()+" 年龄:"+stu.getAge());    }    }}

总结

1)HashSet    元素无序的,并且不能重复    线程不安全    hashSet是哈希表实现的 ,可以放入null,但是只能放入1null.    hashCode()方法来确定你要存放位置。如果这个位置上没有元素,他就可以直接存放在这个位置上。如果有元素了,就调用它的equals()方法与新元素进行比较。相同的话就不存放了,不想通就散列到其他位置。2)LinkedHashSet    同样根据元素的hashCode值来确定的元素位置。链表维护关系3)TreeSet    sortedSet接口的唯一实现类。保证元素处于排序状态    TreeSet是二叉树实现的。不可以放入null值。    应该使用Comparator接口,实现 int compare(T o1,T o2)方法    Collections.synchronizedList(new HashSet(Integer));    当我们多个线程访问集合并且超过一个线程修改了这个集合对象,就必须手动方式保证set集合同步
原创粉丝点击