网上关于HashMap的工作原理的文章多了去了,所以我也不打算再重复别人的文章。我就是有点好奇,我怎么样能更好的理解他的原理,或者说使用他的特性呢?最好的开发就是测试~
虽说不详讲hashmap的工作原理,但是起码的常识还是要提一下的。
一句话:hashmap最直观的表现是一维数组或者说一维字典,但是每个每个值又可以指向另一个数组或都字典!
一张图:
其实说实话,给我个人的感觉是,说链表只是显得高大上些罢了,当然这片面的理解,不过也是令人误解的地方。
我曾经就以为,链表真是个高大上的东西,那我怎样生成这样的链接呢?
难道是 HashMap.put("c", "xxx").put("sss", "ssssss"), 链式调用 ?
难道是 HashMap.get("c").put("ccx")?
难道是 HashMap.put("c", "1"); HashMap.put("c", "2"); HashMap.put("c", 333); ?
很显然,这是会犯错误的,因为IDE就不会让你通过过,编译是不会让你过的?
那么,回到这个问题上,什么叫链表?
百度百科解释:链表是一种物理存储单元上非连续、非顺序的存储结构,数据元素的逻辑顺序是通过链表中的指针链接次序实现的。链表由一系列结点(链表中每一个元素称为结点)组成,结点可以在运行时动态生成。每个结点包括两个部分:一个是存储数据元素的数据域,另一个是存储下一个结点地址的指针域。
那么,说白了,链表就是说,你这个key可以指向任何地方,当然也就包含了hashmap了。 所以想要形成多层链表,只要嵌套多个hashmap就可以了。
测试代码如下:
import java.util.HashMap; public class HashmapImprove { public static void main(String[] args) { HashMap<String, Object> hashMap1 = new HashMap<>(); HashMap<String, Object> hashMap2 = new HashMap<>(); HashMap<String, Object> hashMap3 = new HashMap<>(); hashMap1.put("h1-1", 2); hashMap1.put("h1-2", 336); hashMap2.put("hashmap1", hashMap1); hashMap2.put("h2-2", "moto"); hashMap2.put("h2-3", "xys"); hashMap3.put("hashmap2", hashMap2); hashMap3.put("h3-2", "3333"); hashMap3.put("h3-3", 2); System.out.println("hello, world." + hashMap3); } }
断点调试一下,清晰明了:
说得更直白一点,其实就是个多维数据,只是数据类型可以是任意的。当然了,其实现原理还是很高大上的,比如:链表、遍历!
遇到不懂的问题,测试一下就明白了!
做个不纠结的开发!哈哈