Map
Map的基本操作:
@Test
public void e1(){
//建立Map集合
Map<String,Integer> map = new HashMap<>();
//建立键值对
map.put("语文",50);
map.put("数学",50);
map.put("英语",50);
System.out.println("此时map长度为:"+map.size());
//通过key取访问value
System.out.println(map.get("语文"));
//判断某一个key是否在map里面,
System.out.println(map.containsKey("数学"));
System.out.println(map.containsKey("生物"));
//判断某一个value是否在map里面
int a=54;
System.out.println(map.containsValue(a));
System.out.println(map.containsValue(50));
//通过关键字删除对应的键值对
map.remove("数学");
System.out.println("删除数学以后");
//遍历map集合
map.forEach((key,value)->{
System.out.println(key+value);
});
//清空map集合
map.clear();
//访问长度
System.out.println("清空以后的map长度为:"+map.size());
}
如何遍历map集合
三种方式
第一种:通过获得所有的键,然后用for循环去遍历集合(通过获取值)
第二种:entrySet方式遍历集合,同遍历所有的key-------->value对
第三种:java新增的forEacg方法传入一个BigConsummer对象,同时遍历Key , value
(Jack雷神的哦)
@Test
public void m2(){
Map<String,Integer> map = new HashMap<>();
/**
* 向map集合里面添加键值对
* put方法
*/
map.put("语文",80);
map.put("数学",91);
map.put("英语",90);
System.out.println("----------------------第一种方式遍历集合--------------------------");
Set<String> keys = map.keySet(); //keySet方法获取map集合中所有的键的集合
for(String str:keys){
System.out.println("当前拿到的Value是:"+map.get(str));
}
System.out.println("----------------------第二种方式遍历集合--------------------------");
Set<Map.Entry<String,Integer>> ss =map.entrySet();
/* for(Map.Entry<String,Integer> en:ss){
System.out.println("当前遍历的键是:"+en.getKey());
System.out.println("当前遍历的value是:"+en.getValue());
}*/
Iterator<Map.Entry<String,Integer>> iterator = ss.iterator();
while(iterator.hasNext()){
Map.Entry<String,Integer> en = iterator.next();
System.out.println("当前遍历的键是:"+en.getKey());
System.out.println("当前遍历的value是:"+en.getValue());
}
System.out.println("----------------------第三种方式遍历集合--------------------------");
map.forEach((key,value)->{
System.out.println("当前遍历的键值对是:"+key+","+value);
});
}
第四种遍历map集合的方法--------迭代方法
//迭代方式遍历map集合,也用到Entry
@Test
public void e3(){
Map<String,Integer> map = new HashMap();
//建立键值对
map.put("语文",67);
map.put("数学",22);
map.put("英语",33);
Set<Map.Entry<String,Integer>> ss = map.entrySet();
//先得到迭代对象
Iterator<Map.Entry<String,Integer>> iterator = ss.iterator();
while (iterator.hasNext()){
System.out.println(iterator.next());
}
运行结果:
/**
- HashMap的存储原理:
- hashMap第一次向集合里面添加键值对的时候,首先会将key的值进行做hash算法,算出对应的hashCode
- 把相应的value存储对应的hash地址
- 当hashMap集合第二次添加键值对的时候,同样也会将key进行hash运算,算出对应的hashCode,这是会将
- 当前算出的hashCode于hashMap集合里面的所有HashCode值进行比较,如果发现HashCode值不一样,则HashMap
- 集合会把当前的key-value对添加到map集合;如果发现本次算出的hashCode和集合里面的任何hashCode相同,
- 则此时回去比较equals方法,如果equal方法返回true,则会覆盖集合里面对应的可以相同value,如果返回
- false,此时HashMap集合也会将key-value加入到集合中(但是这中情况是不允许出现的,因为存储的时候会形成链表
- 大大影响hashMap的性能)。
/
/* - Hashtable 和 hashMap 提供的API完全一样
- 不同的地方是HashTable是jdk1.0提供的 HashMAP是1.5提供的
- hashTable线程安全 HashMap线程不安全
- hashTable的key不能为null,value不能为null 而HashMap可以为null
*/
/Hashtable map1 = new Hashtable();
map1.put(“ss”,null);/
补充
@Test
public void e_1(){
//建立Map集合
Map<String,Integer> map = new HashMap<>();
//建立键值对
map.put("语文",51);
map.put("数学",50);
map.put("英语",52);
System.out.println("----------------------改变前------------------");
System.out.println(map.get("数学"));//565
map.forEach((a,b)->{
System.out.println(a+"="+b);
});
System.out.println("----------------------改变后------------------");
//通过key改变value值
if(map.containsKey("数学")){
map.put("数学", 100);}
//通过value改变key值
if(map.containsValue(50)){
map.put("物理", 50);}
map.forEach((a,b)->{
System.out.println(a+"="+b);
});
}
运行结果
作业求利用map形式求语数外成绩的和
@Test
public void e2(){
Map<String,Integer> map = new HashMap<>();
//建立键值对
map.put("语文",67);
map.put("数学",22);
map.put("英语",33);
System.out.println("--------------第一种遍历方式-----------");
Set<String> keys=map.keySet();//keySet()方法可以得到map里面所有的键
System.out.println();
System.out.println("keys所存在的格式是:"+keys);
//现在我想要通过以上方法遍历时输出-----> key,value的形式
//现在将keys转化成数组
Object[] obj=keys.toArray();
int i=-1;
int sum=0;
System.out.println("遍历的成绩是:");
for(Object o:keys){
i++;
sum=sum+map.get(o);
System.out.println(obj[i]+","+map.get(o));
}
System.out.println("总成绩为:"+sum);
System.out.println("---------第二种遍历方式--------------");
Set<Map.Entry<String,Integer>> ss=map.entrySet();
int sum1=0;
for (Map.Entry<String,Integer> ee:ss){
sum1+=ee.getValue();
System.out.println(ee.getKey()+" "+ee.getValue());
}
System.out.println(sum1);
System.out.println("---------第三种遍历方式--------------");
int sum2=0;
//.forEach方式哦,很好
map.forEach((e,o)->{
System.out.println(e+" "+o);
});
}