set集合的特点:不能存储相同的元素;
HashSet
HashSet底层数据结构为HashMap,为Hash表结构,新增元素相当于HashMap的key,value默认为一个固定的Object;
HashSet:不允许出现重复元素,允许插入null值,元素无序(添加顺序和遍历顺序不一致),线程不安全。
源码:
public HashSet() {
map = new HashMap<>();
}
Set结合中没有角标的概念,所以获取元素没有list一样的get()方法,获取HashSet中某个元素时,只能通过遍历集合的方式进行equals()比较来实现。
HashSet基本方法实例:
import java.util.HashSet;
import java.util.Iterator;
import java.util.Set;
public class TestSet {
public static void main (String[] args) {
//HashSet
Set<String> testHashSet = new HashSet<>();
//元素添加
testHashSet.add("beijing");
testHashSet.add("beijing");
testHashSet.add("shanghai");
testHashSet.add("guangzhou");
testHashSet.add("shenzhen");
System.out.println(testHashSet);
System.out.println("去重,HashSet容量大小:" + testHashSet.size());
//判断是否包含某元素
if (testHashSet.contains("beijing")) {
System.out.println("true,集合包含beijing");
}
//移除某元素
testHashSet.remove("guangzhou");
System.out.println(testHashSet);
//判断集合是否为空
if (testHashSet.isEmpty()) {
System.out.println("集合为空");
} else {
System.out.println("集合不为空");
}
//集合遍历-通过迭代器
Iterator<String> iterator = testHashSet.iterator();
while (iterator.hasNext()) {
String setStr = iterator.next();
System.out.println("元素遍历:" + setStr);
}
//集合遍历-增强for循环
for (String setStr : testHashSet) {
System.out.println("增强for循环遍历set:" + setStr);
}
//获取HashSet的某个元素
for (String setStr : testHashSet)
if (setStr.equals("shenzhen")){
String getStr = setStr;
System.out.println("获取到元素:"+getStr);
}
//元素清除
testHashSet.clear();
System.out.println("clear元素清除后:"+testHashSet);
}
}
TreeSet
TreeSet底层结构为红黑树(特殊的二叉查找树),TreeMap,与HashSet不同的是,TreeSet具有排序功能,分为自然排序(123456)和自定义排序两类,默认是自然排序;在程序中,我们可以按照任意顺序将元素插入到集合中,等到遍历时TreeSet会按照一定顺序输出--倒序或者升序;
TreeSet:对插入的元素进行排序,是一个有序的集合(主要与HashSet的区别),底层使用红黑树结构,而不是哈希表结构,允许插入Null值,不允许插入重复元素,线程不安全。
源码:
public TreeSet() {
this(new TreeMap<E,Object>());
}
TreeSet基本方法实例:
import java.util.HashSet;
import java.util.Iterator;
import java.util.Set;
import java.util.TreeSet;
public class TestSet {
public static void main (String[] args) {
//TreeSet
Set <String> testTreeSet = new TreeSet<>();
//元素添加
testTreeSet.add("apple");
testTreeSet.add("apple");
testTreeSet.add("banana");
testTreeSet.add("orange");
testTreeSet.add("pear");
System.out.println(testTreeSet);
System.out.println("去重,TreeSet容量大小:" + testTreeSet.size());
//判断是否包含某元素
if (testTreeSet.contains("apple")) {
System.out.println("true,集合包含apple");
}
//移除某元素
testTreeSet.remove("banana");
System.out.println(testTreeSet);
//判断集合是否为空
if (testTreeSet.isEmpty()) {
System.out.println("treeSet集合为空");
} else {
System.out.println("treeSet集合不为空");
}
//集合遍历-通过迭代器
Iterator<String> it = testTreeSet.iterator();
while (it.hasNext()) {
String treeSetStr = it.next();
System.out.println("元素遍历:" + treeSetStr);
}
//集合遍历-增强for循环
for (String treeSetStr : testTreeSet) {
System.out.println("增强for循环遍历set:" + treeSetStr);
}
//获取TreeSet的某个元素
for (String treeSetStr : testTreeSet)
if (treeSetStr.equals("pear")){
String getStr = treeSetStr;
System.out.println("获取到元素:"+getStr);
}
testTreeSet.toArray();
System.out.println("转换为数组:"+testTreeSet);
//元素清除
testTreeSet.clear();
System.out.println("clear元素清除后:"+testTreeSet);
//TreeSet自然排序
TreeSet<String> treeSetString = new TreeSet<String>();
treeSetString.add("a");
treeSetString.add("z");
treeSetString.add("d");
treeSetString.add("b");
System.out.println("字母顺序:" + treeSetString.toString());
}
}