首页 > 编程知识 正文

hashmap底层数据结构红黑树,arraylist是什么数据结构

时间:2023-05-04 03:01:28 阅读:129425 作者:3789

混沌图数据结构浅谈:混沌图作为一种非常重要的数据结构,在理论学习和实际开发中都经常遇到。 这里总结一下hashmap的基础知识点。

1、常见的数据结构一般开发中常见的数据结构是数组、链表、树和HashMap。

数组结构和链表结构的图形结构非常简单。 这次主要说明HashMap的结构,并结合源代码进行简单的分析

2、混叠混叠混叠的结构图如下:

主要分为横向数组和纵向链表。存储在数组中的内存中的物理地址、对象的存储索引和纵向链表存储对象的值。

首先,我们查看hashmap的源代码,了解hash存储的过程。

publicvput(kkey,V value ) { //hash方法将对象集中为一个输入值returnputval ) hash(key )、key、value、false和true ) //在此,为了更详细地说明,将数组长度设为16,将key散列化后的值设为9finalvputval(inthash,K key,V value,boolean onlyIfAbsent,boolean evict int n,I; //下面的if这样写会很容易理解。/* if (table==null|| table.length==0) table=resize ); tab=table; n=tab.length; */if(tab=table )==null|| (n=tab.length )=0) n=(tab=resize ) ).length; //下一个if表示要看tab[9]是否为空,/*i=15 hash; //1111 1001p=tab[9]; if(p=null )直接在此地址位上放置值) else )如果此地址位已经有值,则此entry ) (*/if ) p=tab(I=(n-1 ) hash] ) )=null ) k; if(p.hash==hash ) (k=p.key )==key||(key!=nullkey.equals(k ) ) (e=p; elseif(pinstanceoftreenode ) e=(treenodek,v ) p ).puttreeval ) this,tab,hash,key,value ); else{for(intbincount=0; binCount () if ) (e=p.next ) null ) ) p.next=newnode ) hash,key,value,null ); if (bincount=tree ify _ threshold-1 )/-1for1STTreeifybin(tab,hash ); 布雷克; (if ) e.hash==hash((k=e.key )==key||(key!=nullkey.equals(k ) ) (break; p=e; }if(e!=null (//existingmappingforkeyvoldvalue=e.value; if (! olyifabsent|||old value==null (e.value=value; afternodeaccess(e; 返回载荷值; } }模具计数; 大小阈值(if )大小); 自动识别(evict; 返回空值; }简单来说,hashmap的保管主要分为两个阶段。

对key进行混列计算得到的数组中的索引,可以理解为什么在该位置存储entry值,如果该位置没有值就直接存储,如果有值就作为链表存储,主要是散列冲突问题

哈希冲突是什么,即多个key在用哈希函数计算后得到相同的值。

3、因为重视重点到了这里,所以改写Object的equals在原理上可以理解

方法时,hashcode (也必须同时复盖。

例如在接下来的测试中,

@ data @ allargsconstructorclassstudent { privatestring name; @ overridepublicbooleanequals (objecto ) if ) this==o ) return true; if(o==null||getclass (!=o.getClass () ) return false; 从属事件=(事件) o; return this.name==student.getname (; }公共类测试{ publicstaticvoidmain (字符串[ ] args ) studentstudent1=newstudent ) ' Zhangsan '; student student2=new student (张San ); system.out.println (student1. equals ) student2); //true MapStudent,String map=new HashMap (; map.put(student1,'上海大学'); system.out.println(map.get ) student2); //null }}系统分析:

首先,key值重写了equals方法,使其在逻辑上相等。 但是,在映射中存储时需要散列(student ),每个student的散列代码都不同。 查看以下源代码。 所以,我们犯了和刻舟求剑一样的错误。

静态final { int hash (object key ) inth; 返回(key==null )? 0:(h=key.hashcode () ) ) ) ) ) ) ) ); ) 4、总结正文只对hashmap进行了简要分析,由于能力有限,水平一般,有不正当之处请指正。 每篇博文都是作者学习之路的结晶。

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