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

简介:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
/*
看一下部分的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;
    }
}









本文转自 小眼儿 博客园博客,原文链接:http://www.cnblogs.com/hujunzheng/p/3815257.html,如需转载请自行联系原作者
目录
相关文章
|
22天前
|
算法 测试技术 C#
【哈希映射】【 哈希集合】 381. O(1) 时间插入、删除和获取随机元素 - 允许重复
【哈希映射】【 哈希集合】 381. O(1) 时间插入、删除和获取随机元素 - 允许重复
|
22天前
|
算法 前端开发
删除排序链表中的重复元素 II
删除排序链表中的重复元素 II
14 0
|
22天前
|
算法 前端开发
删除排序链表中的重复元素
删除排序链表中的重复元素
19 0
|
22天前
判断两个不重复的list集合是否相等 只比较元素值 不比较顺序
判断两个不重复的list集合是否相等 只比较元素值 不比较顺序
35 0
|
12月前
逆序遍历List集合
逆序遍历List集合
42 0
|
12月前
迭代器遍历元素并给集合中添加元素时报ConcurrentModificationException
迭代器遍历元素并给集合中添加元素时报ConcurrentModificationException
69 0
|
12月前
|
存储
82. 删除排序链表中的重复元素 II
82. 删除排序链表中的重复元素 II
43 0
|
JavaScript 小程序 Java
HashMap 为什么不能一边遍历一遍删除
HashMap 为什么不能一边遍历一遍删除
|
Shell
List有序可重复,Set无序不重复!
List有序可重复,Set无序不重复,这里指的是添加数据的顺序。
141 0
List有序可重复,Set无序不重复!
记录插入顺序用linkedHashMap
记录插入顺序用linkedHashMap
89 0

热门文章

最新文章