Java Set集合

来源:互联网 发布:五毛特效app软件 编辑:程序博客网 时间:2024/05/16 11:50

Java Set集合

Set是Collection的子接口,Set集合中的元素是无序,无重复的,如果试图把两个相同的元素加入到同一个Set集合中,则添加操作会失败,add()方法返回false;HashSet,TreeSet,LinkedHashSet是Set集合最常见的三个实现类。下面来看下它们具体的用法

HashSet类

HashSet是Set接口的典型实现,它是按Hash算法来存储集合中的元素,具有很好的存取和查找功能。HashSet具有以下的特点:

  1. 集合中的元素是无序的
  2. 不是线程安全的
  3. 集合中的元素可以为null,但只能有一个,得保证元素的不重复

当向HashSet集合中存入一个元素时,会先调用该对象的hashCode()方法得到hashCode值,然后根据该值决定该对象在集合中存储的位置。如果两个元素通过equals()方法返回true,但它们的hashCode值不相等,它们将会存储在不同的位置上。所以HashSet判断两个元素是否相等是两个对象equals()方法比较相等,并且它们hashCode的值也相等。所以如果需要在HashSet集合中保存某个对象的时候重写这个类equals()和HashCode()方法的时候使它们的结果保持一致。

LinkedHashSet类

LinkedHashSet是HashSet的子类,它也是根据hashCode的值来决定元素存储位置的,但它同时使用链表维护元素的次序,所以LinkedHashSet集合里的元素是按照插入的顺序来存储元素的。集合中的元素不允许重复。

public class Test{public static void main(String[] args){LinkedHashSet lhs = new LinkedHashSet();lhs.add("hello");lhs.add("world");System.out.println(lhs);lhs.remove("hello");lhs.add("hello");System.out.println(lhs);}}

输出:

[hello, world][world, hello]

TreeSet类

TreeSet是SortedSet接口的实现类,TreeSet可以确保集合元素处于排序状态。

public class Test{public static void main(String[] args){TreeSet ts = new TreeSet();ts.add(1);ts.add(5);ts.add(4);ts.add(2);ts.add(3);System.out.println(ts);}}

输出:

[1, 2, 3, 4, 5]

从上面输出结果可以看出,TreeSet不是按照元素插入顺序进行排序的,而是根据 元素实际大小进行排序。TreeSet底层是采用红黑树数据结构拉存储集合元素,它支持两种排序方法:自然排序和定制排序,默认情况下采用自然排序。

自然排序

TreeSet调用集合元素的compareTo(Object obj)方法比较元素之间的大小,然后将元素按升序排列,这就是自然排序。
如果想将一个对象加入TreeSet集合,则该对象的类必须实现Comparable接口的compareTo(Object obj)方法,返回0则两个对象相等,返回负数则第一个对象小于第二个对象,返回正数则第一个对象大于第二个对象。否则程序将抛出异常。

建一个Student类:

public class Student implements Comparable{private String name;private int age;public Student(String name, int age){this.name = name;this.age = age;}public String getName(){return name;}public void setName(String name){this.name = name;}public int getAge(){return age;}public void setAge(int age){this.age = age;}@Overridepublic int compareTo(Object o){if (o == null){return 0;}if (o != null && o.getClass() == Student.class){Student student = (Student)o;return this.age > student.getAge() ? 1 : this.age < student.getAge() ? -1 : 0;}return 0;}@Overridepublic String toString(){StringBuilder builder = new StringBuilder();builder.append("Student [name=");builder.append(name);builder.append(", age=");builder.append(age);builder.append("]");return builder.toString();}}

测试类:

public class Test{public static void main(String[] args){TreeSet ts = new TreeSet();Student student1 = new Student("zhangsan", 12);Student student2 = new Student("lisi";, 16);ts.add(student1);ts.add(student2);System.out.println(ts);}}

输出:

[Student [name=zhangsan, age=12], Student [name=lisi, age=16]]

定制排序

集合中的元素排序的方式要实现定制 ,可以通过Comparator接口的int compara(T o1, T o2)方法来实现,同样该方法如果返回正数则o1大于o2,返回0则o1等于o2,返回负数则o1小于o2.需要在创建TreeSet集合对象时,提供一个Comparator对象。

Student类:

public class Student{private String name;private int age;public Student(String name, int age){this.name = name;this.age = age;}public String getName(){return name;}public void setName(String name){this.name = name;}public int getAge(){return age;}public void setAge(int age){this.age = age;}@Overridepublic String toString(){StringBuilder builder = new StringBuilder();builder.append("Student [name=");builder.append(name);builder.append(", age=");builder.append(age);builder.append("]");return builder.toString();}}

定制的排序规则:

public class MyComparator implements Comparator&lt;Student&gt;{@Overridepublic int compare(Student o1, Student o2){return o1.getAge() > o2.getAge() ? -1 : o1.getAge() < o2.getAge() ? 1 : 0;}}

测试类:

public class Test{public static void main(String[] args){TreeSet ts = new TreeSet(new MyComparator());Student student1 = new Student("zhangsan", 12);Student student2 = new Student("lisi", 16);ts.add(student1);ts.add(student2);System.out.println(ts);}}

输出结果:

[Student [name=lisi, age=16], Student [name=zhangsan, age=12]]
原创粉丝点击