Set集合类似于一个罐子,程序可以依次把多个对象“丢进”Set集合,而Set集合通 常不能记住元素的添加顺序。
Set集合不允许包含相同的元素,如果试图把两个相同的元素加入同一个Set集合 中,则添加操作失败,add()方法返回 false,且新元素不会被加入。
Set常用方法
HashSet类
HashSet类是Set接口的典型实现类,大多数时候使用Set集合时就是使用这个实现类。 HashSet类按Hash算法来存储集合中的元素,因此具有很好的存取和查找性能。
HashSet类具有以下特点:
1、不能保证元素的排列顺序,顺序可能与添加顺序不同,顺序也有可能发生变化。
2、HashSet不是同步的(不是线程安全的),如果多个线程同时访问一个 HashSet,假设有两个或者两个以上线程同时修改了 HashSet集合时,则必须通 过代码来保证其同步。
3、集合元素值可以是null,但只能放入一个null。
当向 HashSet集合中存入一个元素时, HashSet会调用该对象的 hashCode()方法来得到该对象的hashCode值,然后根据该hashCode值决定该对 象在HashSet中的存储位置。如果有两个元素通过 equals方法比较返回true,但 它们的hashCode()方法返回值不相等, HashSet将会把它们存储在不同的位置, 依然可以添加成功。
HashSet判断元素是否相等的依据:对象的equals()比较返回false;且hashCode值不 相等,判断两个元素不相等;
示例:
package com.gx.collectiondemo;
import java.util.ArrayList;
import java.util.HashSet;
import java.util.Iterator;
import java.util.List;
/**
* set 无序 不允许重复元素
* HashSet 可以放入null,但只能放入一个null
* @author sxj
*/
public class HashSetDemo {
public static void main(String[] args) {
HashSet <String> set = new HashSet<String>();
// 添加元素
set.add("B");
set.add("A");
set.add("D");
set.add("C");
set.add("A");
set.add("F");
set.add("G");
set.add("I");
set.add("1");
System.out.println(set.add("I"));//false
set.add("I");
set.add("I");
set.add(null);//可以放入null,但只能放入一个null
System.out.println(set);//[null, D, 1, F, G, A, B, C, I]
// 移除
set.remove("I");
System.out.println(set);//[null, D, 1, F, G, A, B, C]
List<String> list = new ArrayList<String>();
list.add("X");
list.add("Z");
set.addAll(list);
System.out.println(set);//[null, D, 1, F, G, A, B, C, X, Z]
set.removeAll(list);
System.out.println(set);//[null, D, 1, F, G, A, B, C]
// 遍历
System.out.println("foreach遍历:");
for (String string : set) {
System.out.print(string + " ");
}
// 迭代器遍历
System.out.println("\nIterator 迭代器 while:");
Iterator<String> iterator = set.iterator();
while (iterator.hasNext()) {
System.out.print(iterator.next() + " ");
}
System.out.println("\nIterator 迭代器 for:");
for (Iterator<String> iterator2 = set.iterator(); iterator2.hasNext();) {
String string = (String) iterator2.next();
System.out.print(string + " ");
}
// 获取元素个数
System.out.println("HashSet的元素格个数:" + set.size());
// HashSet中是否包含某个元素
System.out.println("HashSet中是否包含某个元素:" + set.contains("F"));
System.out.println(set.containsAll(list));
//清空set
set.clear();
System.out.println("set是否为空"+set.isEmpty());
}
}
打印结果: