首页 > 编程知识 正文

java数组转set集合,java集合排序

时间:2023-05-03 21:10:11 阅读:52785 作者:4851

HashSet这个类实现了Set集合,实际上是HashMap的实例。 集合的迭代顺序没有任何保证,特别是订单不能随着时间的推移保持恒定。 此类允许空元素。

HashSet有三个构造函数。

没有参数的构造函数。 此构造函数创建大小为16的容器,加载因子为0.75。 (容器大小始终为2冥,默认值为16。 在后面的文章中介绍其他构造函数。 介绍添加指定值时程序始终保证2冥的方法。 如果将值为5的容器大写,则很明显,创建的容器的实际大小为8。 感兴趣的人应该先看看算法。 现在,让我们具体看看实例化一个hashSet的具体参数。 然后,为了保证速度,在要实例化的此参数时不要将容器设置得太大。 或者,加载因子设置太小。 得到hashSet的其他3个构造函数后述。

SetString set=new HashSet (;

从该图中可以看到,实际上实例化了容量为16的HashMap。 其中,加载因子为加载因子,容量*加载因子=threshold时,

当保存的元素达到此阈值时,此容器的阈值将自动扩展。

那我接下来考虑。 容器是如何避免添加的元素重复的呢? (Set取值时调用值本身取值,不能重复。 如果重复了,就不知道根据值去取的时候要取哪一个了。 list根据下标map根据具体的key取值)

接下来,我们来看看如何添加HashSet :

此方法是实际添加的put方法,表示将元素添加到此set集合中,如果此元素不在集合中,则将其添加到此集合中。 如果此集合中已经有元素调用,则将其离开。 (其中PRESENT )

k是添加的参数,v是Object的值。

看看具体的put方法吧。

如果key为空,则将空值元素添加到容器中。 此时,如果容器中存在k、v为null=“1234”的元素,则添加了null=“456”的元素。 容器是怎么计算的?

我们来看看这种方法returnputfornullkey(value )。

卸载此上传空密钥。 什么意思? 意思是删除并替换。

循环取出容器中的要素,判断e=table[0],e!=null表示此集合中有元素。 那么我马上开始判断。 因为是k,v的形状,所以得到这个k来判断是否为空。 如果为空,则将原始对应的值替换为当前值。 也就是说,null=1234的此元素将被替换为null=456的元素。

如果第一个e=table[0]元素,e=null,则不属于此方法。 直接在modCount中进行累计加法运算,添加该key=null、value=456的值。 上面添加了key=null,下面将详细介绍addEntry方法的具体实现。

让我们分析一下具体添加的实现,以了解key是如何确保key不重复的。

其中

的具体哈希值,具体实现如下。

因为还不知道使用散列具体是什么,所以使用默认的false计算此散列值。

^异或运算符此处简要介绍了此异或:

^是异或运算符(将数据转换为二进制,按位进行运算)。

运算规则:0^0=0,1 ^0=1,0 ^1=1,1 ^1=0,运算对象相同0,不同1。

例如,3^5的运算过程如下。

)1)首先将3和5转换为二进制的11和101

)2)再按对应的位进行运算,用不足11位补零

011

^ 101

------------

110

(3)将运算结果转换为十进制: 6

异或运算的三个特征:

(1)0)0=0,0 (1=10与任意数的异或=任意数

)2) 10=1,11=01与任意数的异或=任意数相反

)3)任意数量的异或)使自己为0

还有百度就知道了

接下来,我将简要介绍HashCode的算法。 有以下两种

1 .集成器算法:

返回的当前值。 这比较简单。

2 .字符串算法:

String的混列算法,我们是int h=hash; 基于h=0计算:例如,传递值是String str='srt ';

char val[]={'s '、' r '、' t'}

循环获取数组val的值。 其中h=31 * h val[i],val[i]获取与ASCII进制数相对应的值,并在循环计算中将其相加。 最后返回具体的混列值。

最重要的

后在


这样计算出具体的hash值,也就是存储在map中的具体位置,相当于数组中的下标,所以效率上是非常快的。

后面就好理解了:

根据hash得到具体的位置,然后判断这个位置上面你的值是否hash一样并且key是否一样,如果一样,那么就替换掉,如果不一样就填加进去,具体添加方法为:

其中处理为:


添加值到容器中,在适当的时候扩容,什么时候扩容,当当前size >= threshold,临界值时候,扩容当前table大小的两倍,如16,到了size= 12 时候扩容到32.

具体添加如下:

另外三个构造函数简答列举一下:

HashSet(Collection<? extends E> c)
构造一个包含指定集合中的元素的新集合。  
HashSet(int initialCapacity)
构造一个新的空集合; 背景HashMap实例具有指定的初始容量和默认负载因子(0.75)。  
HashSet(int initialCapacity, float loadFactor)
构造一个新的空集合; 背景HashMap实例具有指定的初始容量和指定的负载因子。 

这些都有在jdk的API中可以具体看一下。

最后总结一下:

此文章主要介绍了一下Set的一种实现HashSet的具体实现和保证key不重复的源码算法和原因。并且在最后说明一下上面忘记了:此实现不同步,为线程不安全的实现,如果有多个线程同时访问这个容器(HashSet),并对立面的元素进行了修改,则需要在外部同步。保证数据的冥等性(幂等是数据中得一个概念,表示N次变换和1次变换的结果相同。)

后面后再其他文章分别介绍TreeSet和LinkedHashSet

如果有对此文好的建议欢迎评价交流。



版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。