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);//5HashSet<String> newSet1 = new HashSet<>();Collections.addAll(newSet1, "aaa","bbb","ccc","ccc");//利用集合工具类(Collections)批量添加元素set.addAll(newSet1);//将newSet1中所有的元素都添加到set集合里//清空集合里所有的元素//set.clear();System.out.println("判断集合中是否包含指定元素:" + set.contains("小康"));//falseSystem.out.println("判断集合中是否包含指定集合:" + set.containsAll(newSet1));//true//没有-true,有-falseSystem.out.println("判断集合里是否没有元素:" + set.isEmpty());//falseset.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("-----------------------------------------");//遍历集合 -- foreachfor (String element : set) {System.out.println(element);}System.out.println("-----------------------------------------");//遍历集合 -- IteratorIterator<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);//5LinkedHashSet<String> newSet1 = new LinkedHashSet<>();Collections.addAll(newSet1, "aaa","bbb","ccc","ccc");//利用集合工具类(Collections)批量添加元素set.addAll(newSet1);//将newSet1中所有的元素都添加到set集合里//清空集合里所有的元素//set.clear();System.out.println("判断集合中是否包含指定元素:" + set.contains("侯小康"));//falseSystem.out.println("判断集合中是否包含指定集合:" + set.containsAll(newSet1));//true//没有-true,有-falseSystem.out.println("判断集合里是否没有元素:" + set.isEmpty());//falseset.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("-----------------------------------------");//遍历集合 -- foreachfor (String element : set) {System.out.println(element);}System.out.println("-----------------------------------------");//遍历集合 -- IteratorIterator<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);}}
}