JAVA之旅(二十二)
一.Map概述
一.Map概述泛型键值对,映射关系
基本特点
该集合存储键值对,是一对一对往里存,而且要保证键的唯一性
1.添加
put(key,values)
putAll()
2.删除
clear()
remove(objectkey)
3.判断
containsValue(Objectvalue)
containsKey(Objectkey)
isEmpty()
4.获取
get(Objectkey)
size()
values()
entrySet()
keySet()
我们的学习步骤也是这样来的,
二.子类对象特点
Map有三个子类
Hashtable
底层是哈希表数据结构,不可以存入null值或者键,该集合是线程同步的
HashMap
底层是哈希表数据结构,允许使用null的键值对,线程是不同步的。效率高
TreeMap
底层是二叉树数据结构,线程不同步,可以用于给map集合中的键进行排序
Map和Set很像,其实Set底层就是使用了Map集合
三.共性方法
我们看一下他们的共同点
packagecom.lgl.hellojava;
importjava.util.Collection;
importjava.util.HashMap;
importjava.util.Map;
publicclassHelloJJAVA{
publicstaticvoidmain(String[]args){
Mapmap=newHashMap();
//添加元素
map.put("001","zhangsan");
map.put("002","lisi");
map.put("003","wangwu");
System.out.println("原数据:"+map);
//判断是否存在002的key
System.out.println(map.containsKey("002"));
//刪除
System.out.println(map.remove("002"));
System.out.println("删除后:"+map);
//获取
System.out.println("获取:"+map.get("001"));
//可以通过get方法的返回值来判断一个键是否存在
map.put(null,"haha");
System.out.println("null:"+map);
//获取map集合中所有的值
Collectionvalues=map.values();
System.out.println("map的值:"+values);
}
}
这里可以看到输出的结果
但是这里要注意的是,添加元素,如果添加的时候,相同的键,那么后面的,会被后添加的覆盖原有的键对应的值,并put方法会返回被覆盖的值
四.keySet
想取出他的值,他并没有迭代器,那我们的思路可以转变一下拿到他的所有的键再去get不就可以拿到键值对了,我们来看一下
keySet
将map中所有的值存入到Set集合中,因为Set具备迭代器,所有可以迭代方法取出的所有的键,根据get方法,获取每一个键对应的值
packagecom.lgl.hellojava;
importjava.util.HashMap;
importjava.util.Iterator;
importjava.util.Map;
importjava.util.Set;
publicclassHelloJJAVA{
publicstaticvoidmain(String[]args){
Mapmap=newHashMap();
map.put("001","zhangsan");
map.put("002","lisi");
map.put("003","wangwu");
//先获取map集合中的所有键的Set集合
SetkeySet=map.keySet();
//有了Set集合就可以获取迭代器
Iteratoriterator=keySet.iterator();
while(iterator.hasNext()){
Stringstring=iterator.next();
//有了键可以通过map集合的get方法获取其对应的值
Stringvalue=map.get(string);
System.out.println("key:"+string+"values:"+value);
}
}
}
这种方法还是比较好理解的,对吧,但是这样比较麻烦,我们来看另一种
五.entrySet
packagecom.lgl.hellojava;
importjava.util.HashMap;
importjava.util.Iterator;
importjava.util.Map;
importjava.util.Map.Entry;
importjava.util.Set;
publicclassHelloJJAVA{
publicstaticvoidmain(String[]args){
Mapmap=newHashMap();
map.put("001","zhangsan");
map.put("002","lisi");
map.put("003","wangwu");
//将map集合中的映射关系取出,存入到Set集合中
Set>entrySet=map.entrySet();
Iterator>iterator=entrySet.iterator();
while(iterator.hasNext()){
Map.Entryentry=iterator.next();
System.out.println(entry.getKey()+":"+entry.getValue());
}
}
}
定义泛型虽然比较麻烦,但是取出来还是比较简单的,原理是什么?其实我们可以写一段伪代码来说明的
packagecom.lgl.hello;
publicclassHashMapimplementsMap{
classHahsimplementsMap.Entry{
@Override
publicObjectgetKey(){
//TODOAuto-generatedmethodstub
returnnull;
}
@Override
publicObjectgetValue(){
//TODOAuto-generatedmethodstub
returnnull;
}
}
}
interfaceMap{
publicstaticinterfaceEntry{
publicabstractObjectgetKey();
publicabstractObjectgetValue();
}
}
父子接口,直接访问,内部规则
六.Map小练习
我们可以通过一个小练习来学习一下使用规则,而需求,我直接写在注释上
packagecom.lgl.hellojava;
importjava.util.HashMap;
importjava.util.Iterator;
importjava.util.Map.Entry;
importjava.util.Set;
publicclassHelloJJAVA{
publicstaticvoidmain(String[]args){
/
每个学生都有对应的归属地学生Student,地址String学生属性:姓名和年龄
注意:姓名和年龄相同的视为同一个学生,保证学生的唯一性
1.描述学生2.定义Map容器,将学生作为键,地址作为值存入3.获取Map容器中的元素
/
HashMaphm=newHashMap();
hm.put(newStudent("zhangsan",15),"beijing");
hm.put(newStudent("lisi",16),"shanghai");
hm.put(newStudent("wangwu",17),"guangzhou");
hm.put(newStudent("liliu",10),"shenzhen");
//第一种取出方式keySet
SetkeySet=hm.keySet();
Iteratoriterator=keySet.iterator();
while(iterator.hasNwww.shanxiwang.netext()){
Studentstudent=iterator.next();
Stringaddr=hm.get(student);
System.out.println(student+":"+addr);
}
//第二种取出方式entrySet
Set>entrySet=hm.entrySet();
Iterator>iterator2=entrySet.iterator();
while(iterator2.hasNext()){
Entrynext=iterator2.next();
System.out.println(next.getKey()+":"+next.getValue());
}
}
}
/
描述学生
@authorLGL
/
classStudentimplementsComparable{
privateStringname;
privateintage;
publicStudent(Stringname,intage){
this.name=name;
this.age=age;
}
@Override
publicinthashCode(){
//TODOAuto-generatedmethodstub
returnname.hashCode()+age34;
}
@Override
publicbooleanequals(Objectobj){
if(!(objinstanceofStudent))
thrownewRuntimeException("类型不匹配");
Students=(Student)obj;
returnthis.name.equals(s.name)&&this.age==s.age;
}
publicStringgetName(){
returnname;
}
publicvoidsetName(Stringname){
this.name=name;
}
publicintgetAge(){
returnage;
}
publicvoidsetAge(intage){
this.age=age;
}
@Override
publicintcompareTo(Students){
intnum=newInteger(this.age).compareTo(newInteger(s.age));
if(num==0)
returnthis.name.compareTo(s.name);
returnnum;
}
}
|
|