HashMap

HashMap 存放是键值对数据,键是唯一的,值可以不唯一,通常情况下HashMap中键值对的存放顺序是按键由小到大排列的。

 1.创建对象

HashMap<K, V> map = new HashMap<>();

2.方法
     put(k, v)   放入键值对数据
     get(k)      用键获得对应的值
     remove(k)   移除指定的键和它的值
     containsKey(key) 是否包含指定的键
   containsValue(value)是否包含指定的值
   size()    有多少对数据
   clear()    清空
     keySet()   获得一个 Set 类型集合,包含所有的键
     map.entrySet()  获得一个 Set 类型结合,包含所有 Entry
     values()   获得集合,包含所有的值

public class TEST3 {
    public static void main(String[] args) {
        HashMap<Integer, String> map = new HashMap<>();
        map.put(2001, "Jack");
        map.put(2002, "Mark");
        map.put(2003, "Lucy");//{2001=Jack, 2002=Mark, 2003=Lucy}
        map.put(2003, "Lily");//{2001=Jack, 2002=Mark, 2003=Lily}
        map.put(2004, "Mark");//{2001=Jack, 2002=Mark, 2003=Lily, 2004=Mark}
        
        map.put(2004, null);
        map.put(null, "Raymond");
        System.out.println(map);//{null=Raymond, 2001=Jack, 2002=Mark, 2003=Lily, 2004=null}
    }
}

3.以下代码为使用HashMap统计用户输入的字符串各字母的个数。

public class TEST3 {
    public static void main(String[] args) {        
        System.out.println("请输入一个字符串:");
        String str = new Scanner(System.in).nextLine();//fdeaxd
        HashMap<Character, Integer> map = new HashMap<>();
        map =  Count(str);
        System.out.println(map);//{a=1, d=2, e=1, f=1, x=1}
    }

    private static HashMap<Character, Integer> Count(String str) {
        HashMap<Character, Integer> map = new HashMap<>();
        for(int i=0;i<str.length();i++){
            char key = str.charAt(i);
            if(map.containsKey(key)){
                Integer value = map.get(key);
                map.put(key, value+1);
            }else{
                map.put(key, 1);
            }
        }
        return map;
    }
}

4.讨论:当使用自定义对象作为键时,当创建了两个属性相同的对象,如何让HashMap认为这两对象属于同一个键?
  要想成为同一个键,得满足两个条件:1.对象的hashCode相同;2.两个对象不相等,那么对这两个对象中的任一对象上调用 hashCode 方法不一定生成不同的整数结果,所以两个对象的s1.equal(s2)的结果必须为true。所以为类解决问题,必须重写自定义类的hashcode()和equal()方法。3.为了正常打印对象的属性,还必须重写类的toString()方法。以下代码为示例:

Student类:

package com.example.test;

public class Student {
    private int id;
    private String name;
    private String gender;
    private int age;
    public Student() {
        super();
    }
    public Student(int id, String name, String gender, int age) {
        super();
        this.id = id;
        this.name = name;
        this.gender = gender;
        this.age = age;
    }
    public int getId() {
        return id;
    }
    public void setId(int id) {
        this.id = id;
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public String getGender() {
        return gender;
    }
    public void setGender(String gender) {
        this.gender = gender;
    }
    public int getAge() {
        return age;
    }
    public void setAge(int age) {
        this.age = age;
    }
    @Override
    public int hashCode() {
        int p = 31;
        int r = 1;
        r = r*p+ id;
        r = r*p+name.hashCode();
        r = r*p+gender.hashCode();
        r = r*p+age;
        return r;
    }
    
    @Override
    public String toString() {
        return 
         "\n学号: "+id+
         "\n姓名: "+name+
         "\n性别: "+gender+
         "\n年龄: "+age;
    }
    
    @Override
    public boolean equals(Object obj) {
        if(obj == null){
            return false;
        }
        if(obj==this){
            return true;
        }
        if(obj instanceof Student){
            Student stu = (Student) obj;
            return id == stu.id &&
             name.equals(stu.name) &&
         gender.equals(stu.gender) &&
                      age==stu.age;
        }else{
            return false;
        }
    }
}

以下为测试类:

public class Test4 {
    public static void main(String[] args) {
        Student stu1 = new Student(10,"Jack","Male",23);
        Student stu2 = new Student(10,"Jack","Male",23);
        
        System.out.println(stu1.hashCode());
        System.out.println(stu2.hashCode());//二者hash值相同
        
        System.out.println(stu1.equals(stu2));
        stu1.getName().hashCode();
        HashMap<Student, Integer> map =new HashMap<>();
        
        map.put(stu1, 98);
        map.put(stu2, 96);//只添加类一个对象
        
        System.out.println(map);
    }
}

以下为测试结果:

-2008447232
-2008447232
true
{
学号: 10
姓名: Jack
性别: Male
年龄: 23=96}

 

posted @ 2015-12-30 01:41  冰山雪鸮  阅读(178)  评论(0编辑  收藏  举报