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/ande1922/article/details/80410221