首页 > 编程知识 正文

java南京大厂,java hashmap遍历

时间:2023-05-05 20:06:38 阅读:57275 作者:1684

现有场景是两个用户对象的列表,其中a是id和用户名,b是id和登录时间。 在此合成完成的用户的列表

我们的直接暴力解法是两个for循环,然后判断id是否相等,如果相等,复制a对应的登录时间。 这样,该代码的时间复杂度为o(n^2)

而常见的推荐方法是将列表之一转换为Map,id为key,对象或直接登录时间为value,通过for循环一次后用containsKey判断id,直接代入,从而整体时间复杂度为o(n

现在,我们来探究一下containsKey的时间复杂性。 直接粘贴源代码。 (JDK1.8 )。

publicbooleancontainskey (object key ) /调用getNode方法,hash方法根据节点的key计算节点的值return getnode (hash )、key!=null; 静态final { int hash (object key ) ) inth; //key的hashcode的前16位向右偏移16位进行异或运算,得到值return(key==null )? 0:(h=key.hashcode () ) ) ) ) ) ) ) ); }/* * * implements map.getandrelatedmethods.* * @ paramhashhhashforkey * @ paramkeythekey * @ returnthenode,ornullifnone Object key )//初始化局部变量,tab是我们map中的节点数组,first和e是单个节点(/n是我们数组的长度,k是我们key的类型NodeK,V[] tab; 节点,V first,e; int n; k; //请特别注意进行判断的这里。 如果要以first=tab[(n -1 ) hash ]//hashmap put数据,请根据hashmap的//hash函数计算key的值和数组长度- 1,并将其节点排列在//hashmap的底部=null(n=tab.Length )0) first=tab((n-1 ) hash] )!=null () if (first.hash==hash//alwayscheckfirstnode ) () k=first.key )==key||(key!=空密钥. equals (k ) ) (return first; //接下来,我们发现上面虽然key计算的位置相同,但value不同,所以我们沿着链表查找相应的值。 在jdk8中,hashmap //链表从8变为红黑树,前面8的准确数字在计算时间//复杂度时看起来像o (),所以这里最坏的情况是红黑树的迭代)/=null () if (firstining ) do{if(e.hash==hash () k=e.key )==key||(key!=nullkey.equals(k ) ) (返回e; }while((e=e.next )!=null; } }返回空值; }在上面的源代码注释中可以找到说明,在这里,尽管HashMap中为什么初始化map时初始容量为2的幂,而且1.8以后初始化后自由写正整数,但在源代码中取最近的2的幂的数以上

如上所述,put操作通过从散列函数计算的值和数组长度中减去1,为key计算放置位置。

请注意2的幂-1的二进制数为1,11,111,1111,1111,11111。 这样,由于和运算的性质都是1,所以充分保证了随机性。 (因为从以前开始就采用了散列函数的前16位和后16位的异或,所以在大量的测试中发现足够随机。 如果最后长度-1的二进制数的最后一个数为0,)则浪费了很多空间,与hash冲突的概率增加。

所以,让我们想想那个子网掩码是否是同样的理由…255.255.255.0

用于确定当前ip位于哪个网段上。 255的二进制文件是11111111,然后可以通过一些逻辑计算任何网络地址、主机地址和广播地址,然后扩展计算机网络知识。 算了,这部分的知识道理,我也还做不到。 为了保证博客的单一职责原则,不扩展。 稍后写…

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