Map<K,V>的使用


Map<K,V>的使用
Map:将键映射到值的对象;一个映射不能包含重复的键,每个键最多映射到一个值。
1.分类
(1)HashTable :底层是哈希表的数据结构,不可以存入null键、null值,该集合是线程同步的,jdk1.0开始,效率低;
(2)HashMap :底层是哈希表数据结构,可以使用null键、null值,该集合是线程不同步的,jdk1.2开始,效率高;
 (3)TreeMap: 底层是二叉树数据结构,线程不同步,可以用于对Map集合中的键进行排序

2.一般方法:
一般情况下(键或值为非null),除了contains方法,判断Map集合是否包含一个键用可以看get方法的返回值是不是为null;
package day15.集合框架3;
import java.util.*;
public class MapDemo {

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		Map<String,String> map = new HashMap<String,String>();
		//添加元素如果出现相同的键,那么后添加的值会覆盖原有的键对应的值,并返回原有的值
		System.out.println("put:"+map.put("001", "zhangsan"));
		System.out.println("put:"+map.put("001", "lisi"));
		map.put("002", "zhangsan3");
		map.put("003", "zhangsan3");
		System.out.println(map.containsValue("lisi"));
		System.out.println(map.get("001"));
		
		//可以存储null键null值
		map.put(null, "zhuliu");
		System.out.println(map.get(null));
		
		Collection<String> col= map.values();
		
		System.out.println(col);
		System.out.println(map);
		System.out.println(map.keySet());
		
	}

}
注意:
put()方法:添加键值对,如
 Map map= new HashMap();
map.put(1,"jie1");//put返回null
map.put(1,"jie2");//put返回“jie1”,因为键相同,前一个值被覆盖,并作为put方法的返回结果
map集合中存入的是(1,“jie2”)

3.获取集合中键值队的两种方式
(1)通过keySet方法返回所有键存入的Set集合,因为Set具备迭代器,所以可以迭代方式取出所有的键,根据get方法获取每一个键对应的值;
 (2)通过entrySet()方法放回键值对关系的Set集合,再通过迭代方式获取所有的键值对,注意迭代器的类型Map.Entry<>,但迭代器的next()方法返回值类型默认是Object,需要类型强制转换或者再获取迭代器时提前使用泛型的方法
package day16.map;

import java.util.*;
//获取map集合每个键值对的2中方式
public class KeySet {
	public static void main(String[] args) {
		Map<Integer, String> map = new HashMap<Integer, String>();
		map.put(1, "zhangsan");
		map.put(2,"zhangsan2");
		map.put(3, "zhangsan3");
		
//		Set<Integer> set= map.keySet();
//		Iterator<Integer> it= set.iterator();
//		while(it.hasNext()){
//			Integer in= it.next();
//			System.out.println(in+"="+map.get(in));
//		}
//		System.out.println("===================");
		//通过键值对关系获取键值对
		Set<Map.Entry<Integer, String>> set2=map.entrySet();
		Iterator<Map.Entry<Integer, String>> it2 =set2.iterator();
		System.out.println(it2.equals(set2.iterator()));
		//注意,返回的是一个键值对关系,每次调用的iterator返回的都是不同的
		while(it2.hasNext()){
			Map.Entry entry= it2.next();
			//如果不带泛型,返回值是Object
			System.out.println(entry.getKey()+"="+entry.getValue());
		}
		
		System.out.println(it2.hasNext());//注意此时的迭代器指针指向
		
		Iterator<Map.Entry<Integer,String>> it3= set2.iterator();
		for(;it3.hasNext();){
			Map.Entry<Integer, String> entry2= it3.next();
			System.out.println(entry2.getKey()+"="+entry2.getValue());
		}
	}
}

4. 将自定义的对象实例存入map中
package day16.map;
import java.util.*;
/*每一个学生都有对应的归属地,
学生Student,地址String
学生属性:姓名,年龄
注意:姓名和年龄相同视为同一学生,保证学生的唯一性和比较性*/
public class HashMapTest {

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		Map<Student,String> map= new HashMap<Student, String>();
		map.put(new Student("zhangsan",18),"beijing");
		map.put(new Student("zhangsan1",19),"tainjing");
		map.put(new Student("zhangsan2",20),"anhui");
	//迭代获取
		Set<Student> set= map.keySet();
		Iterator<Student> it= set.iterator();
		while(it.hasNext()){
			Student s= it.next();
			System.out.println("["+s+"="+map.get(s)+"]");
		}
	}
}
class Student implements Comparable<Student>//泛型在接口实现中的应用
{
	private String name;
	private int age;
	
	public Student(String name, int age) {
		super();
		this.name = name;
		this.age = age;
	}

	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}

	public int getAge() {
		return age;
	}

	public void setAge(int age) {
		this.age = age;
	}
	
	
	@Override
	public int hashCode() {
		
		return name.hashCode()+age*12;
	}

	@Override
	public boolean equals(Object obj) {//equals方法继承自Object 不能使用泛型
		if(!(obj instanceof Student))
			throw new ClassCastException();
		Student s= (Student)obj;
		return this.name.equals(s.name)&&this.age==s.age;
	}

	@Override
	public int compareTo(Student s1) {
		int num = this.name.compareTo(s1.name);
		if(num==0)
			return new Integer(this.age).compareTo(new Integer(s1.age));
		// TODO Auto-generated method stub
		return num;
	}

	@Override
	public String toString() {
		return "Student [name=" + name + ", age=" + age + "]";
	}	
}
4.TreeMap
能够将map按键的顺序进行排序,
条件:键必须有自然顺序(实现 Comparator接口,覆盖ComparaTo方法)或者map本身在定义是传入一个比较器的实例(实现Comparable结构,覆盖Compare方法)



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值