java容器——Set接口
Set容器不包含重复的值,不区分数据存储的顺序。Set接口的实现类有HashSet、TreeSet。另外LinkedHashSet继承了HashSet类。
(1)HashSet实现类
底层使用HashMap实现。将对象存储在HashMap的key值,可以利用HashMap中键不可重复的特性,来保证HashSet中没有重复的数据对象。
下面简单模拟HashSet的实现原理:
public class MyHashSet {
HashMap map;
private int size;
private static final Object PRESENT = new Object();
public MyHashSet(){
map=new HashMap();
}
public int size(){
return map.size();
}
public void add(Object obj){
map.put(obj, PRESENT);//set的不可重复其实就是利用了map里面键的不可重复
}
public static void main(String[] args) {
MyHashSet set =new MyHashSet();
set.add("aaa");
set.add(new String("aaa"));
System.out.println(set.size());
}
}
(2)LinkedHashSet实现类
LinkedHashSet继承了HashSet类,但是LinkedHashSet中使用的是LinkedHashMap,LinkedHashSet中的元素顺序是可以保证的,也就是说遍历Map的顺序和插入时的顺序是一致的。
(3)TreeSet实现类
TreeSet也实现了SortedSet接口。底层存储使用的是TreeMap,使用它可以从Set中提取有序的序列,元素必须实现Comparable接口否则按默认字典排序。
由上述分析可见,Set基本上都是基于Map的实现类实现的,通过将Set作为Map中的键值实现Set的不允许有重复值的特性。
推荐:java学习:java容器——Map接口(代码模拟HashMap的底层实现)