一、
HashMap内部有数组保存键值对,存储元素时根据Key的hashcode值计算数组索引,并将键值对存入。获取时也根据计算索引值直接找到该元素,所HashMap根据这个方式避免了查找元素时对数组的遍历操作,所以不受元素的多少而影响查询性能。
由于Key的hashcode决定键值对在HashMap中数组索引位置,而equals方法决定着Key是否重复,所以这个方法要妥善重写;
hashcode与equals方法是定义在Object中的,所以要妥善重写这两个方法,当我们定义的类需要重写equals和hashcode时,必须遵守以下原则:
1.成对重写,当我们需要重写一个类的equals方法时,就应当重写hashcode方法。
2.一致性,当两个对象equals比较为true时,hashcode值应当相等。
3.稳定性,当参与equals比较的属性没有发生变化的情况系,多次强调用hasdcode方法返回数字不应当有变化。
public class Key {
private int x;
private int y;
@Override
public int hashCode() {
final int prime = 31;
int result = 1;
result = prime * result + x;
result = prime * result + y;
return result;
}
@Override
public boolean equals(Object obj) {
if (this == obj)
return true;
if (obj == null)
return false;
if (getClass() != obj.getClass())
return false;
Key other = (Key) obj;
if (x != other.x)
return false;
if (y != other.y)
return false;
return true;
}
}
二、java.util.Map接口
Map称为查找表,该数据结构体现的样子是一个“多行两列”的表格,左列称为Key,右列称为value;
Map总是根据Key查找对应的value,存储元素也要求key-value成对存入,key什么类型都可以
常用的实现类:java.util.HashMap散列表,哈希表HashMap是基于散列算法实现的Map,是最快的查询结构
/**
* V put(Key key,Value value);
* 将给定的Key-value键值对存入到Map中,Map有一个要求
* key值不允许重复(key的equals比较决定),若使用Map一有的Key存入value,
* 则是替换value操作,那么put方法返回的就是被替换的value,若没有替换,则返回null
*
* 对应value是包装类型的情况,切记,不要用基本类型接受返回值,因为会触发自动拆装箱特性
* 否则会引发空指针异常
*/
Map<String,Integer> map=new HashMap<String,Integer>();
map.put("语文", 98);
map.put("英语", 96);
map.put("数学", 92);
map.put("化学", 100);
System.out.println(map);
//map集合的长度size()
int size=map.size();
//查看数学成绩
int n=map.get("数学");
/*
* V remove(key key)
* 删除当前map给定的key所对应的这组键值对
* 对应的value,若给的那个key在map中不存在,再返回null
*/
Integer mm = map.remove("英语");
System.out.println("被删掉的value"+mm);
System.out.println(map.size()+","+map);
//判断当前map是否包含给定的key或value
boolean ck=map.containsKey("英语");
boolean v=map.containsValue(98);
//清空集合
map.clear();
//判断集合是否为空
System.out.println(map.isEmpty());
三、Map的遍历
map有3种遍历方式:
1、遍历所有的key;
2、遍历所有的key-value键值对
3、遍历所有的value(相对不常用)
public static void main(String[] args) {
Map<String,Integer> map=new HashMap<>();
map.put("语文",100);
map.put("英语", 99);
map.put("数学",90);
map.put("化学", 99);
System.out.println(map);
//可以有序的存入集合
Map<String,Integer> linked=new LinkedHashMap<String,Integer>();
linked.put("语文", 100);
linked.put("英语", 99);
linked.put("数学",90);
linked.put("数学",90);
linked.put("化学", 99);
System.out.println(linked);
//2.遍历所有的key-value键值对
/*
* 遍历每一组键值对,在Map接口中定义了一个内部接口,java.util.Map.Entry
* Entry的每个实例用于表示当前Map中的一个组键值对,提供两个常用方法;
* K getKey():获取Key值
* V getValue():获取Value值
*
* 不同的Map实现类都实现了EnTRY,并应实现类中的每个实例表示一个具体的键值对
* Set<> entrySet()该方法会将Map中所有键值对存入一个集合返回
*/
Set<Entry<String,Integer>> entry=map.entrySet();
for(Entry<String,Integer> e:entry){
String key=e.getKey();//从Entry中获取Map中的每一个Key
Integer value=e.getValue();//从Entry中获取Map中的每一个value
System.out.println(key+","+value);
}
/*
* 3.遍历所有的value(相对不常用)
* Collection values()
* 将当前的Map中所有的values以一个集合的形式返回
*/
Collection<Integer> values=map.values();
for(Integer v:values){
System.out.println(v);
}
//求各个科目中的平均值
double sum=0.0;
for(Integer v:values){
sum+=v;
}
System.out.println(sum/map.size());
}
}
四、MapAndList
public static void main(String[] args) {
List<String> list=new ArrayList<String>();
list.add("admin");
list.add("password");
list.add("address");
List<Integer> list2=new ArrayList<Integer>();
list2.add(300);
list2.add(200);
list2.add(400);
List<Double> list3=new ArrayList<Double>();
list3.add(100.99);
list3.add(111.99);
list3.add(10.97);
Map<String,Object> map=new HashMap<String,Object>();
map.put("username",list);
map.put("list2", list2);
map.put("list3", list3);
//获取用户信息
Object obj=map.get("username");
System.out.println(obj);
//编写map集合中list集合中所有元素
Set<Entry<String,Object>> entry=map.entrySet();
for(Entry<String,Object> e:entry){
String key=e.getKey();
List<Object> li=(List<Object>) e.getValue();
for(Object o:li){
System.out.println(o);
}
}
}
五、ListAndMap
public static void main(String[] args) {
Map<String,Double> tv=new HashMap<String,Double>();
tv.put("平板电脑", 3500.99);
tv.put("家庭影音", 12000.87);
Map<String,Double> washing=new HashMap<String,Double>();
washing.put("对开门冰箱", 8800.99);
washing.put("立柜式空调", 5800.99);
Map<String,Double> cosmetics=new HashMap<String,Double>();
cosmetics.put("TF",439.99);
cosmetics.put("YSL", 238.99);
List<Map<String,Double>> list=new ArrayList<Map<String,Double>>();
list.add(tv);
list.add(washing);
list.add(cosmetics);
for(Map<String,Double> map:list){
System.out.println(map);
Set<Entry<String,Double>> entry=map.entrySet();
for(Entry<String,Double> e:entry){
String key=e.getKey();
Double value=e.getValue();
System.out.println(key+","+value);
}
}
}