JAVASE----11----Map集合

来源:互联网 发布:mac桌面软件 编辑:程序博客网 时间:2024/06/06 00:10
Map

1--HashTable: 底层是哈希表数据结构,不可以存入null健null值。该集合是线程同步的。 jdk1.0,效率低。
2--HashMap:底层是哈希表数据结构,允许使用null健null值。该集合是不同步的。jdk1.2,效率高。

3--TreeMap:底层是二叉树数据结构,线程不同步。可以用于给map集合中的健进行排序。

和Set很像,其实,Set底层就是使用了Map集合。



基本方法:

import java.util.Collection;import java.util.HashMap;import java.util.Map;public class MapDemo {/** * @param args */public static void main(String[] args) {Map<String, String> map = new HashMap<String, String>();// 添加元素,如果出现添加时,有相同的键,后面添加的值会覆盖原有的键对应的值,并put方法会返回被覆盖的值。map.put("01", "zhangsan");map.put("01", "zhangsan01");map.put("02", "lisi");map.put("03", "wangwu");System.out.println(map.containsKey("01"));    //trueSystem.out.println(map.remove("02"));   //lisiSystem.out.println(map.get("02"));      //null//可以通过get方法的返回值来判断一个键是否存在,通过返回null来判断。System.out.println(map.get("03"));     //wangwu     //获取map集合中所有值    Collection<String>coll=map.values();    System.out.println(coll);   //[zhangsan01, wangwu]System.out.println(map);     //{01=zhangsan01, 03=wangwu}}}


取值方式:

import java.util.HashMap;import java.util.Iterator;import java.util.Map;import java.util.Set;public class MapDemo02 {/** * Map集合中的2中取出方式: 1,keySet:将map中所有键存入到Set集合中。因为Set具备迭代器。 * 所一可以用迭代方式取出所有的键,在根据get方法。获取每一个键对应的值。 *  *  */public static void main(String[] args) {Map<String, String> map = new HashMap<String, String>();map.put("01", "zhangsan");map.put("04", "zhangsan01");map.put("02", "lisi");map.put("03", "wangwu");// 先获取map集合所有键的Set集合,keySet();Set<String> keySet = map.keySet();//通过Set集合就可以获取迭代器Iterator<String>it=keySet.iterator();while(it.hasNext()){   String key=it.next();//有了键通过map集合的get方法获取其对应的值。String value=map.get(key);System.out.println(value);//result: //zhangsan01//zhangsan//lisi//wangwu}}}




import java.util.HashMap;import java.util.Iterator;import java.util.Map;import java.util.Set;public class MapDemo02 {/** * Map集合的取出原理:将map集合转成set集合,再通过迭代器取出。 *  * 2, Set<Map.Entry<k,v>>entrySet: 将map集合中的映射关系存入到了set集合中,而这个关系的数据类型就是: * Map.Entry */public static void main(String[] args) {Map<String, String> map = new HashMap<String, String>();map.put("01", "zhangsan");map.put("04", "zhangsan01");map.put("02", "lisi");map.put("03", "wangwu");//将Map集合中的映射关系取出,存入到Set集合中。Set<Map.Entry<String, String>> entrySet=map.entrySet();Iterator<Map.Entry<String, String>> it=entrySet.iterator();while(it.hasNext()){Map.Entry<String, String>me=it.next();String key=me.getKey();String value=me.getValue();System.out.println(key+"="+value);//result://04=zhangsan01//01=zhangsan//02=lisi//03=wangwu}}}/* * Map.Entry 其实Entry也是一个接口,它是Map接口中的一个内部接口。 * interface  Map * { *   public static interface Entry *   { *      public  abstract Object getKey(); *      public  abstract Object getValue(); *   } * } *  */





练习一:

import java.util.Collection;import java.util.HashMap;import java.util.Iterator;import java.util.Map;import java.util.Set;/* 每个学生都有对应的归属地 * 保证学生的唯一性。 *  * 1,描述学生 * 2,定义map容器,将学生作为健,地制作为值传入。 * 3,获取map集合中的元素。 */class Studentx implements Comparable<Studentx> {private String name;private int age;public Studentx(String name, int age) {super();this.name = name;this.age = age;}public String getName() {return name;}public void setName(String name) {this.name = name;}public int getAge() {return age;}public void setAge(int age) {this.age = age;}public String toString() {return name + ":" + age;}@Overridepublic int hashCode() {return name.hashCode() + age * 34;}@Overridepublic boolean equals(Object obj) {if (!(obj instanceof Studentx))throw new ClassCastException("数据类型不匹配");Studentx s = (Studentx) obj;return this.name.equals(s.name) && this.age == s.age;}@Overridepublic int compareTo(Studentx s) {int num = new Integer(this.age).compareTo(new Integer(s.age));if (num == 0) {return this.name.compareTo(s.name);}return num;}}public class Mapexercise {public static void main(String[] args) {HashMap<Studentx, String> hm = new HashMap<Studentx, String>();hm.put(new Studentx("lisi1", 21), "beijing");hm.put(new Studentx("lisi2", 20), "shanghai");hm.put(new Studentx("lisi3", 19), "shenzhen");hm.put(new Studentx("lisi4", 18), "guangzhou");hm.put(new Studentx("lisi4", 17), "changsha"); //会存入//hm.put(new Studentx("lisi4", 18), "changsha"); //会覆盖guangzhou//第一种取出方式 keySet   Set<Studentx> keySet = hm.keySet();          Iterator<Studentx>iT=keySet.iterator();          while(iT.hasNext())          {             Studentx key=iT.next();              String value=hm.get(key);              System.out.println(value);                        }  // 第二种取出方式Set<Map.Entry<Studentx, String>> entrySet = hm.entrySet();Iterator<Map.Entry<Studentx, String>> it = entrySet.iterator();while (it.hasNext()) {Map.Entry<Studentx, String>me=it.next();Studentx key=me.getKey();String value=me.getValue();System.out.println(key.getName()+"="+value);}}}

把学生类按姓名排序;

class StuNameComparator implements Comparator<Studentx>{@Overridepublic int compare(Studentx s1, Studentx s2) {int num=s1.getName().compareTo(s2.getName());if(num==0){return s1.getAge()-s2.getAge();}     return  num;}}

TreeMap<Studentx, String> hm = new TreeMap<Studentx, String>(new StuNameComparator());
排序成功。


练习2:

import java.util.Iterator;import java.util.Map;import java.util.Set;import java.util.TreeMap;public class Mapexercise2 {/** * 获取字符串中的字母出现次数: a(1)c(2)....... * 当发现有映射关系时,可以选择map集合,因为map集合中存放的就是映射关系。 *  * 思路: * 1,将字符串转换成字符数组,因为要对每一个字母进行操作。 * 2,定义一个map集合,因为打印结果的字母有顺序,所以使用treemap集合。 * 3,便利字符数组,将每一个字母作为键去查map集合。 * 如果返回null,将该字母和1存入想到map集合中。 * 如果返回不是null,说明该字母在map集合已经存在并有对应的次数。 * 那么就获取该次数并进行自增,然后将该字母和自增后的次数存入到map集合中,覆盖原来键所对应的值。 * 4,将map集合中的数据变成指定的字符串形式返回。 */public static void main(String[] args) {String s=charCount("aasdasdasdsdfgfdfas");System.out.println(s);}public static String charCount(String str){char[]chs=str.toCharArray();TreeMap<Character,Integer>tm=new TreeMap<Character,Integer>() ;int count=0;for(int x=0;x<chs.length;x++){Integer value=tm.get(chs[x]);/*if(value==null){tm.put(chs[x], 1);}else{value=value+1;tm.put(chs[x], value);}*/if(value!=null)count=value;count++;tm.put(chs[x], count);count=0;}StringBuilder sb=new StringBuilder();Set<Map.Entry<Character, Integer>> entrySet = tm.entrySet();Iterator<Map.Entry<Character, Integer>> it = entrySet.iterator();while (it.hasNext()) {Map.Entry<Character, Integer>me=it.next();Character key=me.getKey();Integer value=me.getValue();sb.append(key+"("+value+")");}return sb.toString();}}






原创粉丝点击