当前位置: 代码迷 >> 综合 >> Java的Set集合(HashSet、TreeSet)学习
  详细解决方案

Java的Set集合(HashSet、TreeSet)学习

热度:71   发布时间:2023-12-26 13:07:01.0

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~

  相关解决方案