HashSet的特点:
1、不保证Set的迭代顺序
2、特别是不保证该顺序恒久不变
3、元素唯一。
HashSet的底层结构是HashMap
哈希表依赖于哈希值存储。
添加功能底层依赖两个方法,hashCode()和equals()方法。
1、查询:只能通过增强for或者迭代器得到值,没有通过索引得到值的方法
2、增加
public HashSet() {
map = new HashMap<>();
}
// Dummy value to associate with an Object in the backing Map
private static final Object PRESENT = new Object();
public boolean add(E e) {
return map.put(e, PRESENT)==null;
}
从add方法就可以看出它底层是通过HashMap实现的。
它将传进来的元素当作key,value是一个常量的Object。
利用了HashMap的特点,实现了Set从元素唯一的特性。具体怎么实现的在HashMap的文章中再具体分析。
3、删除:
public boolean remove(Object o) {
return map.remove(o)==PRESENT;
}
这里没什么好说的,还是直接调用的HashMap的remove方法,具体在HashMap中再分析。
4、改
HashSet中没有关于索引的操作,自然也没有set之类的方法,不过可以通过add方法来覆盖之前的值。
LinkedHashSet set=new LinkedHashSet<Object>();
set.add("1");
set.add("3");
set.add("2");
for (Object object : set) {
System.out.println(object.toString());
}
//1 3 2
值得一提的是LinkedHashSet继承至HashSet,唯一不同的是底层是通过LinkedHashMap实现的,可以实现查询的时候有序性。
TreeSet底层是通过TreeMap实现
package com.yidu.demo;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashMap;
import java.util.HashSet;
import java.util.LinkedList;
import java.util.Set;
import java.util.TreeMap;
import java.util.Vector;
import org.omg.Messaging.SyncScopeHelper;
/**
* 模拟set集合(底层HashMap实现)
* @author Administrator
*/
public class MyHashSet{
private HashMap<Object, Object> map;
public MyHashSet(){
map=new HashMap<>();
}
public void add(Object obj){
map.put(obj, null);
}
public void remove(Object obj){
map.put(obj, null);
}
public int size(){
return map.size();
}
public static void main(String[] args) {
MyHashSet set=new MyHashSet();
}
}
网友评论