上篇用ArrayList为例说了说List这种集合。ArrayList很好用,既可以和数组一样按着顺序存数据,也可以存放不同类型的数据,还可以自动更改自己大小来装更多东西,这麻袋确实不错。可还是有个缺点,你无时不刻都得记得下标。元素少的时候还好说,可万一多了呢?很可能就忘了123指的是哪个值。所以,第二种集合就来帮助咱们了。第二种集合叫做Map,同样也在java.util包下。java文档上说Map也是一个接口,下面有几个map类来实现这个接口,其中比较有代表性的一个叫Hashmap,一个叫Hashtable。
这两个其实也有很多相似点,我们还是挑一个来讲,用HashMap。首先不管是HashMap还是HashTable,它都有Hash这个词。Hash咱们给它翻译得很洋气,直接翻译,就叫哈希,其实就是映射的意思。不得不说,还是很晦涩。其实映射就是对应的意思,用个逼格高一点的词显得有文化。那把什么对应起来?把键和值对应起来。上节课讲ArrayList时说了一个手机的例子,当时是把iphone手机的名称(name)、尺寸和价格都装在了ArrayList中。但如果要是放在Hashmap中,它的结构就会变成这个样子:
“键”指的是表里的名称,你可以随便起名;“值”当然指的就是具体存储的数据。我只要访问name就可以找到iphone X,访问size就可以找到6.6f,访问price就可以找到100,没有数组中下标这么一说,更不在乎元素的顺序。声明一个Hashmap的格式是
执行这个语句就创建了一个空的HashMap。往ArrayList里添加元素的方法是add(),而HashMap是put(),这也是HashMap API中第一个常用的方法。我们把手机这个例子改成用HashMap实现,新建java项目MobileHashMap -> 包com.test -> Test.java,程序如下:
现在hm就装了三组键值对,也就是上面那张图的存储模式。第二个常用方法当然就是从HashMap里取值,用的方法是get(key),接收的参数就是其中某一个刚定义的键:
访问key就能取得值,根本不用考虑元素的顺序。键其实就是一个值得索引,而且像ArrayList一样,值也可以是任意类型的。你看我上面有字符串,有整型,还有浮点型。咱们还没有讲泛型,暂时你可以用任意的数据。
如果打印整个键值对呢?对于数组和ArrayList我们当时都怎么打印出来的?是不是用for循环遍历打印?Hashmap不用,你可以直接打印Hashmap的名称:
嗯,打印出了全部键值对。你看,明明我第一个添加的是{name=iphone X},但打印出来成了最后一个。这也再次证明了Hashmap不像ArrayList或是数组那样有顺序。Hashmap是散列的,它按照自己的机制显示,很有可能每次打印出来顺序不一样。不过对于Map类型的集合来说,我们不在乎它们的顺序,在乎的是它的查询索引是不是正确的,也就是说我能不能通过一个键找到我想要的值。有人说那可不可以遍历整个键值对?我偏偏不喜欢容易的方法,就喜欢难的。没问题,可以遍历。不过它的遍历感觉有点特殊,用到的方法是keySet(),先看我写程序:
一句一句看。用类实例hm调用keySet()就会返回所有的键。Keyset嘛,key是键,set是集合,合起来“键的集合”,字面上就能理解。后面接着一个iterator()方法。iterator的意思是浮标,调用这个方法就会产生一个浮标类型的对象i。有人问什么是浮标。之前我们讲对象引用时说指向一个类实例,也就是说它存的是一个类实例的地址。大家可以把浮标简单地理解就是一种特殊的对象引用,它默认指向“键的集合”中第一个键之前。注意,是第一个键之前(此时还没指向第一个键呢):
接下来用while循环。i.hasNext返回一个布尔值,它和后面那句key=i.next().toString()合起来的意思是如果有下一个键那么就指向下一个键。刚才我说了,浮标在循环之前默认指向“键的集合”中第一个键之前。这样第一次循环后,下一个键指得就是第一个键:
因为键是字符串类型的,所以要toString强转,强转完就得到了第一个键的值。最后用刚刚学的get方法再得到值。第一次循环结束后再次判断是否有下一个键,如果有就指向第二个键并取值:
以此类推,直到最后i.hasNext()返回false,也就是说没有下一个键了,则跳出循环:
这就是HashMap的遍历过程。和数组以及ArrayList一样,Hashmap也可以放引用类型。大家可以参考ArrayList那个里皮老爷子的例子自己试着写写。大同小异,程序如下:
Staff.java:
Test.java:
这篇文章的源代码是MobileHashMap和LippisTaskHashMap项目,下篇介绍集合里边另一个概念 - 泛型。
本篇知识点及注意事项:
1. Hashmap通过键值对存储数据,没有数组下标这么一说,更不在乎元素的顺序。
2. Hashmap通过浮标遍历元素。浮标简单理解就是一种特殊的对象引用,它默认指向“键的集合”中第一个键之前。
网友评论