HashMap存储自定义类型键值
HashMap存储自定义类型键值
Map集合保证key是唯一的:
作为key的元素,必须重写hashCode方法和equals方法,以保证key唯一
有两种情况:
1.
key:Person类型
Person类就必须重写hashCode方法和equals方法,以保证key唯一
value:String类型
2.
key:Person类型
Person类就必须重写hashCode方法和equals方法,以保证key唯一
value:String类型
package demo;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import java.util.Set;
public class Demo04HashMapSave {
public static void main(String[] args) {
show2();
}
/*HashMap存储自定义类型键值
* key:Person类型
* Person类就必须重写hashCode方法和equals方法,以保证key唯一
* value:String类型
*/
private static void show2() {
HashMap<Person,String> map = new HashMap<>();
map.put(new Person("西安",10),"陕西");
map.put(new Person("北京",18),"北平");
map.put(new Person("成都",20),"四川");
map.put(new Person("西安",10),"地球");//相同名字和数字,会认为是两个键,所以需要重写hashCode
//使用EntrySet遍历map
Set<Map.Entry<Person, String>> set = map.entrySet();
for (Map.Entry<Person, String> entry : set) {
Person key = entry.getKey();
String value = entry.getValue();
System.out.println(key+value);
}
}
/*
* HashMap存储自定义类型键值
* key:String类型
* String类重写hashCode方法和equals方法,可以保证key唯一
* value:Person类型
* value可以重复(同名同年龄的人视为同一个)*/
private static void show1() {
HashMap<String,Person> map = new HashMap<>();
map.put("小学",new Person("小学生",10));
map.put("初中",new Person("初中生",14));
map.put("高中",new Person("高中生",18));
map.put("小学",new Person("大学生",22));//键重复后,值会覆盖
//使用keySet方法遍历Map
Set<String> set = map.keySet();
// Iterator<String> it = set.iterator();
// while (it.hasNext()){
// String key = it.next();
// Person value = map.get(key);
// System.out.println(key+value);
for (String key : set) {
Person value = map.get(key);
System.out.println(key+value);
}
}
}
LinkedHashMap
package demo;
import java.util.LinkedHashMap;
import java.util.HashMap;
import java.util.Set;
/*java.util.LinkedHashMap<K,V> entends HashMap<K,V>
* Map接口的哈希表和链接列表实现,具有可预知的迭代顺序。
* 底层原理:
* 哈希表+链表(记录元素的顺序)*/
public class Demo05LinkedHashMap {
public static void main(String[] args) {
HashMap<String,String> map = new HashMap<>();
map.put("a", "a");
map.put("c", "c");
map.put("b", "b");
map.put("a", "b");//key不允许重复,无序
System.out.println(map);
LinkedHashMap<String,String> linked = new LinkedHashMap<>();
linked.put("a", "a");
linked.put("c", "c");
linked.put("b", "b");
linked.put("a", "b");//key不允许重复,有序
System.out.println(linked);
}
}
Hashtable
package demo02;
import java.util.HashMap;
import java.util.Hashtable;
/*java.util.Hashtable<K,V>集合 implements Map<K,V>接口
* Hashtable:底层也是一个哈希表,是一个线程安全的集合,是单线程集合,速度慢
* HashMap:底层是一个哈希表,是一个线程不安全的集合,是多线程的集合,速度快
*
* HashMap集合(之前学的所有的集合):可以存储null值null键
* Hashtable集合,不能存储null值
* Hashtable和Vector集合一样,在JDK1.2版本之后被其他集合(HashMap,ArrayList)取代了
* Hashtable的子类Properties依然活跃
* Properties集合是一个唯一和IO流相结合的集合
* */
public class Demo01HashTable {
public static void main(String[] args) {
HashMap<String,String> map = new HashMap<>();
map.put(null,"a");
map.put("a",null);
map.put(null,null);
System.out.println(map);
Hashtable<String,String> map1 = new Hashtable<>();
map1.put(null,"a");
map1.put("a",null);
map1.put(null,null);
System.out.println(map1);//NullPointerException空指针异常
}
}
Map集合小练习
package demo02;
import java.util.HashMap;
import java.util.Scanner;
import java.util.Set;
/*练习:
计算一个字符串中每个字符出现的次数
* 分析:
* 1.使用Scanner获取用户输入的字符串
2.创建Map集合,key是字符串的字符,value是字符的个数
3.遍历字符串,获取每一个字符
4.使用获取到的字符,去Map集合判断key是否存在
key存在:
通过字符(key),获取value(字符个数)
value++
put(key,value)把新的value存储到Map集合中
key不存在:
put(key,1)
5.遍历Map集合,输出结果
*/
public class Demo02Test {
public static void main(String[] args) {
//1.使用Scanner获取用户输入的字符串
Scanner sc = new Scanner(System.in);
System.out.println("请输入一个字符串:");
String s = sc.next();
//2.创建Map集合,key是字符串的字符,value是字符的个数
HashMap<Character,Integer> map = new HashMap<>();
//3.遍历字符串,获取每一个字符
for (char k: s.toCharArray()) {
//4.使用获取到的字符,去Map集合判断key是否存在
if(map.containsKey(k)){
//key存在
Integer value = map.get(k);
value++;
map.put(k,value);
}else {
map.put(k,1);
}
}
// 5.遍历Map集合,输出结果
for (Character key : map.keySet()) {
Integer value = map.get(key);
System.out.println(key+"="+value);
}
}
}