Java菜鸟学习之HashSet、TreeSet

Set集合

    特点:无序(没有下标)不允许重复元素,和Collection方法相同,Set集合取出方法只有一个:迭代器。

    HashSet:去重的功能

    HashSet的去重功能是如何实现的?

    每一个对象在创建时,就会给每一个对象分配一个hashCode码。当添加到Set集合中的对象的hashCode码不相同时,不会调用equals方法,并且对象直接存到Set集合中。当hashCode码相同的时候,会调用equals方法来查看是否是同一个对象,如果是,就无法添加。

    所以在需要使用HashSet的去重功能对对象元素进行去重时,需要重写对象类型中的hashCode方法以及equals方法。

    系统重写的hashCode()方法:

 public int hashCode() {  
    // 减少hashCode码 重复  
    // 提高效率  
    final int prime = 31;  
    int result = 1;  
    result = prime * result + age;  
    result = prime * result + ((name == null) ? 0 : name.hashCode());  
    return result;  
    }  

系统重写的equals方法:

    public boolean equals(Object obj) {  
        // 防御性的判断 利用一个判断提高效率  
        if (this == obj)    // 如果两个对象地址相同  
            return true;    // 肯定是同一个对象  
        if (obj == null)    // 穿进来不是空(调用方法对象肯定不是空)  
            return false;   // 不是一个对象  
        // 判断两个对象 是否是 同一个类创建出来的对象  
        if (getClass() != obj.getClass())  
            return false;  
        // 向下转型  
        Person other = (Person) obj;  
        // 判断年龄  
        if (age != other.age)  
            return false;  
        // 判断姓名  
        if (name == null) {  
            if (other.name != null)  
                return false;  
        } else if (!name.equals(other.name))  
            return false;  
        return true;  
        }  

LinkedHashSet

    linked表示有序的,即此集合中的元素怎么存进去就怎么区出来,顺序不发生改变。

TreeSet

    TreeSet具有排序的功能。    

    排序方式:需要元素具备比较功能。所以元素需要实现Comparable接口,覆盖comparaTo方法。

    如何保证元素唯一性?

        参考的就是比较方法的返回值是否是0,是,就是重复元素,不存进去。

    若是存储到TreeSet集合中的元素的比较功能并不是所需求的,或者元素不具备比较功能,此时就可以使用第二种比较方式:让集合具备比较功能,定义一个比较器。

    比较器的定义:

        实现ComparaTor接口,覆盖Compare方法。将Comparator接口的对象,作为参数传递给TreeSet集合的构造方法。

    比较器的好处:

        比较器更为灵活,自然排序通常都作为元素的默认排序。

猜你喜欢

转载自blog.csdn.net/yanxinrui1995/article/details/80766530