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){<span style="color: #ff0000;">//这里是方法的重写,参数的类型和个数一定要一样....</span>
       return x==((myClass)tmp).x && name.equals( ((myClass)tmp).name);
   }
   public String toString(){
      return x+" "+name;
   }
}
时间: 2025-01-30 22:10:07

HashSet中实现不插入重复的元素的相关文章

java hashset.contains怎么取出存在的元素

问题描述 java hashset.contains怎么取出存在的元素 hashset.contains返回true了,怎么取出这个存在的元素呢? 补充: 是我没说完整 set里面保存的是一个key/value对,我重写了hashcode和equals让contains在判断的时候只判断key是否出现,现在key出现了我要取出这个key对应的value值.. 解决方案 有没有自己动手,丰衣足食的成就感呢,学习编程遇到问题自己先思考下解决方法,未果再求助,会进步更快的. 解决方案二: Java从H

让样式在IE中作用到未知的元素上

Sjoerd Visscher 发现了一个简洁的 方法 让样式在 IE 中作用到未知的元素上--仅需 JS 创建此未知元素即可: document.createElement(elementName) 同理(对于 IE 来说 HTML5 元素即是未知元素),该方法也可顺延到 HTML5 的元素上(详细见:John Resig 写的 <HTML5 Shiv> 一文): <html><head><style>section { color: red; }<

控制VC++.NET中WEB对话框的HTML元素属性

c++|web|对话框|控制 VC++.NET一个令人耳目一新的特性就是基于动态HTML的WEB对话框,它使得桌面程序界面和功能变得更容易实现.这里将对WEB对话框中HTML元素的CSS属性控制作探讨. 一.在HTML编辑器中设置元素的CSS属性 CSS最早出现于1996年,全称为:层叠样式表(Cascading Stylesheets).由于它在字体.样式.风格等方面的突出表现使它迅速在网页制作中流行起来.它可以精确控制页面文字效果,最重要的是很多浏览器和平台都支持它,而且编码简短,页面下载快

解析dom中的children对象数组元素firstChild,lastChild的使用

以下是对dom中的children对象数组元素firstChild,lastChild的使用进行了详细的分析介绍,需要的朋友可以参考下   复制代码 代码如下: <!--children对象数组元素示例 --> <html> <body>   <table   id="tbl">     <tbody> <tr> <td> 行1列1 </td><td>行1列2 </td&g

在Python的列表中利用remove()方法删除元素的教程

  这篇文章主要介绍了在Python的列表中利用remove()方法删除元素的教程,是Python入门中的基础知识,注意其和pop()方法的区别,需要的朋友可以参考下 remove()方法从列表中删除第一个obj. 语法 以下是remove()方法的语法: ? 1 list.remove(obj) 参数 obj -- 这是可以从列表中移除该对象 返回值 此方法不返回任何值,但从列表中删除给定的对象 例子 下面的例子显示了remove()方法的使用 ? 1 2 3 4 5 6 7 8 #!/usr

[经典面试题][百度]数组A中任意两个相邻元素大小相差1,在其中查找某个数。

题目 数组A中任意两个相邻元素大小相差1,现给定这样的数组A和目标整数t,找出t在数组A中的位置.如数组:[1,2,3,4,3,4,5,6,5],找到4在数组中的位置. 思路 这道题目最差时间复杂度也是O(N),所以重点在于能不能找到一种尽可能减少比较次数的方法. 如数组:[1,2,3,4,3,4,5,6,5],找到4在数组中的位置.4和1比较,差为3,那么即使最好情况(递增或者递减),4也就是在a[3]的位置,可以跳过a[1]a[2].这样在特定数组(目标值和a[1]相差很大)的情况下或许可以

c-循环遍历过程中,删除数组的元素?

问题描述 循环遍历过程中,删除数组的元素? for(var i=0,len=arr.length; i<len; i++){ if(符合条件){ arr.splice(i); } } 像上面这样,在遍历过程中,删除某个元素,会存在问题,可能导致某些元素没有机会被遍历. 这个算法应该如何改进? 解决方案 for(var i=0,len=arr.length; i<len; ){ if(符合条件){ arr.splice(i); } else i++;/////// } 或者从后面开始遍历,就不需

对象-如何在JSP页面用EL判断HashSet中是否存在某值

问题描述 如何在JSP页面用EL判断HashSet中是否存在某值 本来tomcat7是支持直接EL取到Set对象然后调用contains方法的. 无奈生产环境使用的是tomcat6,不支持这种方式 想写自定义标签,网上找的文档都是0几年的,现在这种需求都是用什么方法解决的 我目前是要做一个列表显示全部的可选内容,Set中存的是对象中已经存在的选项 如果已经存在就打钩,我用这种方式进行处理的 解决方案 不用EL,直接用<%=%>吧.或是把Set变成List,输出给JS,由JS进行判断.

java中TreeSet集合如何实现元素的判重

/* 看一下部分的TreeSet源码.... public class TreeSet<E> extends AbstractSet<E> implements NavigableSet<E>, Cloneable, java.io.Serializable { private transient NavigableMap<E,Object> m; //NavigableMap继承SortedMap, 二者都是接口,在TreeMap中有实现 private