HashMap

主要实现计数

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]

 

posted on 2016-06-07 10:40  lgshiwoo  阅读(162)  评论(0编辑  收藏  举报