1.Set接口介绍
Set接口继承自Collection,Set接口中没有新增方法,方法和Collection保持完全一致。我们在前面通过List学习的方法,在Set中仍然适用。因此,学习Set的使用将没有任何难度。
Set容器特点:无序、不可重复。无序指Set中的元素没有索引,我们只能遍历查找;不可重复指不允许加入重复的元素。
Set 集合有多个子类,这里我们介绍其中的 HashSet、LinkedHashSet 、TreeSet这三个集合。
2. HashSet类详解
HashSet是采用哈希算法实现,底层实际是用HashMap实现的(HashSet本质就是一个简化版的HashMap),因此,查询效率和增删效率都比较高。
我们打开HashSet的源码,发现里面有一行核心代码:
我们发现里面有个map属性,这就是HashSet的核心秘密。我们再看add()方法,发现增加一个元素说白了就是在map中增加一个键值对,键对象就是这个元素,值对象是名为PRESENT的Object对象。说白了,就是“往set中加入元素,本质就是把这个元素作为key加入到了内部的map中”。
由于map中key都是不可重复的,因此,HashSet天然具有“不可重复”的特性。
- HashSet 的使用
给 HashSet 中存储 JavaAPI 中提供的类型元素时,不需要重写元素的 hashCode 和 equals 方法,因为这两个方法,在 JavaAPI 的每个类中已经重写完毕,如 String 类、Integer 类等。
【示例】HashSet存储 String
// 实例化一个set对象
HashSet<String> set = new HashSet<String>();
// 添加元素
set.add("aaa");
set.add("bbb");
set.add("ccc");
set.add("ddd");
set.add("ccc"); // 只能输出一个“ccc”
// 输出元素
Iterator<String> iterator = set.iterator();
while(iterator.hasNext()) {
System.out