写此博文的缘由
今天在刷leetcode的时候遇见一题,需要使用Set来存储和判重,才发现自己没有系统的学过java的集合。因此,我准备系统地学习一下。
Set
1、声明一个集合
以下定义了两个集合,一个有序,一个无序,有序即按你插入的顺序输出,无序即输出顺序可能不是你
Set set1 = new HashSet();
Set set2 = new TreeSet();
2、往集合中添加元素
要注意,java中,add函数是有返回值的,如果添加成功,即集合中之前没有这个元素,就返回true。反之,如果之前已经有这个元素,加进去就不满足集合中元素的唯一性,添加失败,返回false。
Set<String> set = new HashSet<>();
set.add("Hello");
set.add("World");
如果要输出集合中的元素,直接print就行了。
System.out.println(set);
3、声明一个带初始值的集合(jdk9及以上)
以String类的set为例。
Set<String> set = Set.of("Hello","World");
4、判断是否含有某个元素
Set set = new HashSet<>();
set.add(1);
set.add(2);
System.out.println(set.contains(1));
System.out.println(set.contains(0));
输出结果:
5、其他基本操作
set.remove(x); //在集合中取出元素x
set.clear(); //清空集合
set.size(); //求集合中元素个数
set.isEmpty(); //判断集合是否为空
6、两个集合之间的操作
public static void main(String[] args) {
Set set1 = new HashSet<>();
Set set2 = new HashSet<>();
set1.add(1);
set1.add(3);
set1.add(5);
set2.add(1);
set2.add(2);
set2.add(3);
System.out.println(set1);
System.out.println(set2);
set1.removeAll(set2);//把set1中的set2包含的元素全部删除
System.out.println(set1);
set1.addAll(set2);//把set2中的元素不重不漏地加到set1中
System.out.println(set1);
set1.retainAll(set2);//把set1中set2的元素保留,其他全删除
System.out.println(set1);
}
输出结果:
7、集合中元素的遍历
foreach循环:
Set set1 = new HashSet<>();
set1.add(1);
set1.add(3);
set1.add(5);
for(Object x : set1) {
System.out.println(x);
}
使用iterator迭代器:
这种方法遍历完后,集合里面的元素也么得了。
Set set1 = new HashSet<>();
set1.add(1);
set1.add(3);
set1.add(5);
Iterator it = set1.iterator();
while(it.hasNext()) {
int op = (int)it.next();
System.out.println(op);
it.remove();
System.out.println("now:" + set1);
}
可以看出,Iterator仅用于遍历集合,Iterator本身并不提供承装对象的能力。没有集合的Iterator仿佛无根之木,没有存在价值。