HashSet
构造函数
HashSet类的构造函数主要用的有四个,其中有两个实现是Collection接口的
- public HashSet()
构造一个新的空集合,具有默认的初始容量16和默认的负载因子0.75。 - public HashSet(Collection<? extends E> c)
构造一个包含指定集合中的元素的新集合 - public HashSet(int initialCapacity)
构造一个新的空集合,具有指定的初始容量和默认的负载因子(0.75)。 - public HashSet(int initialCapacity, float loadFactor)
构造一个新的空集合,具有指定的初始容量和指定的负载因子。
HashSet这里除了之前在ArrayList中接触过的初始容量之外还多加了一个负载因子的概念。
特点
- 不保证元素顺序(无序且不可控)
- 不允许存储重复元素
- 允许使用null元素,但最多一个
我们来通过一个例子来看看HashSet和ArrayList的区别
HashSet<String> hashSet1 = new HashSet<String>();
ArrayList<String> arrayList1 = new ArrayList<String>();
arrayList1.add("c");
arrayList1.add("b");
arrayList1.add("a");
arrayList1.add("a");
arrayList1.add("b");
arrayList1.add("e");
System.out.println(arrayList1);
hashSet1.add("c");
hashSet1.add("b");
hashSet1.add("a");
hashSet1.add("a");
hashSet1.add("b");
hashSet1.add("e");
System.out.println(hashSet1);
输出:
[c, b, a, a, b, e]
[a, b, c, e]
可以看到HashSet和ArrayList的区别在于,ArrayList可以存放重复元素,且元素顺序和加入顺序相同,而HashSet不存储重复的元素且不保证元素顺序和加入顺序相同。而且在调用HashSet方法的时候,你会发现HashSet的方法相比于ArrayList的方法少很多,少的这些方法都是和索引有关的方法,因为HashSet无索引这个概念。
HashSet这个集合用哈希表实现的(实际上在源码中实现HashSet是用HashMap)
常用方法
HashSet和TreeSet常用的方法就是Collection接口中提供的方法
遍历
HashSet集合没有索引,所以无法使用普通形式for循环来进行遍历,所以在遍历时需要使用foreach循环和迭代器的方式来完成遍历
for (String s : hashSet1) {
System.out.println(s);
}
Iterator<String> it = hashSet1.iterator();
while (it.hasNext()) {
System.out.println(it.next());
}
TreeSet
构造函数
- public TreeSet()
默认构造函数。使用该构造函数,TreeSet中的元素按照自然排序顺序进行排列 - public TreeSet(SortedSet set)
创建一个set的TreeSet集合 - public TreeSet(Collection<? extends E> collection)
创建一个包含collection的TreeSet集合 - public TreeSet(Comparator<? super E> comparator)
指定TreeSet的比较器
特点
- 可控的有序(自然顺序和自定义顺序)
- 不允许元素重复
- 不能存null
TreeSet是以类似二叉树的方式存储的,它的有序是在添加的时候就知道这个数据要添加到那个位置,这个判断大小是用compareTo方法决定的。