Collecttion的子接口Set
Set概述:
set接口的实现类有HashSet【主要实现类】,LinkedHashSet,TreeSet。
Set集合中存储的元素都是无序的,不可重复的。Hash
Set接口的主要实现类---HashSet实现类对象的创建:
public class Main {
public static void main(String[] args) {
HashSet set = new HashSet();
set.add("aa");
set.add("bb");
}
}
HashSet的常用方法:
import java.util.HashSet;
import java.util.Iterator;
import java.util.Set;
public class Main {
public static void main(String[] args) {
HashSet set = new HashSet();
HashSet set1 = new HashSet();
HashSet set2 = new HashSet();
set.add("aa");//add()添加元素
set.add("bb");
set1.add("aa");
set1.add("bb");
set2.add("aa");
set2.add("cc");
int size = set.size();//获取set集合中的元素个数
//set.clear();//清空set集合中的全部元素
//equals()方法比较两个集合是否相等,相等则返回true,不相等则返回false
System.out.println(set.equals(set1));//true
System.out.println(set.equals(set2));//false
System.out.println(set);//[aa, bb]
set.remove("aa");//remove()移除set集合中的元素;
System.out.println(set);//[bb]
set.add("bb");
System.out.println(set.contains("bb"));//true;
//contains()判断set集合中是否包含XX元素,包含返回true,不包含则返回false
System.out.println(set.isEmpty());//false
//isEmpty()判断set集合是否为空,为空则返回true,反之则返回false
Object[] objects = set.toArray();//toArray()将set集合转变为数组
System.out.println(set);
for (int i = 0; i < objects.length; i++) {
System.out.println(objects[i]);
}
Iterator iterator = set.iterator();//iterator()获取set集合的迭代器,用于遍历set数组
while (iterator.hasNext()){
System.out.println(iterator.next());
}
}
}
说明:
HashSet底层是HashMap,使用的是数组+单向链表+红黑树的结构进行存储。数据元素在被加入到set集合的过程中,会调用其hashCode方法计算其哈希值,再通过哈希值来计算该元素在集合中的位置,故set集合中的元素并不是按添加顺序进行排列的,是无序的。
public class test01 {
public static void main(String[] args) {
TreeSet Set = new TreeSet();
Set.add("aa");
Set.add("123");
Set.add("cc");
Set.add("34343");
Set.add("ee");
System.out.println(Set);//最后输出[123, 34343, aa, cc, ee]
}
}
在向set集合中添加元素时,如果添加的元素计算出来的位置已经有元素了,那么就会比较这两个元素的哈希值,如果相同则新添加的元素无法加入该集合,如果不同则会继续调用equals方法进一步判断二者是否相同,如果相同则新添加的元素依然无法加入set集合,如果不同则将元素添加进入set集合。这种特点就需要我们去重写equals()和hashCode(),同时要求equals()和hashCode()具有一致性。
HashSet类的子类LinkedHashSet,TreeSet,HashSet的比较
LinkedHashSet是HashSet的子类,二者的不同在于LinkedHashSet的底层在HashSet的基础上添加了一组 双向链表,使得LinkedHashSet比HashSet在进行遍历操作时具有更好的性能,并且可以按添加顺序进行遍历。
TreeSet的底层使用红黑树进行存储,这就使得Treeset中的元素可以按照添加元素的属性进行排序。
public class test01 {
public static void main(String[] args) {
TreeSet treeSet = new TreeSet();
treeSet.add("aa");
treeSet.add("bb");
treeSet.add("cc");
treeSet.add("dd");
treeSet.add("ee");
treeSet.add("yy");
treeSet.add("ff");
System.out.println(treeSet);//最后输出[aa, bb, cc, dd, ee, ff, yy]
}
}