先上一张Java集合的框架图,便于参考
以下所有特性仅代表自JAVA 1.8
Set
public interface Set<E> extends Collection<E> {
int size();
boolean isEmpty();
boolean contains(Object o);
boolean add(E e);
boolean remove(Object o);
.
.
.
}
HashSet
public class HashSet<E>
extends AbstractSet<E>
implements Set<E>, Cloneable, java.io.Serializable
{
private transient HashMap<E,Object> map;
private static final Object PRESENT = new Object();
/**
* Constructs a new, empty set; the backing <tt>HashMap</tt> instance has
* default initial capacity (16) and load factor (0.75).
*/
public HashSet() {
map = new HashMap<>();
}
public boolean add(E e) {
return map.put(e, PRESENT)==null;
}
}
1.使用HashMap<K,V>来存储数据, 并且数据存储在HashMap的Key里面, 而HashMap的value 存储了一个空的Object
2.由于HashMap存储的数据是无序的,而HashSet是通过HashMap存储数据,因此HashSet存储的数据也是无序的
3.由于HashMap的 key 不能够重复, 因此HashSet 不能存储重复的数据,重复的数据会产生覆盖。
4. 线程不安全的
LinkedHashSet
public class LinkedHashSet<E>
extends HashSet<E>
implements Set<E>, Cloneable, java.io.Serializable {
/**
* Constructs a new, empty linked hash set with the default initial
* capacity (16) and load factor (0.75).
*/
public LinkedHashSet() {
super(16, .75f, true);
}
}
class HashSet<E>
extends AbstractSet<E>
implements Set<E>, Cloneable, java.io.Serializable
{
HashSet(int initialCapacity, float loadFactor, boolean dummy) {
map = new LinkedHashMap<>(initialCapacity, loadFactor);
}
}
1.构建了一个LinkedHashMap<K,V> , 并且数据存储在LinkedHashMap<K,V>的 Key中, 而LinkedHashMap<K,V>的value 存储了一个空的Object
2.由于LinkedHashMap存储数据是有序的, 因此LinkedHashSet也是有序的。
3.由于LinkedHashMap的 key 不能够重复,会覆盖重复的内容, 因此LinkedHashSet 也不能存储重复的数据。
4.线程不安全的
TreeSet
public class TreeSet<E> extends AbstractSet<E>
implements NavigableSet<E>, Cloneable, java.io.Serializable
{
// Dummy value to associate with an Object in the backing Map
private static final Object PRESENT = new Object();
/**
* The backing map.
*/
private transient NavigableMap<E,Object> m;
TreeSet(NavigableMap<E,Object> m) {
this.m = m;
}
public TreeSet() {
this(new TreeMap<E,Object>());
}
}
1.使用TreeMap<K,V>作为底层数据结构
2.数据是有序的,线程不安全的