import java.util.HashSet;
import java.util.Set;
/**
Set存储特点:数据无序、不可重复
Set接口的实现类:
HashSet:Set接口的主要实现类,线程不安全,可以存储null值。
LinkedHashSet:作为HashSet的子类,遍历内部数据时,可以按照添加的顺序遍历。
TreeSet:底层采用红黑树,元素必须是同类,按照对象的指定属性自动排序。
无序的理解:不是指遍历时不按照添加顺序遍历,而是指在底层存储的顺序不是按照添加的顺序存储。无序性不等于随机性,每次遍历的顺序相同。
不可重复:equals()、hashCode()、compareTo()、compare()
Set接口中没有定义额外新的方法,都是实现的Collection接口中定义的方法。
HashSet底层采用数组存储,初始容量为16,加载因子为0.75
添加时,首先调用对象的hashCode()计算哈希值,然后通过某种映射函数,映射为数组的索引。
如果当前索引位置不存在元素,直接添加
若当前索引位置存在元素,若两者哈希值不等,直接添加;
若哈希值相等,调用equals()方法,如果不等,添加;
如果相等,不添加。
Java采用链表法处理冲突,在JDK7中,新添加的元素在数组中,在JDK8中,旧的元素在数组中------(七上八下)
*/
public class SetAndHashSetTest {
public static void main(String[] args) {
Set set = new HashSet();
set.add(false);
set.add("OOP");
set.add(new Person(12, "Hickey"));
set.add(new Person(12, "Hickey"));
for (Object o : set) {
System.out.println("o = " + o);
}
}
}