Java Set HashSet

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);
        }
    }
}
posted @ 2021-03-06 15:16  HickeyZhang  阅读(96)  评论(0)    收藏  举报