日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

HashSet中实现不插入重复的元素

發布時間:2025/3/8 编程问答 29 豆豆
生活随笔 收集整理的這篇文章主要介紹了 HashSet中实现不插入重复的元素 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
/* 看一下部分的HashSet源碼.... public class HashSet<E>extends AbstractSet<E>implements Set<E>, Cloneable, java.io.Serializable {static final long serialVersionUID = -5024744406713321676L;private transient HashMap<E,Object> map;private static final Object PRESENT = new Object();public HashSet() {map = new HashMap<>();}public HashSet(Collection<? extends E> c) {map = new HashMap<>(Math.max((int) (c.size()/.75f) + 1, 16));addAll(c);}public HashSet(int initialCapacity, float loadFactor) {map = new HashMap<>(initialCapacity, loadFactor);}public HashSet(int initialCapacity) {map = new HashMap<>(initialCapacity);}HashSet(int initialCapacity, float loadFactor, boolean dummy) {map = new LinkedHashMap<>(initialCapacity, loadFactor);}public Iterator<E> iterator() {return map.keySet().iterator();}public boolean add(E e) {return map.put(e, PRESENT)==null;//在下面的代碼中我們可以看見map.put()的代碼} }public class HashMap<K,V>extends AbstractMap<K,V>implements Map<K,V>, Cloneable, Serializable {.....final int hash(Object k) {int h = 0;if (useAltHashing) {if (k instanceof String) {return sun.misc.Hashing.stringHash32((String) k);}h = hashSeed;}h ^= k.hashCode();//調用了改對象中的hashCode()方法,由 Object 類定義的 hashCode 方法確實會針對不同的對象返回不同的整數h ^= (h >>> 20) ^ (h >>> 12);return h ^ (h >>> 7) ^ (h >>> 4);}public V put(K key, V value) {if (key == null)return putForNullKey(value);int hash = hash(key);//調用了上面的函數int i = indexFor(hash, table.length);for (Entry<K,V> e = table[i]; e != null; e = e.next) {Object k;if (e.hash == hash && ((k = e.key) == key || key.equals(k))) {V oldValue = e.value;e.value = value;e.recordAccess(this);return oldValue;}}modCount++;addEntry(hash, key, value, i);return null;} }也就是說HashSet內部實現使用HashMap這個類來完成的 TreeSet的內部實現元素之間是否相等? 從上面的比較方法中可以看出,只有兩個對象的hash值相等并且對象的內容也想等,那么兩個對象才相等 并且判斷的方法用的是 equals 方法 注意:當equals()此方法被重寫時,通常有必要重寫 hashCode 方法,以維護 hashCode 方法的常規協定,該協定聲明相等對象必須具有相等的哈希碼。 */import java.util.*; public class CompTest{public static void main(String args[]){Set<myClass> st = new HashSet<myClass>();st.add(new myClass(1, "fd"));st.add(new myClass(2, "fff"));st.add(new myClass(2, "tttt"));st.add(new myClass(1, "fd"));for(Iterator<myClass> it = st.iterator(); it.hasNext();)System.out.println(it.next());} }class myClass{public int x;public String name;public myClass(int x, String name){this.x=x;this.name=name;}public int hashCode(){return x;}public boolean equals(Object tmp){//這里是方法的重寫,參數的類型和個數一定要一樣....return x==((myClass)tmp).x && name.equals( ((myClass)tmp).name);}public String toString(){return x+" "+name;} }

  

轉載于:https://www.cnblogs.com/hujunzheng/p/3815257.html

總結

以上是生活随笔為你收集整理的HashSet中实现不插入重复的元素的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。