13.2 相关知识点:容器
在编程过程中,时常有若干数据需要存储起来,并且需要对这些数据进行一些增删改查的操作。批量的数据需要根据数据的关系和特点,采用适当的数据结构进行存储。
在本例中,需要在服务器存储一系列的username-socket数据对,并且由username可以方便地获得此username所对应的socket。我们把这种情形下的每一对数据称为key-value键值对,其中的key是唯一的,可以直接由key获得它对应的value。
Java在java.util包中提供了一系列的容器类,用来存储和管理批量的对象。其中Map(影射)接口及其实现类就是用来对key-value键值对的数据结构进行管理的。Map接口的常用实现类是Hash Map(Hash是一种数据存储的算法)。在代码13.1中,Hash Map用来存储一系列键值对,其中,“键”是用户名,“值”是地址。
【代码13.1】Hash Map案例
代码13.1的运行结果:
lily的地址广东省广州市
删除lily的信息
所有的用户名:
用户名:orange
用户名:apple
所有的地址:
地址湖南省长沙市
地址广东省深圳市
所有的用户名-地址:
用户名:orange地址湖南省长沙市
用户名:apple地址广东省深圳市
代码13.1的第3行创建了Hash Map对象hm。对于容器,是允许加入任何类型的对象的,这样就不能检查是否加了类型不恰当的对象,而且,从容器中取出对象的时候,取出的对象可能是任何类型,必须根据情况进行类型转换。为了避免这些情况,在定义容器的时候,就需要规定加入容器的对象类型。代码13.1的第3行“<>”中的类型就是当前容器允许加入的对象的类型,“Hash Map<String,String>hm=new Hash Map<String,String>();”就是声明hm容器中只能加入键类型为String,值类型为String的键值对,如果类型不符合,编译就会出错,并且,从容器hm中取出的键值对一定是String-String类型,不需要再进行类型转换。这种对容器中对象的类型限制叫作泛型。
第5行到第7行用put()方法向容器中存入键值对。
第10行用get()方法给出key,获得对应的value。
第14行用remove()方法删除某个key对应的键值对。
第18行到第20行访问容器中所有的键。用keySet()方法获得容器中所有键的集合,用for-each循环访问集合中所有的元素。
第23行到第25行访问容器中所有的值。用values()方法获得容器中所有值的集合,用for-each循环访问集合中所有的元素。
第28行到第31行将容器中的每个键值对作为一个Entry对象,用entrySet()方法获得容器中所有键值对的集合,用for-each循环访问集合中每个键值对的键和值。
以上是Hash Map容器主要的增、删、查、遍历的用法。