目录
TreeSet
介绍:避免重复元素以及对元素进行排序,非线程安全
1、特性
- 元素唯一
- 不保留插入顺序
- 元素升序排序
- 非线程安全
2、通过构造方法自定义排序规则
Set<String> treeSet = new TreeSet<>(Comparator.comparing(String::length));
3、通过包装达到线程安全
Set<String> syncTreeSet = Collections.synchronizedSet(treeSet);
4、TreeSet 迭代
通过iterator迭代器,直接通过集合修改元素会抛出ConcurrentModificationException ,而通过迭代则不会
会抛异常
@Test(expected = ConcurrentModificationException.class)
public void whenModifyingTreeSetWhileIterating_shouldThrowException() {
Set<String> treeSet = new TreeSet<>();
treeSet.add("First");
treeSet.add("Second");
treeSet.add("Third");
Iterator<String> itr = treeSet.iterator();
while (itr.hasNext()) {
itr.next();
treeSet.remove("Second");
}
}
不会抛异常
@Test
public void whenRemovingElementUsingIterator_shouldRemoveElement() {
Set<String> treeSet = new TreeSet<>();
treeSet.add("First");
treeSet.add("Second");
treeSet.add("Third");
Iterator<String> itr = treeSet.iterator();
while (itr.hasNext()) {
String element = itr.next();
if (element.equals("Second"))
itr.remove();
}
assertEquals(2, treeSet.size());
}
5、关于是否可以保存null 元素
java7之前是可以的,后面则不可以
HashSet
1、特性:
- 元素唯一性且允许null值
- 由HashMap支持
- 非线程安全
2、迭代异常同TreeSet
3、性能
HashSet的性能主要是受两个因素的影响,一个事初始化容量一个是加载因子
默认初始化容量为16,默认加载因子为0.75
如果初始容量太小会降低空间复杂性,但同样会增大hash的频率,增大开销
如果初始容量太大则会增加迭代成本和初始内存消耗
所以有个规则就是
1、对于大条目数据增大初始容量,则几乎不需要迭代
2、对于小条目数据减少初始容量, 降低迭代次数