一:基础公共方法(map不再是简单的加索引,可以直接命名key,通过key进行遍历)
1.常见的map子类
HashTable:底层是哈希表结构。不允许null键和null值,线程同步
HashMap:底层是哈希表结构,可以允许null键和null值,线程不同步
TreeMap:底层是二叉树结构,线程不同步,可以给map的键排序
2.map程序--公共的方法
1 import java.util.Collection; 2 import java.util.HashMap; 3 import java.util.Iterator; 4 import java.util.Map; 5 6 public class Test60 { 7 8 public static void main(String[] args) { 9 MaphashMap=new HashMap<>();10 //增11 hashMap.put(1, "java1");12 hashMap.put(2, "java2");13 hashMap.put(3, "java3");14 //判断15 System.out.println(hashMap.containsKey(2));16 System.out.println(hashMap.containsValue("java2"));17 System.out.println(hashMap.isEmpty());18 //删除19 System.out.println(hashMap.remove(3));20 //获取121 System.out.println(hashMap);22 System.out.println(hashMap.get(2));23 //获取224 Collection col=hashMap.values();//values方法返回的是Collection,这时候可以使用迭代器迭代出成员。25 Iterator it=col.iterator();26 while(it.hasNext()){27 System.out.println(it.next());28 }29 }30 31 }
3.运行结果
二:map遍历的两个重要方法
1.keyset的使用
把map转换成Set类型,就是将所有的键存入到Set<K>中。
再使用get(K)来获得对应的value值。
1 import java.util.HashMap; 2 import java.util.Iterator; 3 import java.util.Map; 4 import java.util.Set; 5 public class Test61 { 6 public static void main(String[] args) { 7 MaphashMap=new HashMap<>(); 8 hashMap.put(1, "java1"); 9 hashMap.put(2, "java2");10 hashMap.put(3, "java3");11 Set keySet=hashMap.keySet();12 Iterator it=keySet.iterator();13 while(it.hasNext()){14 Integer key=it.next();15 String value=hashMap.get(key);16 System.out.println(key+":"+value);17 }18 }19 }
2.运行结果
3.entrySet的使用
返回包含键值关系的Set视图,返回值放入Set中,类型是Map.Entry<K,V>。
得到映射关系后,可以选择的方法是getKey与getValue分别取出key与value。
1 public static void main(String[] args) { 2 MaphashMap=new HashMap<>(); 3 hashMap.put(1, "java1"); 4 hashMap.put(2, "java2"); 5 hashMap.put(3, "java3"); 6 Set > set=hashMap.entrySet(); 7 Iterator > itr=set.iterator(); 8 while(itr.hasNext()){ 9 Map.Entry mapentry= itr.next();10 Integer key=mapentry.getKey();11 String value=mapentry.getValue();12 System.out.println(key+"::"+value);13 }14 }
4.运行结果
三:map扩展
1.HashMap
保证学生对象的唯一性。
对学生对象的id进行排序。
1 import java.util.Iterator; 2 import java.util.Map; 3 import java.util.Set; 4 import java.util.TreeMap; 5 public class Test63 { 6 public static void main(String[] args) { 7 TreeMaptm=new TreeMap<>(); 8 tm.put(new Student(1,"zhangsan"),"beijing"); 9 tm.put(new Student(2,"lisi"),"shanghai");10 tm.put(new Student(4,"zhaoliu"),"hangzhou");11 tm.put(new Student(3,"wangwu"),"shenzhen");12 tm.put(new Student(2,"lisi"),"shanghai");13 Set > set=tm.entrySet();14 Iterator > itr=set.iterator();15 while(itr.hasNext()){16 Map.Entry me=itr.next();17 Student stu=me.getKey();18 String str=me.getValue();19 System.out.println(stu+"::"+str);20 } 21 }22 }23 class Student implements Comparable {24 private int id;25 private String name;26 Student(int id,String name){27 this.id=id;28 this.name=name;29 }30 public int getId() {31 return id;32 }33 public void setId(int id) {34 this.id = id;35 }36 public String getName() {37 return name;38 }39 public void setName(String name) {40 this.name = name;41 }42 public int compareTo(Student s){43 int num=new Integer(this.id).compareTo(new Integer(s.id));44 if(num==0){45 return name.compareTo(s.name);46 }47 return num;48 }49 public int hashCode(){50 return name.hashCode()+id*19;51 }52 public boolean equals(Object obj){53 if(!(obj instanceof Student)){54 return false;55 }56 Student s = (Student) obj;57 return this.name.equals(s.name)&&this.id==s.id;58 }59 @Override60 public String toString() {61 return "id=" + id + ", name=" + name;62 }63 64 }
2.运行结果
可以进行排序,学生具备了自然排序的功能(comparable接口),并且对于重复的记录只会保存一条
3.TreeMap
对学生对象的name进行排序,同时保持id具备自身的比较性。
student对象仍然是上面例子中的对象,不再改动。
1 import java.util.Comparator; 2 import java.util.Iterator; 3 import java.util.Map; 4 import java.util.Set; 5 import java.util.TreeMap; 6 7 public class Test64 { 8 public static void main(String[] args) { 9 TreeMaptm=new TreeMap<>(new StunameComparator());10 tm.put(new Student(1,"zhangsan"),"beijing");11 tm.put(new Student(2,"lisi"),"shanghai");12 tm.put(new Student(4,"zhaoliu"),"hangzhou");13 tm.put(new Student(3,"wangwu"),"shenzhen");14 tm.put(new Student(2,"lisi"),"shanghai");15 Set > set=tm.entrySet();16 Iterator > itr=set.iterator();17 while(itr.hasNext()){18 Map.Entry me=itr.next();19 Student stu=me.getKey();20 String str=me.getValue();21 System.out.println(stu+"::"+str);22 } 23 }24 }25 class StunameComparator implements Comparator {26 27 @Override28 public int compare(Student s1, Student s2) {29 int num=s1.getName().compareTo(s2.getName());30 if(num==0){31 return new Integer(s1.getId()).compareTo(s2.getId());32 }33 return num;34 }35 36 }
4.运行结果
5.小练习(统计字符串中出现的字符次数)
1 import java.util.Iterator; 2 import java.util.Map; 3 import java.util.Set; 4 import java.util.TreeMap; 5 6 public class Test65 { 7 public static void main(String[] args) { 8 String s=charCount("aaabdd"); 9 System.out.println(s);10 }11 private static String charCount(String str) {12 char[] arr=str.toCharArray();13 TreeMaptm=new TreeMap<>();14 int count=0;15 for(int i=0;i ='a'&&arr[i]<='z'||arr[i]>='A'&&arr[i]<='Z'))17 continue;18 Integer value=tm.get(arr[i]);19 System.out.println("-----"+value);20 if(value!=null)21 count=value;22 count++;23 tm.put(arr[i], count);24 count=0;25 }26 StringBuffer sb=new StringBuffer();27 Set > entry=tm.entrySet();28 Iterator > itr=entry.iterator();29 while(itr.hasNext()){30 Map.Entry me=itr.next();31 Character ch=me.getKey();32 Integer value=me.getValue();33 sb.append(ch+"("+value+")");34 }35 return sb.toString();36 }37 }
6.运行结果