Map接口
一.Map概述
① Map里面存储的数据是 : key -value 对。
② Map存储key - value 对时,只考虑 key的存储即可,key存储后,value “作为其附属”即可,对Map而言,value只是附属物,因此Map对value几乎没有要求,但是Map对key有要求;
再进一步,如果只管Map里面的key,并把key收集起来,就变成了Set 集合,Map与Set一一对应。
二.HashMap 类
① HashMap 根据key的hashCode()方法的返回值来将计算key的存取位置;
② HashMap 判断key 重复的条件:
—— 通过equals()比较返回true
—— 两个key的hashCode()返回值相等
③ Hashtable 与HashMap 的区别:
— Hashtable 从JDK1.0就开始有,已废弃,不推荐使用;
— Hashtable 不允许null作为key 、value,但是HashMap允许;
— Hashtable 是线程安全的(其实现不够好),HashMap是线程不安全的,但是其性能好。
示例程序 1:
import java.util.*;
//定义Apple类
class Apple
{
private String color;
private double weight;
public Apple(String color ,double weight )
{
this.color = color;
this.weight= weight;
}
//重写toString()方法
@Override
public String toString()
{
return "Apple[color=" + color +",weight=" +weight +"]";
}
//重写equals()方法
@Override
public boolean equals(Object obj)
{
if(this == obj)
{
return true;
}
if(obj != null && obj.getClass()==Apple.class)
{
Apple apple =(Apple)obj;
return this.weight == apple.weight
&& this.color.equals(apple.color);
}
return false;
}
//重写 hashCode()方法
@Override
public int hashCode()
{
//这里的数字“9”是任意的,因为weight是double型,所以强转
return color.hashCode()+ 9*(int)weight;
}
}
public class HashMapTest
{
public static void main (String[] args)
{
//***************************************************
//HashMap只考虑对key的存储,存储机制与HashSet几乎一样
//注意这里是用的是 Double 对象
HashMap<String,Double> score = new HashMap<>();
//对于Map而言,存入的数据都是key-value对
score.put("语文",89.0);
score.put("数学",99.0);
score.put("英语",88.0);
//输出元素个数
System.out.println(score.size());
//输出所有元素
System.out.println(score);
//***************************************************
//HashSet要求 元素 正确重写hashCode()和equals()
//HashSet要求 key 正确重写hashCode()和equals()
HashMap<Apple,Double> apples= new HashMap<>();
//对于Map而言,存入的数据都是key-value对
apples.put(new Apple("红色",3.5),3.55);
apples.put(new Apple("红色",3.6),3.66);
apples.put(new Apple("青色",3.5),3.55);
System.out.println(apples);
}
}
运行结果:
3
{语文=89.0, 英语=88.0, 数学=99.0}
{Apple[color=青色,weight=3.5]=3.55, Apple[color=红色,weight=3.6]=3.66, Apple[color=红 色,weight=3.5]=3.55}
示例程序 2:
import java.util.*;
public class LinkedHashMapTest
{
public static void main(String[] args)
{
//HashMap只考虑对key的存储,存储机制与HashSet几乎一样
//如果需要HashMap记住添加元素的顺序,应该考虑使用LinkedHashMap
LinkedHashMap<String,Double> score= new LinkedHashMap<>();
score.put("语文",89.0);
score.put("英语",99.0);
score.put("数学",88.0);
System.out.println(score.size());
System.out.println(score);
}
}
运行结果:
3
{语文=89.0, 英语=99.0, 数学=88.0}
三.TreeMap 类
—— 底层的红黑树只对key进行排序
① TreeMap 要求key必须是可比较大小的 ——自然排序或定制排序;
② TreeMap 通过compareTo()方法比较大小,返回值为0是代表两个元素相等。
示例程序:
import java.util.*;
public class Test
{
public static void main(String[] args)
{
//如果创建TreeMap时没有传入Comparator,说明用的是自然排序
//String 已经实现了 Comparable 接口
TreeMap<String,Double> treeMap =new TreeMap<>();
treeMap.put("abc",88.0);
treeMap.put("abD",89.0);
treeMap.put("abC",90.0);
treeMap.put("Abc",91.0);
//输出结果已经自然排序
System.out.println("自然排序为:");
System.out.println(treeMap);
}
}
运行结果:
自然排序为:
{Abc=91.0, abC=90.0, abD=89.0, abc=88.0}