类集框架(七)_4Map接口

知识点:

    Collection每次只能保存一个对象,而Map主要是负责保存一对对象的信息。

 1.Map接口的主要操作方法;

 2.Map接口的常用子类;

具体内容:

     如果要保存一对关联数据(key=value)的时候,那么如果直接使用Collection就不能直接满足要求,可以使用Map接口实现此类数据的保存,并且Map接口还提供有根key查找value的功能。

    在Map接口里面定义有如下的常用方法:

No方法名类型 
1

public V put(K key, V value)

普通向集合中保存数据。
2

public V get(Object key)

普通根据key查找到对应的value数据
3

public Set<Map.Entry<K,V>> entrySet()

普通将Map集合转化为Set集合
4

public Set<K> keySet()

普通 取出全部的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重复会出现覆盖。

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值