Java Set

Java Set教程

List 集合类似,Set 集合也是 Collection 集合 的子接口,它与 List 的不同点就是 Set 接口里面不允许保存重复的元素。它有 HashSet、TreeSet 等常用的子类。

Java HashSet类

HashSet 是 set 的一个子类,它里面不能存放重复元素,存放的是散列存储方式,没有顺序。

案例

package com.haicoder.net.array; import java.util.HashSet; import java.util.Set; public class SetTest { public static void main(String[] args) { System.out.println("嗨客网(www.haicoder.net)"); Set<String> allSet = new HashSet<String>(); allSet.add("嗨客网"); allSet.add("www.haicoder.net"); allSet.add("愿你承办一百年"); allSet.add("嗨客网"); System.out.println("运行结果:" + allSet); System.out.println("调用 contains 方法 : " + allSet.contains("嗨客网")); System.out.println("调用 contains 方法 : " + allSet.contains("嗨客")); } }

运行结果如下

05 HashSet.png

我们可以看到,运行的结果打印出来的顺序和添加的顺序是不一致的,Collection 里面包含的函数,在 Set 里面也可以执行。

Java TreeSet类

与 HashSet 不同的是,TreeSet 是有序的。但是存放在 TreeSet 里面的对象必须要实现 Comparable 接口,实现里面的 compareTo 方法。这样的话,在插入到 TreeSet 集合里面的时候就根据 compareTo 的结果进行排序。

定义一个 Person 类,它实现了 Comparable 接口,按照年龄进行生序

package com.haicoder.net.array; public class Person implements Comparable<Person> { public Person() { } public Person(Integer age, String name) { this.age = age; this.name = name; } private Integer age; private String name; public Integer getAge() { return age; } public void setAge(Integer age) { this.age = age; } public String getName() { return name; } public void setName(String name) { this.name = name; } @Override public int compareTo(Person person) { if (this.age >= person.getAge()) { return 1; } else if (this.age < person.getAge()) { return -1; } else { return 0; } } @Override public String toString() { return "Person{" + "age=" + age + ", name='" + name + '\'' + '}'; } }

定义一个测试类

package com.haicoder.net.array; import java.util.Set; import java.util.TreeSet; public class TreeSetTest { public static void main(String[] args) { System.out.println("嗨客网(www.haicoder.net)"); Set<Person> treeSet = new TreeSet<>(); treeSet.add(new Person(20, "嗨客网")); treeSet.add(new Person(22, "嗨")); treeSet.add(new Person(23, "客")); treeSet.add(new Person(20, "网")); treeSet.add(new Person(19, "嗨客")); treeSet.add(new Person(19, "嗨客")); System.out.println(treeSet); } }

运行结果如下:

06 treeSet.png

我们可以看到,Person 类实现了 Comparable 接口,并且重写了 compareTo 方法,按照年龄来进行生序。但是我们认为应该相等的两个对象,名字是 “嗨客” 年龄都是 19 岁的数据打印了两遍,这是为什么呢?

怎么样判断两个元素是否相等呢?Java 语言中判断两个对象是否相等,用到了 equals 方法和 hashCode 方法。

Java Set总结

Set 中的操作大多数与 List 相似,Set 里面的元素是不能重复的,它以散列的方式存储,List 在执行 contains 方法的时候,会从集合头开始往后遍历,依次判断元素是否相等,而 set 这边在判断元素是否存在的时候,会获取元素的 hash 值,然后判断在制定位置上是否有该元素。

从而可以看出 Set 集合判断元素是否存在比 List 集合的速度要快。