知识点:
Collection每次只能保存一个对象,而Map主要是负责保存一对对象的信息。
1.Map接口的主要操作方法;
2.Map接口的常用子类;
具体内容:
如果要保存一对关联数据(key=value)的时候,那么如果直接使用Collection就不能直接满足要求,可以使用Map接口实现此类数据的保存,并且Map接口还提供有根key查找value的功能。
在Map接口里面定义有如下的常用方法:
No | 方法名 | 类型 | |
1 | 普通 | 向集合中保存数据。 | |
2 | 普通 | 根据key查找到对应的value数据 | |
3 | 普通 | 将Map集合转化为Set集合 | |
4 | 普通 | 取出全部的KEY |
在Map接口下有两个常用子类:HashMap、Hashtable。
范例:观察HashMap的使用
package conll;
import java.util.HashMap;
import java.util.Map;
public class TestDemo {
public static void main(String[] args) throws Exception {
Map<String,Integer> map = new HashMap<String,Integer>();
map.put("一", 1);
map.put("二", 2);
map.put("三", 3);
map.put("三", 22); //KEY重复数据
System.out.println(map);
}
}
以上代码显示如下特点:
1.使用HashMap定义的Map集合是无序存放的(顺序无用)。
2.如果发现出现了重复的KEY回进行覆盖,使用新的内容替换掉旧的内容。
在Map接口里面提供有get()方法,这个方法的主要功能是根据key查询所需要的vlaue值。
范例:
package conll;
import java.util.HashMap;
import java.util.Map;
public class TestDemo {
public static void main(String[] args) throws Exception {
Map<String,Integer> map = new HashMap<String,Integer>();
map.put("一", 1);
map.put("二", 2);
map.put("三", 3);
map.put("null", 22); //KEY的内容为空
System.out.println(map.get("流")); //key值不存在,返回为null
System.out.println(map.get("null"));
}
}
通过以上代码,我们知道Map存储数据旧是为了查找,Collection存储数据就是为了输出。
范例:取得全部的key
package conll;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import java.util.Set;
public class TestDemo {
public static void main(String[] args) throws Exception {
Map<String,Integer> map = new HashMap<String,Integer>();
map.put("一", 1);
map.put("二", 2);
map.put("三", 3);
map.put("null", 22); //KEY的内容为空
Set<String> set = map.keySet(); //取出全部内容
Iterator<String> iter = set.iterator();
while(iter.hasNext()){
System.out.println(iter.next());
}
}
}
Map接口下还有一个Hastable子类,此类是JDK1.0t提供的,属于最早的Map集合的实现操作,在JDK1.2的时候让其多实现勒一个Map接口,从而保存下来继续使用。
范例:使用Hashtable
package conll;
import java.util.Hashtable;
import java.util.Iterator;
import java.util.Map;
import java.util.Set;
public class TestDemo {
public static void main(String[] args) throws Exception {
Map<String,Integer> map = new Hashtable<String,Integer>();
map.put("一", 1);
map.put("二", 2);
map.put("三", 3);
System.out.println(map);
}
}
现在发现Hashtable里面对于key和value的数据都不允许设置为null。
面试题目:HashMap和Hashtable的区别。
No | 区别点 | HashMap(90%) | Hashtable(10%) |
1 | 推出时间 | JDK1.2推出,属于新的类 | JDK1.0推出,属于旧的类 |
2 | 性能 | 采用异步处理 | 采用同步处理 |
3 | 数据安全 | 非线程安全 | 线程安全 |
4 | 设置null | 允许key或valuen内容为空Null | 不允许key或者value为空 |
实际中,遇见了Map接口基本上就使用HashMap类。
于Iterator输出的问题关(核心问题)
在之前强调过,只要是集合的输出都使用iterator完成,但是在整个Map接口里面并没有定义任何的可以返回Iterator接口对象的方法,所以要想使用Iterator输出Map集合,首先要针对于Map集合与Collection集合保存数据的特点进行分析后才能够实现。
每当用户使用put()方法向Map集合里面保存一对数据的时候,实际上所有的数据都会被封装为Map.Entry(内部接口)接口对象。
Map.Entry接口定义:
-
public static interface Map.Entry<K,V>
在这个接口里面定义了两个操作:
取得key:public K getKey();
取得value:public V getValue();
在Map的接口里面定义有一个将Map转化为set集合的办法:public Set<Map.Entry<K,V>> entrySet();
Map利用Iterator接口输出的步奏:
1.利用Map接口的entrySet()方法将Map集合变为Set集合,里面的泛型是Map.Entry;
2.利用Set集合中I的terator()方法将Set集合进行Iterator输出;
3.每一次Iterator循环取出都是Map.Entry接口对象,利用此对象进行key与value的取出;
范例:利用IIterator实现Map接口的输出
package conll;
import java.util.Hashtable;
import java.util.Iterator;
import java.util.Map;
import java.util.Set;
public class TestDemo {
public static void main(String[] args) throws Exception {
Map<String,Integer> map = new Hashtable<String,Integer>();
map.put("壹", 1);
map.put("贰", 2);
map.put("叁", 3);
//将Map转化为Set集合,目的是为了使用iterator()方法
Set<Map.Entry<String,Integer>> set = map.entrySet();
Iterator<Map.Entry<String, Integer>> iter =set.iterator();
while(iter.hasNext()){
Map.Entry<String, Integer> me=iter.next();
System.out.println(me.getKey()+"="+me.getValue());
}
}
}
关于Map集合中key的说名:
在使用Map接口的时候可以发现,几乎可以使用任意的类型来作为key或value的存在,那么表示自定义的类型也可以作为key。那么这个作为KEY的类必须复习Object类之中的hashCode()与equals()两个方法,因为只有靠这样两个方法才能够确定元素是否重复,而在Map中指是指是否能够找到。
package conll;
import java.util.HashMap;
import java.util.Map;
class Book{
private String title;
Book(String title){
this.title = title;
}
@Override
public int hashCode() {
final int prime = 31;
int result = 1;
result = prime * result + ((title == null) ? 0 : title.hashCode());
return result;
}
@Override
public boolean equals(Object obj) {
if (this == obj)
return true;
if (obj == null)
return false;
if (getClass() != obj.getClass())
return false;
Book other = (Book) obj;
if (title == null) {
if (other.title != null)
return false;
} else if (!title.equals(other.title))
return false;
return true;
}
@Override
public String toString(){
return "书名:"+this.title;
}
}
public class TestDemo {
public static void main(String[] args) throws Exception {
Map<Book,String> map = new HashMap<Book,String>();
map.put(new Book("java开发"),new String("JAVA"));
System.out.println(map.get(new Book("java开发")));
}
}
在以后使用Map集合的时候,首选key的类型是String,尽量不要去使用自定义的类型作为key.
总结:
1.Map集合保存数据的目的是为了查询使用,而Collection保存数据的目的是为了输出;
2.Map使用Iterator接口输出的步骤以及具体实现代码;
3.HashMap可以保存null,Hastable不能保存null,key重复会出现覆盖。