Set 接口总结
特点:
1,数据不允许有重复
2,最多可存储一个null值
主要提供的方法:
add(E e):如果set中未存在指定元素,则添加此元素;
addAll():如果set没有collection中的所有元素,则添加到此set中;
clear():移除set中的所有元素;
contains(Object o):如果set中含有该元素返回true,否则返回false;
containsAll():如果set中含有collection中所有元素返回true,否则返回false;
equals(Object o):比较指定对象与set的相等性;
hashCode():返回hash值;
isEmpty():如果set中有元素就返回true,否则返回false;
iterator():返回在此Set上元素迭代的迭代器;
remove(object o):移除set中指定的元素;
removeAll():移除set中collection中包含的元素;
retainAll():仅保留set中collection中含有的元素;
size():返回set中元素的个数;
toArray():返回包含set中所有元素的一个数组;
toArray(T[ ] a):返回包含set中所有元素的一个数组,其数据类型为指定的数据类型;
实现类:
HashSet:
特点:
1,不能保证数据有序
HashSet<String> hashSet=new HashSet();
hashSet.add("我");
hashSet.add("爱");
hashSet.add("学");
hashSet.add("习");
Iterator<String> iterator =hashSet.iterator();
while (iterator.hasNext()){
System.out.println(iterator.next());
}
输出结果:
2,元素不能重复
HashSet<String> hashSet = new HashSet();
hashSet.add("我");
hashSet.add("我");
hashSet.add("爱");
hashSet.add("学");
hashSet.add("习");
Iterator<String> iterator = hashSet.iterator();
while (iterator.hasNext()) {
System.out.println(iterator.next());
}
}
输出结果:
3,可以存储null值
HashSet<String> hashSet = new HashSet();
hashSet.add("我");
hashSet.add(null);
hashSet.add("爱");
hashSet.add("学");
hashSet.add("习");
Iterator<String> iterator = hashSet.iterator();
while (iterator.hasNext()) {
System.out.println(iterator.next());
}
}
输出结果
属性
//map属性是存储数据的,是HashMap类型的数据
private transient HashMap<E,Object> map;
//PRESENT属性,
private static final Object PRESENT = new Object();
HashSet底层实现是基于HashMap来实现的,将set中存储的值作为HashMap的key来处理,PRESENT是一个填充的value值
构造函数
public HashSet() {
map = new HashMap<>();
}
public HashSet(Collection<? extends E> c) {
map = new HashMap<>(Math.max((int) (c.size()/.75f) + 1, 16));
addAll(c);
}
public HashSet(int initialCapacity, float loadFactor) {
map = new HashMap<>(initialCapacity, loadFactor);
}
public HashSet(int initialCapacity) {
map = new HashMap<>(initialCapacity);
}
LinkedHashSet:
特点:
1,数据有序:
LinkedHashSet<Integer> linkedHashSet = new LinkedHashSet<>();
linkedHashSet.add(1);
linkedHashSet.add(5);
linkedHashSet.add(10);
linkedHashSet.add(8);
linkedHashSet.add(9);
final Iterator<Integer> iterator = linkedHashSet.iterator();
while (iterator.hasNext()){
System.out.println(iterator.next());
}
运行结果:
2,可以存储null值
LinkedHashSet<Integer> linkedHashSet = new LinkedHashSet<>();
linkedHashSet.add(null);
final Iterator<Integer> iterator = linkedHashSet.iterator();
while (iterator.hasNext()){
System.out.println(iterator.next());
}
运行结果:
3,数据不能重复:
LinkedHashSet<Integer> linkedHashSet = new LinkedHashSet<>();
linkedHashSet.add(1);
linkedHashSet.add(1);
linkedHashSet.add(1);
linkedHashSet.add(1);
final Iterator<Integer> iterator = linkedHashSet.iterator();
while (iterator.hasNext()){
System.out.println(iterator.next());
}
输出结果:
源码:
public class LinkedHashSet<E> extends HashSet<E>
implements Set<E>, Cloneable, java.io.Serializable {
public LinkedHashSet(int initialCapacity, float loadFactor) {
super(initialCapacity, loadFactor, true);
}
public LinkedHashSet(int initialCapacity) {
super(initialCapacity, .75f, true);
}
public LinkedHashSet() {
super(16, .75f, true);
}
public LinkedHashSet(Collection<? extends E> c) {
super(Math.max(2*c.size(), 11), .75f, true);
addAll(c);
}
}
由源码可知:其继承自HashSet,其继承了HashSet中所有的属性和方法。
构造函数调用父类HashSet中方法如下:
HashSet(int initialCapacity, float loadFactor, boolean dummy) {
map = new <>(initialCapacity, loadFactor);
}
总结:①LinkedHashSet的实现是基于LinkedHashMap来实现的
②LinkedHashSet数据有序的特征是基于LinkedHashMap来保证的,其底层利用双向链表来实现的数据有序
TreeSet
特点:
1,数据自然有序:
TreeSet<Integer> treeSet=new TreeSet<>();
treeSet.add(8);
treeSet.add(2);
treeSet.add(5);
treeSet.add(10);
Iterator<Integer> iterator = treeSet.iterator();
while (iterator.hasNext()){
System.out.println(iterator.next());
}
输出结果:
2,数据不能重复:
TreeSet<Integer> treeSet=new TreeSet<>();
treeSet.add(8);
treeSet.add(8);
treeSet.add(8);
Iterator<Integer> iterator = treeSet.iterator();
while (iterator.hasNext()){
System.out.println(iterator.next());
}
输出结果:
3,不能存储null值
TreeSet<Integer> treeSet=new TreeSet<>();
treeSet.add(null);
Iterator<Integer> iterator = treeSet.iterator();
while (iterator.hasNext()){
System.out.println(iterator.next());
}
输出结果:
TreeSet底层是基于treeMap来实现的