1.1概述
  现实生活中,咱们常会看到这样的一种调集:IP地址与主机名,身份证号与个人,体系用户名与体系用户目标等,这种一一对应的联系,就叫做映射。Java供给了专门的调集类用来存放这种目标联系的目标,即java.util.Map接口。
  咱们经过检查Map接口描述,发现Map接口下的调集与Collection
  接口下的调集,它们存储数据的办法不同,如下图。
  Collection中的调集,元素是孤立存在的(理解为单身),向调会集存储元素选用一个个元素的办法存储。
  Map中的调集,元素是成对存在的(理解为夫妻)。每个元素由键与值两部分组成,经过键能够找对所对应的值。
  Collection中的调集称为单列调集,
  Map中的调集称为双列调集。
  需求注意的是,Map中的调集不能包括重复的键,值能够重复;每个键只能对应一个值。
  1.2Map的常用子类
  经过检查Map接口描述,看到Map有多个子类,这里咱们首要解说常用的HashMap调集、LinkedHashMap调集。
  HashMap:存储数据选用的哈希表结构,元素的存取顺序不能确保共同。因为要确保键的仅有、不重复,需求重写键的hashCode()办法、equals()办法。LinkedHashMap:HashMap下有个子类LinkedHashMap,存储数据选用的哈希表结构+链表结构。经过链表结构能够确保元素的存取顺序共同;经过哈希表结构能够确保的键的仅有、不重复,需求重写键的hashCode()办法、equals()办法。TreeMap:TreeMap调集和Map比较没有特有的功用,底层的数据结构是红黑树;能够对元素的键进行排序,排序办法有两种:自然排序和比较器排序tips:Map接口中的调集都有两个泛型变量,在运用时,要为两个泛型变量赋予数据类型。两个泛型变量的数据类型能够相同,也能够不同。
  1.3Map的常用办法
  Map接口中定义了很多办法,常用的如下:
  publicVput(Kkey,Vvalue):把指定的键与指定的值增加到Map调会集。
  publicVremove(Objectkey):把指定的键所对应的键值对元素在Map调会集删去,回来被删去元素的值。
  publicVget(Objectkey)依据指定的键,在Map调会集获取对应的值。
  publicSetkeySet():获取Map调会集一切的键,存储到Set调会集。
  publicSet>entrySet():获取到Map调会集一切的键值对目标的调集(Set调集)。
  publicbooleancontainKey(Objectkey):判别该调会集是否有此键。
  Map接口的办法演示
  publicclassMapDemo{publicstaticvoidmain(String[]args){//创立map目标HashMapmap=newHashMap();//增加元素到调集map.put("黄晓明","杨颖");map.put("文章","马伊琍");map.put("邓超","孙俪");System.out.println(map);//Stringremove(Stringkey)System.out.println(map.remove("邓超"));System.out.println(map);//想要检查黄晓明的媳妇是谁System.out.println(map.get("黄晓明"));System.out.println(map.get("邓超"));}}
  tips:运用put办法时,若指定的键(key)在调会集没有,则没有这个键对应的值,回来null,并把指定的键值增加到调会集;若指定的键(key)在调会集存在,则回来值为调会集键对应的值(该值为替换前的值),并把指定键所对应的值,替换成指定的新值。
  1.4Map的遍历
  办法1:键找值办法
  经过元素中的键,获取键所对应的值
  剖析步骤:
  获取Map中一切的键,因为键是仅有的,所以回来一个Set调集存储一切的键。办法提示:keyset()遍历键的Set调集,得到每一个键。依据键,获取键所对应的值。办法提示:get(Kkey)遍历图解:
  办法2:键值对办法
  即经过调会集每个键值对(Entry)目标,获取键值对(Entry)目标中的键与值。
  Entry键值对目标:
  咱们现已知道,Map中存放的是两种目标,一种称为key(键),一种称为value(值),它们在在Map中是一一对应联系,这一对目标又称做Map中的一个Entry(项)。
  Entry将键值对的对应联系封装成了目标。即键值对目标,这样咱们在遍历Map调集时,就能够从每一个键值对(Entry)目标中获取对应的键与对应的值。
  在Map调会集也供给了获取一切Entry目标的办法:
  publicSet>entrySet():获取到Map调会集一切的键值对目标的调集(Set调集)。
  获取了Entry目标,表示获取了一对键和值,那么同样Entry中,别离供给了获取键和获取值的办法:
  publicKgetKey():获取Entry目标中的键。publicVgetValue():获取Entry目标中的值。操作步骤:
  获取Map调会集,一切的键值对(Entry)目标,以Set调集办法回来。办法提示:entrySet()遍历包括键值对(Entry)目标的Set调集,得到每一个键值对(Entry)目标。经过键值对(Entry)目标,获取Entry目标中的键与值。办法提示:getkey()getValue()tips:Map调集不能直接运用迭代器或者foreach进行遍历。但是转成Set之后就能够运用了。
  1.5HashMap存储自定义类型
  操练:每位学生(名字,年纪)都有自己的家庭住址。那么,既然有对应联系,则将学生目标和家庭住址存储到map调会集。学生作为键,家庭住址作为值。
  注意,学生名字相同而且年纪相同视为同一名学生。
  编写学生类:
  publicclassStudent{privateStringname;privateintage;//结构办法//get/set@Overridepublicbooleanequals(Objecto){if(this==o)returntrue;if(o==null||getClass()!=o.getClass())returnfalse;Studentstudent=(Student)o;returnage==student.age&&Objects.equals(name,student.name);}@OverridepublicinthashCode(){returnObjects.hash(name,age);}}
  编写测试类:
  publicclassHashMapTest{publicstaticvoidmain(String[]args){//1,创立Hashmap调集目标。Mapmap=newHashMap();//2,增加元素。map.put(newStudent("lisi",28),"上海");map.put(newStudent("wangwu",22),"北京");map.put(newStudent("wangwu",22),"南京");//3,取出元素。键找值办法SetkeySet=map.keySet();for(Studentkey:keySet){Stringvalue=map.get(key);System.out.println(key.toString()+"....."+value);}}}
  当给HashMap中存放自定义目标时,假如自定义目标作为key存在,这时要确保目标仅有,有必要复写目标的hashCode和equals办法(假如忘记,请回忆HashSet存放自定义目标)。假如要确保map中存放的key和取出的顺序共同,能够运用java.util.LinkedHashMap调集来存放。1.6LinkedHashMap介绍
  咱们知道HashMap确保成对元素仅有,而且查询速度很快,可是成对元素存放进去是没有顺序的,那么咱们要确保有序,还要速度快怎么办呢?
  在HashMap下面有一个子类LinkedHashMap,它是链表和哈希表组合的一个数据存储结构。
  publicclassLinkedHashMapDemo{publicstaticvoidmain(String[]args){LinkedHashMapmap=newLinkedHashMap();map.put("邓超","孙俪");map.put("李晨","范冰冰");map.put("刘德华","朱丽倩");Set>entrySet=map.entrySet();for(Entryentry:entrySet){System.out.println(entry.getKey()+""+entry.getValue());}}}
  成果:
  邓超孙俪
  李晨范冰冰
  刘德华朱丽倩
  1.7TreeMap调集
  1.TreeMap介绍
  TreeMap调集和Map比较没有特有的功用,底层的数据结构是红黑树;能够对元素的键进行排序,排序办法有两种:自然排序和比较器排序;到时运用的是哪种排序,取决于咱们在创立目标的时候所运用的结构办法;
  publicTreeMap()运用自然排序
  publicTreeMap(Comparatorcomparator)比较器排
  2.演示
  事例演示自然排序
  publicstaticvoidmain(String[]args){TreeMapmap=newTreeMap();map.put(1,"张三");map.put(4,"赵六");map.put(3,"王五");map.put(6,"酒八");map.put(5,"老七");map.put(2,"李四");System.out.println(map);}控制台的输出成果为:{1=张三,2=李四,3=王五,4=赵六,5=老七,6=酒八}
  事例演示比较器排序
  需求:
  创立一个TreeMap调集,键是学生目标(Student),值是居住地(String)。存储多个元素,并遍历。要求依照学生的年纪进行升序排序,假如年纪相同,比较名字的首字母升序,假如年纪和名字都是相同,认为是同一个元素;完成:
  为了确保age和name相同的目标是同一个,Student类有必要重写hashCode和equals办法publicclassStudent{privateintage;privateStringname;//省略get/set..publicStudent(){}publicStudent(intage,Stringname){this.age=age;this.name=name;}@OverridepublicStringtoString(){return"Student{"+"age="+age+",name='"+name+'\''+'}';}@Overridepublicbooleanequals(Objecto){if(this==o)returntrue;if(o==null||getClass()!=o.getClass())returnfalse;Studentstudent=(Student)o;returnage==student.age&&Objects.equals(name,student.name);}@OverridepublicinthashCode(){returnObjects.hash(age,name);}}publicstaticvoidmain(String[]args){TreeMapmap=newTreeMap(newComparator(){@Overridepublicintcompare(Studento1,Studento2){//先依照年纪升序intresult=o1.getAge()-o2.getAge();if(result==0){//年纪相同,则依照名字的首字母升序returno1.getName().charAt(0)-o2.getName().charAt(0);}else{//年纪不同,直接回来成果returnresult;}}});map.put(newStudent(30,"jack"),"深圳");map.put(newStudent(10,"rose"),"北京");map.put(newStudent(20,"tom"),"上海");map.put(newStudent(10,"marry"),"南京");map.put(newStudent(30,"lucy"),"广州");System.out.println(map);}控制台的输出成果为:{Student{age=10,name='marry'}=南京,Student{age=10,name='rose'}=北京,Student{age=20,name='tom'}=上海,Student{age=30,name='jack'}=深圳,Student{age=30,name='lucy'}=广州}
  1.8Map调集操练
  需求:
  输入一个字符串中每个字符呈现次数。
  剖析:
  获取一个字符串目标创立一个Map调集,键代表字符,值代表次数。遍历字符串得到每个字符。判别Map中是否有该键。假如没有,第一次呈现,存储次数为1;假如有,则阐明现已呈现过,获取到对应的值进行++,再次存储。打印最终成果办法介绍
  publicbooleancontainKey(Objectkey):判别该调会集是否有此键。
  代码:
  publicclassMapTest{publicstaticvoidmain(String[]args){//友谊提示System.out.println("请录入一个字符串:");Stringline=newScanner(System.in).nextLine();//定义每个字符呈现次数的办法findChar(line);}privatestaticvoidfindChar(Stringline){//1:创立一个调集存储字符以及其呈现的次数HashMapmap=newHashMap();//2:遍历字符串for(inti=0;i<line.length();i++){charc=line.charAt(i);//判别该字符是否在键会集if(!map.containsKey(c)){//阐明这个字符没有呈现过//那就是第一次map.put(c,1);}else{//先获取之前的次数Integercount=map.get(c);//count++;//再次存入更新map.put(c,++count);}}System.out.println(map);}}

posted on 2020-07-02 15:56  林口  阅读(407)  评论(0编辑  收藏  举报