Java编程思想——第17章 容器深入研究 读书笔记(三)

六、Set和存储顺序

不同的Set实现具不同的行为,并且对于在特定的Set中放置的元素类型也有不同的要求。

Set(interface): 存入Set的每个元素都必须是唯一的,因为set不保存重复元素。加入Set的元素必须定义equals()方法以确保对象的唯一性。Set和Collection有完全一样的接口。Set接口不保证维护元素的次序。

HashSet *:为快速查找而设计的Set。存入HashSet的元素必须定义hashCode()。因为速度所以首选,神秘的排序。

TreeSet:保持次序的Set,底层为树结构。使用它可以从Set中提取有序的序列。元素必须实现Comparable接口。

LinkedHashSet:具有HashSet的查询速度,且内部使用链表维护元素顺序(插入顺序)。于是在使用迭代器遍历Set时,结果会按元素插入顺序显示,元素也必须实现hashCode()方法。

必须为Set创建equals()方法,只有HashSet和LinkHashSet需要hashCode()方法。但是良好的编程风格应该是重写equals()时跟着重写hashCode()。

如何为Set创建自定义元素类型:

class SetType {
    Integer i;

    String str;

    @Override
    public boolean equals(Object o) {
        return o instanceof SetType && (i.equals(((SetType) o).i)) && (str.equals(((SetType) o).str));
    }
}

class HasType extends SetType {
    /**
     * 这里涉及到如何重写hashCode:
     * 1.取一个初始值17
     * 2.对每一个重要字段(equals()方法里面比较的字段)进行一下操作:
     * a.filedHashValue = filed.hashCode();
     * b.result = result*31+filedHashValue;
     */
    @Override
    public int hashCode() {
        int result = 17;
        result = 31 * result + (i == null ? 0 : i.hashCode());
        result = 31 * result + (str == null ? 0 : str.hashCode());
        return result;
    }
}

class TreeType extends SetType implements Comparable<TreeType> {

    /**
     * compare要指定比较字段
     */
    @Override
    public int compareTo(TreeType arg) {
        return (arg.i < i ? -1 : (arg.i.equals(i) ? 0 : 1));
    }
}

SortedSet(TreeSet的)

  

猜你喜欢

转载自www.cnblogs.com/xcgShare/p/11711986.html
今日推荐