Collection每一次都只会保存一个对象,而Map主要是保存一对对象
- Map接口的主要操作方法
- Map接口的常用子类。
- 使用Iterator接口输出map集合(重要)
如果说现在要保存一对关联数据(K-V),那么如果直接使用Collection就不能直接满足我们的要求,可以使用Map接口实现此类数据的保存,并且Map接口还提供有根据key查找value的功能。
在Map接口里面定义有如下的常用方法。
public interface Map<K,V>{
public V put(K key,Vvalue);//向集合中保存数据
public V get(Object key);//根据key查找对应的value数据
public Set<Map,Entry<K,V>>entrySet();//将Map集合转化为Set集合
public Set<K> ketSet();//取出全部的key
}
其中前三个是最重要的操作方法(Map集合最常用)
Map接口下有两个常用子类:HashMap(线程不安全),Hashtable(线程安全,弃用)
范例:HashMap:
public static void main(String[] args) throws Exception {
Map<String,Integer> all = new HashMap<String,Integer>();
System.out.println("length:" + all.size() + " is empty:" + all.isEmpty());
all.put("A",1);
all.put("B",2);// 全部信息重复
all.put("C",3);
all.put("C",33);
System.out.println("length:" + all.size() + " is empty:" + all.isEmpty());
System.out.println(all);
}
结果:
image.png
特点:
- 使用HashMap定义的Map集合是无序存放的(顺序无用)
- 如果出现了重复的key会进行覆盖,使用新的内容替换旧的内容
在Map接口里面提供有get()方法,这个方法的主要功能是根据key查找所需要的value。
范例:查询操作:
public static void main(String[] args) throws Exception {
Map<String,Integer> all = new HashMap<String,Integer>();
System.out.println("length:" + all.size() + " is empty:" + all.isEmpty());
all.put("A",1);
all.put("B",2);// 全部信息重复
all.put("C",3);
all.put(null,0);
System.out.println("length:" + all.size() + " is empty:" + all.isEmpty());
System.out.println(all.get("A"));
System.out.println(all.get("D"));//如果key不存在,返回null
System.out.println(all.get(null));//如果查找null,返回0
}
结果:
image.png
Map存放数据的最终目的是为了查找。但是Collection存放数据的目的是为了输出。
范例:取得全部的key(意义不大,只是为了证明Hashmap中的key不能重复)
public static void main(String[] args) throws Exception {
Map<String,Integer> all = new HashMap<String,Integer>();
System.out.println("length:" + all.size() + " is empty:" + all.isEmpty());
all.put("A",1);
all.put("B",2);// 全部信息重复
all.put("C",3);
all.put(null,0);
System.out.println("length:" + all.size() + " is empty:" + all.isEmpty());
Set<String> set=all.keySet();//取得所有的key 并将Map集合转为Set集合
//使用Iterator遍历集合的key
Iterator<String> iter=set.iterator();
while(iter.hasNext()){
String str=iter.next();
System.out.println(str);
}
}
image.png
在Map接口下还有一个hashtable的子类,此类是在JDK1.0的时候提供的,属于最早的Map集合的实现操作,在JDK1.2的时候让其多实现了一个Map接口,从而保存下来继续使用。
范例:使用Hashtable
public static void main(String[] args) throws Exception {
Map<String,Integer> all = new Hashtable<String,Integer>();
System.out.println("length:" + all.size() + " is empty:" + all.isEmpty());
all.put("A",1);
all.put("B",2);// 全部信息重复
all.put("C",3);
System.out.println("length:" + all.size() + " is empty:" + all.isEmpty());
System.out.println(all);
}
image.png
现在发现Hashtable里面对于key和value的数据都不允许设置为null。
面试题:请解释HashMap与Hashtable的区别?
HashMap(90%)
1.JDK1.2推出
2.线程不安全
3.异步操作
4.允许key/value为null
Hashtable:
1.JDK1.0推出
2.线程安全
3.同步操作,性能消耗大 ,弃用
4.不允许key/value为null
关于Iterator输出的问题(核心):
在之前强调过,只要是集合的输出,就要使用Iterator输出。但是在整个Map接口里面,并没有定义任何的可以返回Iterator接口对象的方法,所以下面如果想要使用Iterator输出Map集合,我们首先必须要针对于Map集合与Collection集合保存数据的特点进行分析后才能实现。
每当用户使用put()方法向Map集合里面保存一对数据的时候都会被自动的封装为Map.Entry接口对象(内部接口对象),那么来观察以下这个内部接口(节点接口)
public static interface Map.Entry<K,V>
在这个接口里面定义了两个操作:
取得key:public K getKey();
取得value:public V getValue();
因此每次Iterator每次遍历出的是Map.Entry对象。
在Map接口里面定义有一个将Map集合转化为Set集合的方法。
public Set<Map.Entry<K,V>>entrySet();
有了这个Set集合,我们就能得到所有的Map.Entry对象,再用Iterator遍历这个Map集合
Map集合利用Iterator接口输出步骤
- 利用Map接口的entrySet()方法,将Map集合转化为Set集合,里面的泛型是Map.Entry
- 利用Set集合中的Iterator()方法将Set集合进行Iterator输出
- 每一次Iterator循环取出的都是Map.Entry接口对象,利用此对象进行key与value的取出。
范例:利用Iterator实现Map接口的输出
public static void main(String[] args) throws Exception {
Map<String,Integer> all = new Hashtable<String,Integer>();
System.out.println("length:" + all.size() + " is empty:" + all.isEmpty());
all.put("A",1);
all.put("B",2);// 全部信息重复
all.put("C",3);
System.out.println("length:" + all.size() + " is empty:" + all.isEmpty());
//将Map集合转化为Set,目的是为了使用Iterator方法
Set<Map.Entry<String,Integer>> set=all.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());
}
}
image.png
以上就是使用Iterator遍历Map集合的步骤,一定要掌握,熟练掌握。
关于Map集合中key的说明
在使用Map接口的时候可以发现,几乎可以使用任意的类型来作为key或value存在,那么就可以使用自定义的类型来作为key,那么这个作为key的自定义的类必须要覆写Object类之中的hasCode与equals方法,因为只有靠这两个方法才能够确定元素是否重复,而在Map中指的是是否能够找到。
class Book{
private String title;
public Book(String title){
this.title=title;
}
//这里要使用IDE生成hasCode与equals,因为将作为key来判断元素是否重复
}
main方法{
Map<Book,String> map=new HashMap<Book,String>();
map.put(new Book("Java Dev"),new String("Java"));
System.out.println(map.get(new Book("Java Dev")));
}
最终才会显示出结果Java
在以后使用Map集合的时候,首选key的类型是String,尽量不要使用自定义的类型作为key。因为String准备好了hashCode和equals。
总结:
1.Map集合保存数据的目的是为了查询使用,而Collection是为了输出使用
2.Map使用Iterator接口输出的步骤以及具体实现代码
3.HashMap可以保存null,key重复会出现覆盖,Hashtable不可以保存null。
网友评论