java集合框架--实现set接口类

本文详细介绍了Java中Set接口的不同实现类,包括HashSet、TreeSet和LinkedHashSet的特点与使用方法。探讨了散列表存储原理及TreeSet的排序机制。

实现 Set 接口的类

描述
AbstractSet继承 AbstractCollection 并实现大多数 Set 接口中的方法,为其他类集合的实现提供方便
HashSet为了使用哈希表而继承 AbstractSet,内部使用了一个哈希表来实现 Set 集合,并允许存放 null 元素。对基本操作提供常数级的时间性能
TreeSet实现 数结构 一个集合。继承了 AbstractSet,内部使用 TreeMap 实现,保证类集中的元素按照升序排列。可按照自然顺序对元素进行排序,也可以通过比较器对元素进行排序。
LinkedHashSet继承了 HashSet 并通过维护双向列表实现集合

实现 Set 接口的 类如下图:

这里写图片描述

HashSet类

HashSet 继承 AbstractSet 并实现 Set 接口。它创建一个类集,该类集使用散列表进行存储。散列表通过使用散列算法的机制来存储信息。

在散列(Hashing)中,一个关键字被用来确定唯一的一个值,称为 散列值(Hashcode)。而散列值被用来当做与关键字相连的数据的存储下标。关键字到其散列值的转换是自动执行的——用户看不到散列值本身。程序代码也不能直接索引散列表。散列法的优点在于对大的集合,它允许一些基本操作,如 add(), contains(), remove() 和 size() 方法的允许时间保持不变。

注意:存储在 HashSet 中的元素必须正确覆盖 java.lang.Object 中定义的 hashCode() 方法。

HashSet的构造方法

HasSet();
HashSet(Collection c);
HashSet(int capacity);
HashSet(int capacity, float fillRatio);

第一种形式构造一个默认的散列集合;第二种形式用 c 中的元素初始化散列集合;第三种形式用 capacity 初始化散列集合的容量;第四种形式用它的参数初始化散列集合的容量和填充比(也称为加载容量)。填充比必须介于 0.0 到 1.0 之间,它决定在散列集合向上调整大小之前,有多少能被充满。具体来说,就是当元素的个数大于散列集合容量乘以它的填充比时,散列集合被扩大。对于没有获得填充比的构造函数,默认使用 0.75 。

应该注意散列集合并没有确保其元素的顺序。如果需要排序存储,另一种类集——TreeSet将是一个更好的选择。

HashSet的使用:

import java.util.*;
public class HashSetDemo {
    public static void main(String[] args) {
        HashSet hs = new HashSet();
        hs.add("A");
        hs.add("B");
        hs.add("C");
        hs.add("D");
        hs.add("B");
        hs.add("A");
        System.out.println(hs);
    } 
}
// [A, B, C, D] 
// 没有重复元素

TreeSet类

TreeSet 是使用树结构存储元素的类集合,对象按升序存储。访问和检索速度是很快的。在存储了大量的需要进行快速检索的排序信息的情况下,TreeSet是一个很好的选择。
下面的构造函数定义为:

TreeSet()
TreeSet(Collection c)
TreeSet(Comparator comp)
TreeSet(SortedSet ss)

第一种形式构造一个空的树集合,该树集合将根据其元素的自然顺序按升序排序。第二种形式构造一个包含了 c 的元素的树集合。 第三种形式构造一个空的树集合,它按照由 comp 指定的比较函数进行排序。第四种形式构造一个包含了 ss 的元素的树集合。

import java.util.*;
public class ArrayListDemo {
    public static void main(String[] args) {
        TreeSet ts = new TreeSet();
        ts.add("D");
        ts.add("E");
        ts.add("F");
        ts.add("C");
        ts.add("A");
        ts.add("B");
        ts.add("F");
        ts.add("E");
        System.out.println(ts);
        System.out.println(ts.first());
        System.out.println(ts.last());
    } 
}
// [A, B, C, D, E, F]
// A
// F

TreeSet 按树存储其元素,它们被按照自然顺序自动排,也不能有重复元素。

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值