标签:
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}
标签:
原文地址:http://www.cnblogs.com/fazheng/p/5087590.html