hashset函数,hashset的查找函数是什么

1 , hashset的查找函数是什么set重置函数
2,什么是Hash函数Hash算法也称作散列算法或报文摘要(digital digest) 。Hash算法将任意长度数据转化为固定长度字符序列 。Hash结果是始终维一的 。任意二个序列的Hash结果是不同的 。Hash结果亦称为数字指纹(Finger Print),它有固定的长度,且相同的明文摘要必定一致 。这样这串摘要使可成为验证明文是否是"真身"的"指纹"了 。Hash算法数字签字通用的加密标准有: SHA-1,MD5等 。
3 , HashMap和HashSet的区别hash是一种很常见也很重要的数据结构,是用hash函数根据键值(key)计算出存储地址,以便直接访问 。由完美hash函数(即键值和地址是一一对应的)计算出的地址,在访问时 , 时间复杂度为O(1) 。Java的Object对象提供了hashCode()这个方法,该方法返回一个hash值 。对于变量,该方法一般返回该变量的内存地址 。在使用java的HashMap对象时,该方法和equals()方法一起使用,要确保equals()返回true时,hashCode()能返回同样的值;实现这点 , 一般要重写对象的hashCode()/equals()方法 。关于hash,java提供了三个类HashMap, HashSet, HashTable,他们的区别如下:1. HashSet、HashTable实质使用HashMap实现的;2. 在HashSet中 , 有如下定义:[java] view plain copyprivate final static Object dummy = new Object();boolean add(Object obj) return map.put(obj, dummy) == null;}【hashset函数,hashset的查找函数是什么】
4,哈希函数是什么哈希表中元素是由哈希函数确定的 。将数据元素的关键字K作为自变量,通过一定的函数关系(称为哈希函数) , 计算出的值,即为该元素的存储地址 。表示为:Addr = H(key)为此在建立一个哈希表之前需要解决两个主要问题:⑴构造一个合适的哈希函数均匀性 H(key)的值均匀分布在哈希表中;简单 以提高地址计算的速度⑵冲突的处理冲突:在哈希表中 , 不同的关键字值对应到同一个存储位置的现象 。即关键字K1≠K2,但H(K1)= H(K2) 。均匀的哈希函数可以减少冲突,但不能避免冲突 。发生冲突后,必须解决;也即必须寻找下一个可用地址 。解决冲突的方法:[1] ⑴链接法(拉链法) 。将具有同一散列地址的记录存储在一条线性链表中 。例 , 除留余数法中,设关键字为 (18,14,01,68,27,55,79),除数为13 。散列地址为 (5,1,1,3,1,3,1),哈希散列表如图 。⑵开放定址法 。如果h(k)已经被占用 , 按如下序列探查:(h(k)+p⑴)%TSize,(h(k)+p⑵)%TSize,…,(h(k)+p(i))%TSize , …其中,h(k)为哈希函数,TSize为哈希表长 , p(i)为探查函数 。在 h(k)+p(i-1))%TSize的基础上,若发现冲突,则使用增量 p(i) 进行新的探测,直至无冲突出现为止 。其中,根据探查函数p(i)的不同,开放定址法又分为线性探查法(p(i) = i : 1,2,3 , …),二次探查法(p(i)=(-1)^(i-1)*((i+1)/2)^2,探查序列依次为:1, -1,4, -4, 9 …) , 随机探查法(p(i): 随机数),双散列函数法(双散列函数h(key),hp (key)若h(key)出现冲突 , 则再使用hp (key)求取散列地址 。探查序列为:h(k),h(k)+ hp(k),…,h(k)+ i*hp(k)) 。⑶桶定址法 。桶:一片足够大的存储空间 。桶定址:为表中的每个地址关联一个桶 。如果桶已经满了 , 可以使用开放定址法来处理 。例如,插入A5,A2,A3,B5,A9,B2,B9,C2 , 采用线性探查法解决冲突 。望采纳,谢谢5,java中hashset和hashmap 有什么特点HashSet:HashSet实现了Set接口 , 它不允许集合中有重复的值 。当我们提到HashSet时,第一件事情就是在将对象存储在HashSet之前,要先确保对象重写equals()和hashCode()方法,这样才能比较对象的值是否相等 , 以确保set中没有储存相等的对象 。public boolean add(Object o)方法用来在Set中添加元素 , 当元素值重复时则会立即返回false,如果成功添加的话会返回true 。HashMap:HashMap实现了Map接口,Map接口对键值对进行映射 。Map中不允许重复的键 。Map接口有两个基本的实现,HashMap和TreeMap 。TreeMap保存了对象的排列次序,而HashMap则不能 。HashMap允许键和值为null 。HashMap是非synchronized的,但collection框架提供方法能保证HashMap synchronized , 这样多个线程同时访问HashMap时,能保证只有一个线程更改Map 。public Object put(Object Key,Object value)方法用来将元素添加到map中 。什么是HashSetHashSet实现了Set接口,它不允许集合中有重复的值 , 当我们提到HashSet时,第一件事情就是在将对象存储在HashSet之前,要先确保对象重写equals()和hashCode()方法,这样才能比较对象的值是否相等,以确保set中没有储存相等的对象 。如果我们没有重写这两个方法 , 将会使用这个方法的默认实现 。public boolean add(Object o)方法用来在Set中添加元素,当元素值重复时则会立即返回false,如果成功添加的话会返回true 。什么是HashMapHashMap实现了Map接口,Map接口对键值对进行映射 。Map中不允许重复的键 。Map接口有两个基本的实现 , HashMap和TreeMap 。TreeMap保存了对象的排列次序,而HashMap则不能 。HashMap允许键和值为null 。HashMap是非synchronized的,但collection框架提供方法能保证HashMap synchronized,这样多个线程同时访问HashMap时,能保证只有一个线程更改Map 。public Object put(Object Key,Object value)方法用来将元素添加到map中 。你可以阅读这篇文章看看HashMap的工作原理 , 以及这篇文章看看HashMap和HashTable的区别 。HashSet和HashMap的区别*HashMap**HashSet*HashMap实现了Map接口HashSet实现了Set接口HashMap储存键值对HashSet仅仅存储对象使用put()方法将元素放入map中使用add()方法将元素放入set中HashMap中使用键对象来计算hashcode值HashSet使用成员对象来计算hashcode值,对于两个对象来说hashcode可能相同,所以equals()方法用来判断对象的相等性,如果两个对象不同的话 , 那么返回falseHashMap比较快 , 因为是使用唯一的键来获取对象HashSet较HashMap来说比较慢hashset:此类实现set接口,由哈希表(实际上是一个hashmap实例)支持 。它不保证集合的迭代顺序;特别是它不保证该顺序恒久不变 。此类允许使用null元素 。此类为基本操作提供了稳定性能,这些基本操作包括add、remove、contains和size,假定哈希函数将这些元素正确地分布在桶中 。对此集合进行迭代所需的时间与hashset实例的大?。ㄔ氐氖浚┖偷撞?hashmap实例(桶的数量)的“容量”的和成比例 。因此,如果迭代性能很重要 , 则不要将初始容量设置得太高(或将加载因子设置得太低) 。注意 , 此实现不是同步的 。如果多个线程同时访问一个集合,而其中至少一个线程修改了该集合,那么它必须保持外部同步 。这通常是通过对自然封装该集合的对象执行同步操作来完成的 。如果不存在这样的对象,则应该使用collections.synchronizedset方法来“包装”集合 。最好在创建时完成这一操作,以防止对hashset实例进行意外的不同步访问:sets=collections.synchronizedset(newhashset(...));此类的iterator方法返回的迭代器是快速失败的:在创建迭代器之后 , 如果对集合进行修改,除非通过迭代器自身的remove方法,否则在任何时间以任何方式对其进行修改,iterator都将抛出concurrentmodificationexception 。因此 , 面对并发的修改 , 迭代器很快就会完全失败 , 而不冒将来在某个不确定时间发生任意不确定行为的风险 。注意 , 迭代器的快速失败行为无法得到保证,因为一般来说,不可能对是否出现不同步并发修改做出任何硬性保证 。快速失败迭代器在尽最大努力抛出concurrentmodificationexception 。因此,为提高这类迭代器的正确性而编写一个依赖于此异常的程序是错误做法:迭代器的快速失败行为应该仅用于检测程序错误 。hashmap:基于哈希表的map接口的实现 。此实现提供所有可选的映射操作,并允许使用null值和null键 。(除了不同步和允许使用null之外,hashmap类与hashtable大致相同 。)此类不保证映射的顺序 , 特别是它不保证该顺序恒久不变 。此实现假定哈希函数将元素正确分布在各桶之间,可为基本操作(get和put)提供稳定的性能 。迭代集合视图所需的时间与hashmap实例的“容量”(桶的数量)及其大?。?值映射关系数)的和成比例 。所以,如果迭代性能很重要,则不要将初始容量设置得太高(或将加载因子设置得太低) 。hashmap的实例有两个参数影响其性能:初始容量和加载因子 。容量是哈希表中桶的数量 , 初始容量只是哈希表在创建时的容量 。加载因子是哈希表在其容量自动增加之前可以达到多满的一种尺度 。当哈希表中的条目数超出了加载因子与当前容量的乘积时,通过调用rehash方法将容量翻倍 。通常,默认加载因子(.75)在时间和空间成本上寻求一种折衷 。加载因子过高虽然减少了空间开销,但同时也增加了查询成本(在大多数hashmap类的操作中,包括get和put操作,都反映了这一点) 。在设置初始容量时应该考虑到映射中所需的条目数及其加载因子,以便最大限度地降低rehash操作次数 。如果初始容量大于最大条目数除以加载因子,则不会发生rehash操作 。如果很多映射关系要存储在hashmap实例中,则相对于按需执行自动的rehash操作以增大表的容量来说,使用足够大的初始容量创建它将使得映射关系能更有效地存储 。注意,此实现不是同步的 。如果多个线程同时访问此映射,而其中至少一个线程从结构上修改了该映射,则它必须保持外部同步 。(结构上的修改是指添加或删除一个或多个映射关系的操作;仅改变与实例已经包含的键关联的值不是结构上的修改 。)这一般通过对自然封装该映射的对象进行同步操作来完成 。如果不存在这样的对象,则应该使用collections.synchronizedmap方法来“包装”该映射 。最好在创建时完成这一操作,以防止对映射进行意外的不同步访问,如下所示:mapm=collections.synchronizedmap(newhashmap(...));由所有此类的“集合视图方法”所返回的迭代器都是快速失败的:在迭代器创建之后,如果从结构上对映射进行修改,除非通过迭代器自身的remove或add方法,其他任何时间任何方式的修改,迭代器都将抛出concurrentmodificationexception 。因此 , 面对并发的修改 , 迭代器很快就会完全失败,而不冒在将来不确定的时间任意发生不确定行为的风险 。注意,迭代器的快速失败行为不能得到保证,一般来说,存在不同步的并发修改时 , 不可能作出任何坚决的保证 。快速失败迭代器尽最大努力抛出concurrentmodificationexception 。因此 , 编写依赖于此异常程序的方式是错误的 , 正确做法是:迭代器的快速失败行为应该仅用于检测程序错误 。(以上内容全部copy自jdk5.0doc)主要是区分set和map吧,set里就是唯一的,排好序的集合,比如hashset就是装String类型的集合,而map是一种映射关系,,每一个int都有对应的String,搜索一下百度百科应该有吧,或者看博文set是线性结构,set中的值不能重复,hashset是set的hash实现,hashset中值不能重复是用hashmap的key来实现的 。map是键值对映射,可以空键空值 。HashMap是Map接口的hash实现 , key的唯一性是通过key值hash值的唯一来确定 , value值是则是链表结构 。他们的共同点都是hash算法实现的唯一性 , 他们都不能持有基本类型 , 只能持有对象

    推荐阅读