主要实现计数
java.util.Map
------->java.util.HashMap
------->java.util.TreeMap
------->java.util.Hashtable
java.util.HashMap(key/value)
1.基本操作
直接打印Map对象会打印key的toString=value的toString
get(key)得到value
containsKey(key) 是否包含key
遍历方式1:
把Map中所有的key都放入了Set集合,然后遍历Set
得到key,通过key获取value
Set set = map对象.keySet()
遍历方式2:放入HashMap集合中的key,value其实都会被包装成
Map.Entry这个内部类的属性,有一个健值对就存在一个
Map.Entry的实例对象,通过entrySet()方法就可以把
这些实例对象都放入Set集合中,遍历Set获取每个对象
Set set = Map对象.entrySet();
2.用HashMap的泛型实现基本操作避免强制类型转换
3.map.put(keyvalue) 如果key相同,那么value会覆盖之前的value
(如何才能判定key是否相同,注意equals和hashCode的实现)
这个特点特别适合用来做计数
案例:计算每个字符出现的次数
String s = "wwqajegjasrhgoihasijgolihaseg";
思路:拿到每个字符,作为key放入HashMap中
如果map中不存在,那么put(key,1)
如果已经存在那么put(key,value+1)
4.HashMap的数据结构(数组+链表的结构)
分析源代码
1).HashMap包含了一个Entry(key,value,next,hash)的内部类
key/value放入HashMap的时候会被包装秤Entry对象
2).HashMap成员就有Entry的数组,该数组的大小默认是12,永远是2的次防暑,如果自己
给的不是2的次方数,会转换成大于并最接近自己给出的2的次方数
put(key,value)时就是转换成Entry对象并放入数组中
3).put(key,value)方法的时下
a.根据key的hashCode进行hash运算(该算法不用关心)得到值hash
b.根据hash值去确定数组的位置 hash & (table.length-1)等价于hash%table.length
length是2的次方数。正好获取了数组的位置
一、未加泛型的HashMap
HashMap的元素添加和遍历
1 import java.util.HashMap; 2 import java.util.Map; 3 import java.util.Set; 4 5 6 public class HashMapDemo { 7 public static void main(String[] args) { 8 HashMap aa=new HashMap(); 9 User1 user=new User1("0001","zhangsan",10); 10 User1 user1=new User1("0002","lisi",11); 11 User1 user2=new User1("0003","wangmazi",12); 12 User1 user3=new User1("0004","xiaowang",13); 13 aa.put(user.id, user); 14 aa.put(user1.id, user1); 15 aa.put(user2.id, user2); 16 aa.put(user3.id, user3); 17 //打印元素数量 18 System.out.println(aa.size()); 19 /*遍历 20 * 方法一 21 */ 22 User1 user4=(User1)aa.get("0001"); 23 /*方法二 24 * */ 25 Set jj=aa.keySet(); 26 for (Object object : jj) { 27 User1 user5=(User1)aa.get(object); 28 System.out.println(user5); 29 } 30 /*方法三 31 * */ 32 Set set=aa.entrySet(); 33 for (Object object : set) { 34 Map.Entry as=(Map.Entry)object; 35 System.out.println(as.getKey()+" "+as.getValue()); 36 } 37 } 38 } 39 class User1{ 40 String id; 41 String name; 42 int age; 43 public String getId() { 44 return id; 45 } 46 public void setId(String id) { 47 this.id = id; 48 } 49 public String getName() { 50 return name; 51 } 52 public void setName(String name) { 53 this.name = name; 54 } 55 public int getAge() { 56 return age; 57 } 58 public void setAge(int age) { 59 this.age = age; 60 } 61 62 public User1() {} 63 public User1(String id, String name, int age) { 64 super(); 65 this.id = id; 66 this.name = name; 67 this.age = age; 68 } 69 @Override 70 public String toString() { 71 // TODO Auto-generated method stub 72 return this.name; 73 } 74 }
打印结果:
4
xiaowang
zhangsan
wangmazi
lisi
0004 xiaowang
0001 zhangsan
0003 wangmazi
0002 lisi
二、加入泛型的HashMap
1 import java.util.HashMap; 2 import java.util.Map; 3 import java.util.Set; 4 public class dg { 5 public static void main(String[] args) { 6 HashMap<String, Student> student=new HashMap<String, Student>(); 7 Student a=new Student("001","zhangsan",10); 8 Student a1=new Student("002","lisi",11); 9 Student a2=new Student("003","wangmazi",12); 10 student.put(a.getId(), a); 11 student.put(a1.getId(), a1); 12 student.put(a2.getId(), a2); 13 14 //遍历:方法一 15 Student s=student.get("001"); 16 System.out.println(s); 17 // 方法二 18 Set<String> set=student.keySet(); 19 for (String string : set) { 20 Student s1=student.get(string); 21 System.out.println(s1); 22 } 23 // 方法三 24 Set<Map.Entry<String,Student>> a11= student.entrySet(); 25 for (Map.Entry<String, Student> entry : a11) { 26 System.out.println(entry.getValue()); 27 } 28 } 29 } 30 class Student{ 31 String id; 32 String name; 33 int age; 34 public String getId() { 35 return id; 36 } 37 public void setId(String id) { 38 this.id = id; 39 } 40 public String getName() { 41 return name; 42 } 43 public void setName(String name) { 44 this.name = name; 45 } 46 public int getAge() { 47 return age; 48 } 49 public void setAge(int age) { 50 this.age = age; 51 } 52 53 public Student() {} 54 public Student(String id, String name, int age) { 55 super(); 56 this.id = id; 57 this.name = name; 58 this.age = age; 59 } 60 @Override 61 public String toString() { 62 63 return this.id+"=="+this.name; 64 } 65 }
打印结果
001==zhangsan
001==zhangsan
002==lisi
003==wangmazi
001==zhangsan
002==lisi
003==wangmazi
三、计数器
1 import java.util.HashMap; 2 public class jsq { 3 public static void main(String[] args) { 4 String s="aaaaaabbbbbbbbbbbbbcccccccccccccjjjjjjjjjj"; 5 HashMap<String, Integer> sd=new HashMap<String, Integer>(); 6 7 for (int i = 0; i < s.length(); i++) { 8 String dd=s.substring(i,i+1); 9 if(sd.containsKey(dd)){ 10 sd.put(dd, sd.get(dd)+1); 11 }else{ 12 sd.put(dd, 1); 13 } 14 }System.out.println(sd); 15 } 16 }
打印结果:{b=13, c=13, a=6, j=10}
四、计数排序
要求:记录String类中的字母个数,并将个数从小到大排序
1 import java.util.Comparator; 2 import java.util.HashMap; 3 import java.util.Set; 4 import java.util.TreeSet; 5 public class jsq { 6 public static void main(String[] args) { 7 String s="aaaaaabbbbbbbbbbbbbbcccccccccccccjjjjjjjjjj"; 8 HashMap<String, Integer> sd=new HashMap<String, Integer>(); 9 10 for (int i = 0; i < s.length(); i++) { 11 String dd=s.substring(i,i+1); 12 if(sd.containsKey(dd)){ 13 sd.put(dd, sd.get(dd)+1); 14 }else{ 15 sd.put(dd, 1); 16 } 17 }System.out.println(sd.toString()); 18 TreeSet<Integer> aag=new TreeSet<Integer>(new aa()); 19 Set<String> aa=sd.keySet(); 20 System.out.println(aa); 21 Integer a=sd.get("b"); 22 System.out.println(a); 23 for (String string : aa) { 24 Integer ay=sd.get(string); 25 aag.add(ay); 26 } 27 System.out.println(aag); 28 } 29 } 30 class aa implements Comparator<Integer>{ 31 32 public int compare(Integer o1, Integer o2) { 33 if(!o1.equals(o2)){ 34 return o1-o2; 35 } 36 return 0; 37 } 38 }
输出结果:
{b=14, c=13, a=6, j=10}
[6, 10, 13, 14]