HashSet的特點:
1弓摘、不保證Set的迭代順序
2焚鹊、特別是不保證該順序恒久不變
3、元素唯一韧献。
HashSet的底層結(jié)構(gòu)是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實現(xiàn)的探橱。
它將傳進來的元素當作key,value是一個常量的Object绘证。
利用了HashMap的特點隧膏,實現(xiàn)了Set從元素唯一的特性。具體怎么實現(xiàn)的在HashMap的文章中再具體分析嚷那。
3胞枕、刪除:
public boolean remove(Object o) {
return map.remove(o)==PRESENT;
}
這里沒什么好說的,還是直接調(diào)用的HashMap的remove方法魏宽,具體在HashMap中再分析腐泻。
4、改
HashSet中沒有關(guān)于索引的操作队询,自然也沒有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實現(xiàn)的窄坦,可以實現(xiàn)查詢的時候有序性。
TreeSet底層是通過TreeMap實現(xiàn)
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實現(xiàn))
* @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();
}
}