Set接口
1 特点
无序且不可重复
2 三种实现类的数据类型与特点
a. HashSet
数据结构:hash表(一维数组)
特点:无序且不可重复
b. LinkedHashSet
数据结构:双向链表
特点:有序且去重(添加了双向链表的数据结构)
ps:
继承关系:class LinkedHashSet extends HashSet
c. TreeSet
数据结构:二叉树
特点:根据元素类型自然排序
3 HashSet
3.1 HashSet的使用
package com.qf.hashset_class;
import java.util.HashSet;
import java.util.Arrays;
import java.util.Collections;
import java.util.Iterator;
public class Test01 {
/**
* 知识点:HashSet的使用
*/
public static void main(String[] args) {
HashSet<String> set = new HashSet<>();
//添加数据
set.add("小希");
set.add("小空");
set.add("小丽");
set.add("小光");
set.add("小步");
//获取元素个数
int size = set.size();
System.out.println("获取元素个数:" + size);//5
HashSet<String> newSet1 = new HashSet<>();
Collections.addAll(newSet1, "aaa","bbb","ccc","ccc");//利用集合工具类(Collections)批量添加元素
set.addAll(newSet1);//将newSet1中所有的元素都添加到set集合里
//清空集合里所有的元素
//set.clear();
System.out.println("判断集合中是否包含指定元素:" + set.contains("小康"));//false
System.out.println("判断集合中是否包含指定集合:" + set.containsAll(newSet1));//true
//没有-true,有-false
System.out.println("判断集合里是否没有元素:" + set.isEmpty());//false
set.remove("小丽");//通过数据删除元素
set.removeAll(newSet1);//将set中有newSet1的元素全部删除(去除交集)
HashSet<String> newSet2 = new HashSet<>();
Collections.addAll(newSet2, "小希","小丽","小步");
set.retainAll(newSet2);//将set中有newSet2的元素全部保留(保留交集)
//将集合转换为数组
Object[] array1 = set.toArray();
System.out.println(Arrays.toString(array1));//[小步, 小希]
//将集合转换为指定类型的数组
String[] array2 = new String[2];
set.toArray(array2);
System.out.println(Arrays.toString(array2));//[小步, 小希]
System.out.println("-----------------------------------------");
//遍历集合 -- foreach
for (String element : set) {
System.out.println(element);
}
System.out.println("-----------------------------------------");
//遍历集合 -- Iterator
Iterator<String> it = set.iterator();
while(it.hasNext()){//判断是否有可迭代的元素
String next = it.next();//获取下一个元素
System.out.println(next);
}
}
}
3.2 HashSet的特点
package com.qf.hashset_class;
import java.util.HashSet;
public class Test02 {
/**
* 知识点:HashSet的特点
*
* 特点:无序且去重
*
* 添加步骤:
* 1.获取元素的hash值 -- hashCode()
* 2.通过hash值计算在数组中的下标
* 3.判断下标上是否有元素
* 3.1 没有元素 -- 直接添加
* 3.2 有元素 ---- 判断两个对象是否相同 hash && (==||equals())
* 3.2.1 相同 -- 不添加数据(达到去重效果)
* 3.2.2 不相同 -- 形成单向链表(JDK1.7头插法、JDK1.8尾插法)
*
* 遍历步骤:
* 遍历数组(顺序遍历)
*
* 注意:添加步骤处理数据的逻辑和遍历步骤处理数据的逻辑不一样,导致无序
*
*
*/
public static void main(String[] args) {
HashSet<String> set = new HashSet<>();
set.add("aaa");
set.add("bbb");
set.add("ccc");
set.add("ccc");
set.add("Aa");
set.add("BB");
for (String element : set) {
System.out.println(element);
}
}
}
4 LinkedHashSet
4.1 LinkedHashSet的使用
package com.qf.linkedhashset_class;
import java.util.LinkedHashSet;
import java.util.Arrays;
import java.util.Collections;
import java.util.Iterator;
public class Test01 {
/**
* 知识点:LinkedHashSet的使用
*/
public static void main(String[] args) {
LinkedHashSet<String> set = new LinkedHashSet<>();
//添加数据
set.add("麻生希");
set.add("椎名空");
set.add("水菜丽");
set.add("朝桐光");
set.add("樱井步");
//获取元素个数
int size = set.size();
System.out.println("获取元素个数:" + size);//5
LinkedHashSet<String> newSet1 = new LinkedHashSet<>();
Collections.addAll(newSet1, "aaa","bbb","ccc","ccc");//利用集合工具类(Collections)批量添加元素
set.addAll(newSet1);//将newSet1中所有的元素都添加到set集合里
//清空集合里所有的元素
//set.clear();
System.out.println("判断集合中是否包含指定元素:" + set.contains("侯小康"));//false
System.out.println("判断集合中是否包含指定集合:" + set.containsAll(newSet1));//true
//没有-true,有-false
System.out.println("判断集合里是否没有元素:" + set.isEmpty());//false
set.remove("水菜丽");//通过数据删除元素
set.removeAll(newSet1);//将set中有newSet1的元素全部删除(去除交集)
LinkedHashSet<String> newSet2 = new LinkedHashSet<>();
Collections.addAll(newSet2, "麻生希","水菜丽","樱井步");
set.retainAll(newSet2);//将set中有newSet2的元素全部保留(保留交集)
//将集合转换为数组
Object[] array1 = set.toArray();
System.out.println(Arrays.toString(array1));//[樱井步, 麻生希]
//将集合转换为指定类型的数组
String[] array2 = new String[2];
set.toArray(array2);
System.out.println(Arrays.toString(array2));//[樱井步, 麻生希]
System.out.println("-----------------------------------------");
//遍历集合 -- foreach
for (String element : set) {
System.out.println(element);
}
System.out.println("-----------------------------------------");
//遍历集合 -- Iterator
Iterator<String> it = set.iterator();
while(it.hasNext()){//判断是否有可迭代的元素
String next = it.next();//获取下一个元素
System.out.println(next);
}
}
}
4.2 LinkedHashSet的特点
package com.qf.linkedhashset_class;
import java.util.LinkedHashSet;
public class Test02 {
/**
* 知识点:LinkedHashSet的特点
*
* 继承关系:class LinkedHashSet extends HashSet
* 特点:有序且去重
*
* 添加步骤:
* 在父类HashSet的基础上,添加的元素会存储上一个元素的地址,
* 上一个元素也会存储下一个元素的地址 -- 双向链表
*
* 遍历步骤:
* 找到第一个元素,再向下依次找下一个元素
*
*/
public static void main(String[] args) {
LinkedHashSet<String> set = new LinkedHashSet<>();
set.add("aaa");
set.add("bbb");
set.add("ccc");
set.add("ccc");
set.add("Aa");
set.add("BB");
for (String element : set) {
System.out.println(element);
}
}
}
5 TreeSet
5.1 TreeSet的使用(同HashSet-略)
5.2 TreeSet的特点
package com.qf.treeset_class;
import java.util.TreeSet;
public class Test02 {
/**
* 知识点:TreeSet的特点
*
* 特点:自然排序(TreeSet会根据不同的类型使用不同的排序规则)
*/
public static void main(String[] args) {
//TreeSet存储String -> 字典排序
TreeSet<String> set1 = new TreeSet<>();
set1.add("a");
set1.add("c");
set1.add("e");
set1.add("bc");
set1.add("bb");
for (String element : set1) {
System.out.println(element);
}
System.out.println("-----------------------------");
//TreeSet存储Integer -> 数字升序
TreeSet<Integer> set2 = new TreeSet<>();
set2.add(3);
set2.add(5);
set2.add(1);
set2.add(2);
set2.add(4);
for (Integer element : set2) {
System.out.println(element);
}
}
}