Map的定义,以及对Map进行增删改查操作
package day05;
import java.util.HashMap;
import java.util.Map;
/**
* Map
* 该数据结构看起来更像是一个多行两列的表格
* 每一条数据中包含了两个信息 key-value
* 其中key在Map中不允许重复,重复指的是equals为true
* @author Wang
*
*/
public class MapDemo {
public static void main(String[] args) {
/**
* 创建一个Map
* key是字符串,value是整数
*/
Map<String,Integer> map = new HashMap<String,Integer>();//无序的
/**
* V put(K k,V v)
* 将给定的key与对应的value存入Map中
* 若给定的key在Map中不存在,则是添加新内容
* 返回值是null
*
* 若给定的key在Map中 存在,则是替换value操作
* 返回值是被替换的value值
*/
map.put("数学", 90);
map.put("语文", 98);
map.put("物理", 85);
map.put("化学", 93);
map.put("英语", 100);
System.out.println(map);
/**
* V get(K k)
* 根据给定的key获取对应的value
*/
Integer num = map.get("英语");//为什么不写int。防止控制针异常
System.out.println("英语:"+num);//100
/**
* 给定一个Map中不存在的key,返回值则为null
*/
num = map.get("高数");
System.out.println("高数:"+num);///null
/**
* boolean containsKey(K k)
* 判断当前Map中是否含有给定的key------根据equals判断
*/
if(map.containsKey("数学")){
System.out.println("包含数学");
}else{
System.out.println("不包含数学");
}
/**
* V remove(K k)
* 根据给定的key删除这一项
* 返回值是被删除的value值
* 若没有找到对应的key,则返回值为null
*/
System.out.println(map);
Integer remove = map.remove("化学");
System.out.println(map);
System.out.println(remove);
}
}
Map集合原理
需要重写Hashcode方法
equals,hashcode都是java自动生成的
/**
* 重写equals方法时,应该同时重写hashCode方法
* 重写规则如下:
* 若两个对象equals方法比较结果为true,那么hashCode返回的数字必须相同。
* 反之这不是必须的,但是也应当尽量避免。equals不是true,hashCode尽量不同
* 即:两个对象若equals方法比较结果为false,他们的hashCode方法返回值应尽量不同,否则影响HashMap性能
* hashCode方法在当前对象内容没有发生改变的前提下多次调用应当返回相同的数字---稳定性
* @author Wang
*
*/
public class Point {
private int x;
private int y;
public Point(int x, int y) {
super();
this.x = x;
this.y = y;
}
public int getX() {
return x;
}
public void setX(int x) {
this.x = x;
}
public int getY() {
return y;
}
public void setY(int y) {
this.y = 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;
final Point other = (Point) obj;
if (x != other.x)
return false;
if (y != other.y)
return false;
return true;
}
}
使用HashMap时,应当注意:
作为key的对象有以下要求:
1.首先当key这个类重写了equals方法,那么重写hashcode的要求必须满足
2.作为key的对象若存入HashMap后,其会影响hashcode的值的内容不要发生改变,否则可能会影响Map的操作
装载因子及HashMap优化
初始容量可以改变
Map<String,Integer> map = new HashMap<String,Integer>(100);//初始容量为100
Map遍历
1.遍历所有的key
2.遍历所有的value(不常见)
3.遍历所有的key,value
package day05;
import java.util.Collection;
import java.util.HashMap;
import java.util.Map;
import java.util.Set;
import java.util.Map.Entry;
/**
* 遍历Map的三种方式
* 1.遍历所有的key
* 2.遍历所有的键值对(key-value)
* 3.遍历所有的value(不常用)
* @author Wang
*
*/
public class MapDemo3 {
public static void main(String[] args) {
Map<String,Integer> map = new HashMap<String,Integer>();
map.put("数学", 90);
map.put("语文", 98);
map.put("物理", 85);
map.put("化学", 93);
map.put("英语", 100);
System.out.println(map);
/**
* 遍历所有的key
* Set<K> keySet()
* 该方法可以获取Map中所有的key,并将他们存入一个Set集合中返回
* 所以,遍历该集合就等于遍历所有的key
*/
Set<String> keySet = map.keySet();
for(String key:keySet){
System.out.println("key:"+key);
}
/**
* 遍历键值对
* Set<Entry> entrySet()
* 该方法会将每一组key-value存入要给Entry实例中,并将这些Entry实例存入一个Set姐并返回
* 我们只需要遍历该集合,拿到每一个Entry实例,并获取其中的key与value即可
*/
Set<Entry<String,Integer>> entrySet = map.entrySet();
for(Entry<String,Integer> e:entrySet){
String key = e.getKey();
Integer value =e.getValue();
System.out.println(key+":"+value);
}
/**
* 遍历所有的value
*
*/
Collection<Integer> values = map.values();
for(Integer value : values){
System.out.println("value:"+value);
}
}
}