HashSet常用方法总结
一、Set接口分支
抽象类AbstractSet实现了接口Set的部分方法。TreeSet和HashSet直接继承自AbstractSet。LinkedHashSet直接继承自HashSet。其中HashSet和LinkedHashSet直接实现了Set接口。
二、Set接口概述
Set接口继承自Collection接口
三、Set接口常用实现类
1、HashSet
①实现了set接口
②“它不保证set的迭代顺序;特别是它不保证该顺序恒久不变”(存入该实现类对象的元素是无序的,即在遍历该集合元素时,遍历出的元素顺序未必和向集合中添加元素的顺序一致,这次遍历出集合元素的顺序也未必和下次遍历出集合元素的顺序一致)
③允许使用null元素
2、LinkedHashSet
①HashSet的子类
②该实现类对象维护着一个运行于所有元素的双重链接列表,由于该链接列表定义了迭代顺序,所以在遍历该实现类集合时按照元素的插入顺序进行遍历
3、TreeSet
①既实现Set接口,同时也实现了SortedSet接口,具有排序功能
②存入TreeSet中的对象元素需要实现Comparable接口
三、HashSet常用方法
1、add(Object obj)
add(Object obj):向Set集合中添加元素,添加成功返回true,否则返回false。
代码示例如下:
package set;
import java.util.HashSet;
import java.util.Iterator;
public class Test {
public static void main(String[] args) {
HashSet<String> set = new HashSet<String>();
System.out.println(set.add("Tom"));
System.out.println(set.add("Jim"));
System.out.println(set.add("Lucy"));
for (String name : set) {
System.out.println(name);
}
}
}
向Set集合中添加三个元素,添加成功返回true,用加强for循环遍历Set集合,由程序运行结果可以看出遍历set集合元素的顺序未必和向集合中添加的顺序一致。
2、size()
size():返回Set集合中的元素个数。
package set;
import java.util.HashSet;
import java.util.Iterator;
public class Test {
public static void main(String[] args) {
HashSet<String> set = new HashSet<String>();
System.out.println(set.add("Tom"));
System.out.println(set.add("Jim"));
System.out.println(set.add("Lucy"));
System.out.println(set.size());
}
}
}
3、remove(Object obj)
remove(Object obj):删除Set集合中的元素,删除成功返回true,否则返回false。
package set;
import java.util.HashSet;
public class Test {
public static void main(String[] args) {
HashSet<String> set = new HashSet<String>();
System.out.println(set.add("Tom"));
System.out.println(set.add("Jim"));
System.out.println(set.add("Lucy"));
System.out.println(set.remove("Tom"));
System.out.println(set.remove("hds"));
}
}
4、isEmpty()
isEmpty():如果Set不包含元素,则返回 true ,否则返回false。
5、clear()
clear() : 移除此Set中的所有元素
代码示例如下:
package set;
import java.util.HashSet;
import java.util.Iterator;
public class Test {
public static void main(String[] args) {
HashSet<String> set = new HashSet<String>();
set.add("Tom");
set.add("Jim");
set.add("Lucy");
System.out.println(set.isEmpty());
set.clear();
System.out.println(set.isEmpty());
}
}
6、iterator()
iterator():返回在此Set中的元素上进行迭代的迭代器。
package set;
import java.util.HashSet;
import java.util.Iterator;
public class Test {
public static void main(String[] args) {
HashSet<String> set = new HashSet<String>();
set.add("Tom");
set.add("Jim");
set.add("Lucy");
Iterator<String> iterator = set.iterator();
while(iterator.hasNext()) {
System.out.println(iterator.next());
}
}
}
7、contains(Object o)
contains(Object o):如果Set包含指定的元素,则返回 true,否则返回false
package set;
import java.util.HashSet;
import java.util.Iterator;
public class Test {
public static void main(String[] args) {
HashSet<String> set = new HashSet<String>();
set.add("Tom");
set.add("Jim");
set.add("Lucy");
boolean flag = set.contains("Tom");
System.out.println(flag);
flag = set.contains("hdj");
System.out.println(flag);
}
}
思考:Set集合为什么不能添加重复的元素?
package set;
import java.util.HashSet;
import java.util.Iterator;
public class Test {
public static void main(String[] args) {
HashSet<String> set = new HashSet<String>();
set.add("Tom");
set.add("Jim");
set.add("Lucy");
System.out.println(set.add("Tom"));
}
}
原因:
HashSet<String> set = new HashSet<String>();调用HashSet无参构造方法创建HashSet对象时,底层代码实际是调用HashMap无参构造方法创建一个HashMap对象并令全局变量map指向它。
public HashSet() {
map = new HashMap<>();
}
调用add方法向HashSet集合中添加元素:set.add("Tom"),HashSet 的add方法实质是map全局变量调用了put方法,将数据存到了key中,value值是一个常量,因为HashMap 的 key 不允许重复,所以HashSet添加的元素也不允许重复。
public boolean add(E e) {
return map.put(e, PRESENT)==null;
}