•实现Map接口的集合类用来存储键-值映射对。•JDKAPI中Map接口的实现类常用的有–HashMap–TreeMap–Hashtable(不常用)•Map实现类中存储的键-值映射对是通过键来唯一标识,Map底层的键是用Set来存放的。•所以存入HashMap中的映射对的键如果是自定义的类,应该重写hashCode()和equals()方法。–常用String作为Map的键。1•MapK,V接口中定义的一些常用方法:–Vput(Kkey,Vvalue)//将指定的键-值对存入Map中–Vget(Objectkey);//返回指定键所映射的值–Vremove(Objectkey);//根据指定的键把此键-值对从Map中移除。–booleancontainsKey(Objectkey);//判断此Map是否包含指定键的键-值对。–booleancontainsValue(Objectvalue);//判断此Map是否包含指定值的键-值对。–booleanisEmpty();//判断此Map中是否有元素。–intsize();//获得些Map中键-值对的数量。–voidclear();//清空Map中的所有键-值对。–SetKkeySet();//返回此Map中包含的键的Set集。–CollectionVvalues();//返回此Map中包含的值的Collection集。值是可重复的.2•HashMap内部对键用Set进行散列存放。所以根据键去取值的效率很高。•它是使用频率最高的一个集合。•补充:封装类对象的hashCode()3Demo•J1406班有若干个学生Student:(1,孙东旭,92;2,文达,91;.....)是按照学号排序的有序列表•J1407班有若干个学生Student:(1,张三,89;2,李四,98;......)是按照学号排序的有序列表•.....其他班级.....•经常要通过班级的名字来查询按学号排序的学生信息,HashMapString,ListStudent;•创建map,存入至少两个班级的键值对信息,并遍历所有的键,根据键获取对应的List,并遍历出每个Student对象.Demo•学生属性:姓名,年龄。•注意:姓名和年龄相同的视为同一个学生,保证学生的唯一性。•1.定义学生Student类。•2.每一个学生Student都有对应的所属城市(String)定义map容器。将学生类作为键,所属城市作为值存入。•3.根据指定的key获取map集合中对应的值。•4.遍历输出map集合中的键值对.•Hashtable是JDK1.0就有了,HashMap是JDK1.2引入的,操作大多跟Hashtable相同,建议使用HashMap.•Hashtable(注意大小写)–是同步的(线程安全的);–不能有null键,也不能有null值,否则运行时出空指针异常;–基于陈旧的DictionaryK,V类,有contains()方法,用于测试此映射表中是否存在指定值,等同于HashMap类中的containsValue()(本类中也有)6Hashtable与HashMap的不同(笔试常考)Hashtable与HashMap的不同(笔试常考)•HashMap–是不同步的(线程非安全的);–能存储最多一个null键,任意多个null值;–有containsKey(),containsValue()方法,没有contains()方法–继承AbstractMapK,V•TreeMap内部使用红黑树结构对key进行排序存放,所以放入TreeMap中的key-value对的key必须是可排序的。•TreeMap()使用键的自然顺序构造一个新的、空的树映射。•TreeMap(Comparator?superKcomparator)构造一个新的、空的树映射,该映射根据给定比较器进行排序。8TreeMap练习•学生对象的排序规则为:先姓名升序排序,同名则再年龄升序排序。•每一个学生Student都有对应的所属城市。•1,定义学生Student类。•2,在场景类中定义TreeMap容器(用无参和有参的,匿名内部类)。将学生类作为键,所属城市作为值存入。•3,根据key获取TreeMap集合中的值。•4,遍历输出TreeMap集合中的键值对.TreeMap练习•sdfgzxcvasdfxcvdf获取该字符串中的每个字母出现的次数。希望打印结果a(1)c(2).....按照字母自然顺序打印•提示:1.定义一个map集合,因为打印结果的字母有顺序,所以使用TreeMapCharacter,Integer集合。2.遍历字符数组。将每一个字母作为键去查map集合。如果返回null,将该字母和1存入到map集合中。如果返回不是null,说明该字母在map集合已经存在并有对应次数。那么就获取该次数并进行自增,然后将该字母和自增后的次数存入到map集合中,覆盖调用原来键所对应的值。3.将map集合中的数据变成指定的字符串形式返回。•Map.Entry是Map中内部定义的一个static接口,专门用来保存keyvalue的内容。•Map与Map.Entry11keykeyvaluevaluekeyvalue增加元素Map.EntryMap.EntryMap.EntryMap.Entry•对于Map接口来说,其本身是不能直接使用迭代进行输出的,因为Map中的每一个位置存放的是一对值(keyvalue),而Iterator中每次只能找到一个值。所以如果非要使用迭代进行输出的话,要按照以下操作步骤完成:–1.将Map的实例通过entrySet()方法变为Set接口对象–2.通过Set接口的实例的iterator()将Iterator实例化–3.通过Iterator迭代输出,每个内容都是Map.Entry的对象–4.通过Map.Entry进行keyvalue的分离。getKey,getValue•Map大多时候用于存放和查找,遍历输出属于少数操作。12Map.EntrySetEntryStudent,Stringset=map.entrySet();IteratorEntryStudent,Stringit=set.iterator();while(it.hasNext()){EntryStudent,Stringentry=it.next();Studentkey=entry.getKey();Stringvalue=entry.getValue();}•选择标准:–存放要求•无序,无下标,不能随机访问-Set•有序,有下标,可以随机访问-List•不可重复--Set•可重复--List•key-value对,较多存放和查询,较少遍历-Map–读和改(插入删除)的效率•Hash*-两者都最高•ArrayList-读(指定下标随机访问)快,插入/删除元素慢•LinkedList-读(指定下标随机访问)慢,插入/删除元素快14自定义泛型•自定义泛型和受限制的泛型目的是:在定义类时,就说明在使用类中的某些方法的时候,参数(或返回值)要使用一些类型(或其子类型)•当希望定义一个变量去接收某个类型或者其子类型时可以这样声明:自定义泛型publicclassMyGenericsT{privateTfield;//如果类上已经定义泛型T,则可以直接使用publicvoidsetField(Tf){this.field=f;//获得f的类型System.out.println(f.getClass());}publicTgetField(){returnthis.field;}//如果类上没有定义该泛型,则需要方法自行定义Mvoidget2(Mm){}staticPvoidget3(Pp){}}受限制的泛型•让类型参数继承一个类或者实现接口importjava.util.*;//限制了T必须是List或者它的子类型,不要用implements关键字classMyGenericsTextendsList{//将来在擦除T的时候,必须是List或其子类型privateTfield;publicvoidsetField(Tf){this.field=f;//获得f的类型System.out.println(f.getClass());}publicTgetField(){returnthis.field;}publicstaticvoidmain(Stringuu[]){MyGenericsListmm1=newMyGenericsList();MyGenericsArrayListmm2=newMyGenericsArrayList();MyGenericsMapmm3=newMyGenericsMap();//error}}受限制的泛型•ArrayListMaplist=newArrayListHashMap();//error•MyGenerics?extendsMapg1;•g1=newMyGenericsHashMap();//ok•g1=newMyGenericsHashtable();//ok•g1=newMyGenericsLinkedHashMap();//ok受限制的泛型•staticvoidm1(ListPersonl){...}–不能传入ListPerson的子类类型•staticvoidm2(List?extendsPersonl){...}–可以传入ListPerson或Person的子类类型•staticKvoidget2(ListKkList){。。。}–1.必须在方法头部显示定义泛型K,2.无需对象造型可以直接get•staticvoidget1(List?list){。。。}–1.无需定义泛型类型,2.使用时需要显式进行对象造型受限制的泛型•staticvoidmethod(Collection?a){•//是对T的一种简化,如果是方法上定义的泛型,用?可以避免使用T在方法头部。但?不能自动造型,不能直接使用子类中的新增方法。}受限制的泛型•?superTT类型或其父类类型,在定义Comparator实现类时可以指定Person类型,并将其传入TreeSet.•这样可以向Set中存储使用同样比较规则的Person的子类Student,Teacher对象,•TreeSet(Comparator?superEcomparator)受限制的泛型TreeSetStudentset=newTreeSetStudent(newComparatorPerson(){@Overridepublicintcompare(Personarg0,Personarg1){return0;}});导出项目代码•在java工程上点鼠标右键•选择Export(导出)•在General下面找到FileSystem•点击Todirectory右侧的Browse按钮选择保存的路径•Finish•Collection接口•Iterator接口•Comparable接口(自然顺序比较,TreeSet,TreeMap)、Comparator接口(自定义比较器,TreeSet,TreeMap)•Set、List、Map接口•Collections类•ArrayList、LinkedList、Vector类•HashSet、LinkedHashSet、TreeSet类•HashMap、Hashtable、TreeMap类•集合的泛型操作(JDK5.0)•用增强的for循环(JDK5.0)遍历Collection24•1.创建一个User类,有name,password两个成员变量。在主函数中使用for循环创建10个User对象,并对成员变量赋值,在for循环中把10个User对象加入到一