1. 概述
Set 接口 是 Collection 和 IterAble 的一个子接口,List 集合中的 元素是没有顺序的,并且元素不可以重复。实现List接口 的容器类有 HashSet <E> 类,TreeSet <E> 类。
1.1 HashSet
HashSet 类,不允许出现重复元素;允许包含值为null的元素,但最多只能有一个;不保证集合中元素的顺序,HashSet在添加元素,会调用元素的hashCode()方法,获得该元素的哈希码,根据这个哈希码计算元素在集合中的存储位置,HashSet的查找效率比较高,和它这种存储方式有关;HashSet 类不同步。
HashSet类的 add() 方法实现如下所示:
public boolean add(E e) {return map.put(e, PRESENT)==null;}
map 和 PRESENT 是 HashSet 类 的成员变量。
private transient HashMap<E,Object> map;// Dummy value to associate with an Object in the backing Mapprivate static final Object PRESENT = new Object();
2. TreeSet
TreeSet类,继承了SortedSet<E>接口,TreeSet集合中元素按照元素的大小进行升序排序;TreeSet类不同步。
TreeSet类的 add() 方法实现如下所示:
public boolean add(E e) {return m.put(e, PRESENT)==null;}
m 和 PRESENT 是 HashSet 类 的成员变量。
private transient NavigableMap<E,Object> m;// Dummy value to associate with an Object in the backing Mapprivate static final Object PRESENT = new Object();
NavigableMap<K,V> 接口 继承 SortedMap<K,V> 接口。
public interface NavigableMap<K,V> extends SortedMap<K,V>
2. HashSet类 的具体使用
HashSet 的一些方法如下所示,全部方法请访问JDK8或JDK9。
修饰符和类型 | 方法 | 描述 |
boolean | add?(E e) | 如果指定的元素尚不存在,则将其添加到此集合中。 |
void | clear?() | 删除此集合中的所有元素。 |
Object | clone?() | 返回此HashSet 实例的浅拷贝。Java的浅拷贝和深拷贝学习,点击前往 |
boolean | contains?(Object o) | 如果此set包含指定的元素,则返回true,否则返回false。 |
boolean | isEmpty?() | 如果此set不包含任何元素,则返回true,否则返回false。 |
Iterator<E> | iterator?() | 返回此set中元素的迭代器。 |
boolean | remove?(Object o) | 如果存在,则从该集合中移除指定的元素。 |
int | size?() | 返回此集合中的元素数总数。 |
测试代码如下所示:
package set;import java.util.HashSet;
import java.util.Iterator;public class MySetStudy{public static void main(String args[]) {HashSet<String> hashSet = new HashSet<String>();hashSet.add("1");hashSet.add("3");hashSet.add("3");hashSet.add("2");hashSet.add("12");hashSet.add("6");Iterator iterator = hashSet.iterator();System.out.print("hashSet的数值: ");while (iterator.hasNext()) {System.out.print(iterator.next() + " ");}System.out.print("\nhashSet的hashCode值: ");iterator = hashSet.iterator();while (iterator.hasNext()) {System.out.print(iterator.next().hashCode() + " ");}HashSet hashSet1 = (HashSet) hashSet.clone();iterator = hashSet1.iterator();System.out.print("\nhashSet1的数值: ");while (iterator.hasNext()) {System.out.print(iterator.next() + " ");}}
}
运行截图如下所示,根据运行结果可得,HashSet是无序的,也不是根据hashCode值升序排序。
3. TreeSet类 的具体使用
TreeSet 的一些方法如下所示,全部方法请访问JDK8或JDK9。
修饰符和类型 | 方法 | 描述 |
boolean | add?(E e) | 如果指定的元素尚不存在,则将其添加到此集合中。 |
Object | clone?() | 返回此TreeSet 实例的浅拷贝。 |
E | first?() | 返回此set中当前的第一个(最低)元素。 |
E | floor?(E e) | 返回此set中小于或等于给定元素的最大元素,如果没有这样的元素返回null。 |
NavigableSet<E> | descendingSet?() | 返回此set中包含的元素的逆序视图。 |
SortedSet<E> | headSet?(E toElement) | 返回此set的部分视图,其元素严格小于toElement 。 |
NavigableSet<E> | headSet?(E toElement, boolean inclusive) | 返回此set的部分视图,其元素小于(或等于,如果inclusive 为true)toElement 。 |
E | higher?(E e) | 返回此集合中的最小元素严格大于给定元素,如果没有这样的元素返回null。 |
E | last?() | 返回此集合中当前的最后一个(最高)元素。 |
Iterator<E> | iterator?() | 以升序返回此集合中元素的迭代器。 |
E | lower?(E e) | 返回此集合中的最大元素严格小于给定元素,如果没有这样的元素返回null。 |
测试代码:
package set;import java.util.Iterator;
import java.util.Set;
import java.util.TreeSet;public class MySetStudy01 {public static void main(String args[]) {TreeSet<String> treeSet = new TreeSet<String>();treeSet.add("1");treeSet.add("3");treeSet.add("3");treeSet.add("2");treeSet.add("-1");treeSet.add("5");PrintTreeSet(treeSet);System.out.println(treeSet.first());System.out.println(treeSet.last());System.out.println(treeSet.floor("2"));System.out.println(treeSet.higher("2"));System.out.println(treeSet.lower("2"));TreeSet<String> treeSet1 = (TreeSet<String>) treeSet.descendingSet();PrintTreeSet(treeSet1);TreeSet<String> treeSet2 = (TreeSet<String>) treeSet.headSet("2");PrintTreeSet(treeSet2);TreeSet<String> treeSet3 = (TreeSet<String>) treeSet.headSet("2", true);PrintTreeSet(treeSet3);}public static void PrintTreeSet(Set set) {Iterator iterator = set.iterator();while (iterator.hasNext()) {System.out.print(iterator.next() + " ");}System.out.println();}
}
运行截图如下所示:
END~