1.set接口简介
-
set接口是Collection接口的子接口,set接口没有提供额外的方法;
-
set接口的特性是 容器类的元素是没有顺序的,而且是不可重复的;
-
提供set容器的类有HashSet,TreeSet等;
-
Set的底层是通过map来实现的;
2.set接口的常见方法(所有的方法都是继承set接口的引用类创建的实例来调用的)
- size()方法:返回元素的个数;
- contains(Object b):是boolean返回值,表明容器中是否含有这个元素;
- toArray():将容器转换成一个Object数组;
- add(Object b):添加元素;
- remove(Object b):移除某个元素(只是指移除出容器,并非是删除);
- containsall(Collection c):判断是否有这个容器中的所有元素;
- addall(容器对象):添加某个容器中的所有元素到指定的容器中去;
- retainall(容器):和指定的容器中的元素去交集;
- removeall(容器对象):删除容器中和指定容器相同的元素(判断相等的条件是以equals为准);
- clear()方法:清空容器中的元素;
- equals():用来进行元素的比较;
- hashcode():用来求哈希值;
如以下代码一样使用这些方法即可:
public class TestHashSet {
public static void main(String[] args) {
Set hashset = new HashSet();
hashset.add("sss");//给容器添加元素
hashset.add("dxs");
System.out.println(hashset.size());
}
}
3.HashSet类的底层模式
public class HashSet<E>
extends AbstractSet<E>
implements Set<E>, Cloneable, java.io.Serializable{
}
首先HashSet类创建时是继承AbstractSet类(一个继承set的抽象类),
在这里简要说一下AbstractSet类中有什么
- 重写的equals()方法,用来比较其中的元素;
- hashcode()方法,其中还有一个迭代器,目前还没学,暂且不论;但是简单看来应该是为了遍历元素,求哈希值;
- removeAll()方法,主要使用来删除所有的元素,其中也有个迭代器,不贪多,了解基础构造;
private transient HashMap<E,Object> map;
public boolean add(E e) {
return map.put(e, PRESENT)==null;
}
从上面的add()方法,就可以简单的看出啦,HashSet添加元素的方法就是使用map,而且添加进去的元素是放在map的key上面的(这同样也是为什么set中元素不能重复发最大原因,因为key不能重复);
map是使用键值对存储的,即key-value;key就如同数据库的主键一样;不能重复;
HashSet的基本结构就是这样了,为什么要了解HashSet,而不是什么treeSet之类的类,那是因为这个类用的最多;