黑马程序员——Map集合

                         ------ >Java培训、Android培训、iOS培训、.Net培训、期待与您交流! -------


  java.util 中的集合类包含 Java 中某些最常用的类。最常用的集合类是 List 和 Map。List 的具体实现包括 ArrayList 和 Vector,它们是可变大小的列表,比较适合构建、存储和操作任何类型对象元素列表。List 适用于按数值索引访问元素的情形。

Map 提供了一个更通用的元素存储方法。Map 集合类用于存储元素对(称作“键”和“值”),其中每个键映射到一个值。从概念上而言,您可以将 List 看作是具有数值键的 Map。而实际上,除了 List 和 Map 都在定义 java.util 中外,两者并没有直接的联系。

  Map集合:双列集合,该集合存储键值对,成对存放,而且保证键的唯一性,Collection集合是单列集合,Map集合的常见操作:

存储:put(K key, V value) ,如果重复添加相同的键,后添加的值会覆盖原有键对应值,并且put方法会返回被覆盖的值
          putAll(Map<? extends k,? extends V>m)
删除:clear()       remove(Object key)
判断:  containsValue(Object Value)   containsKey(Object Key)  isEmpty()
获取: get(Object key)     size()  values()  entrySet()   keySet()

通常使用的Map集合有三个:

|-- Hashtable:底层是哈希表数据结构,不可存入null键null值,该集合线程同步,效率低,JDK1.0
|-- HashMap:底层是哈希表数据结构,允许使用null值和null键,该集合不同步,将hashtable替代,效率高,JDK1.2
|-- TreeMap:底层是二叉树数据结构,线程不同步,可以用于给Map集合中的键排序

其实Set底层就是使用了Map集合

Map集合中的元素有两种取出方式,:

1.keySet :将map中所有键存入到Set集合,因为set具备迭代器,所以可以迭代方式取出所有的键,再根据get方法,获取每一个键对应的值,Map集合取出原理:map集合转成set集合,通过迭代器取出,示例代码如下:

import java.util.*;
class  MapDemo
{
	public static void main(String[] args) 
	{
		 Map<String,String> map=new HashMap<String,String>();
		 map.put("03","xiaobai03");
		 map.put("01","xiaobai01");
		 map.put("02","xiaobai02");
		 map.put("04","xiaobai04");

		Set<String> keySet=map.keySet();  //先获取map集合的所有键的Set集合,keyset();
		Iterator<String> it=keySet.iterator();//有了Set集合,就可以获取其迭代器
		while (it.hasNext())
		{
			String key=it.next(); //有了键,可以通过map集合的get方法获取键对应的值
			String value=map.get(key);
			System.out.println("key:"+key+"...value:"+value);
		}
	}
}

第二种取出方式:

Set<Map.Entry<k,v>>  entrySet: 将map集合中的映射关系存入到set集合中,这个关系的数据类型就是Map.Entry,示例代码如下:

import java.util.*;

class  MapDemo2
{
	public static void main(String[] args) 
	{
		 Map<String,String> map=new HashMap<String,String>();
		 map.put("03","xiaobai03");
		 map.put("01","xiaobai01");
		 map.put("02","xiaobai02");
		 map.put("04","xiaobai04");
		Set<Map.Entry<String,String>> entrySet=map.entrySet();
		Iterator<Map.Entry<String,String>> it=entrySet.iterator();
		while (it.hasNext())
		{
			Map.Entry<String,String> me =it.next();
			String key=me.getKey();
			String value=me.getValue();

			System.out.println("key:"+key+"value:"+value);

		}
		 
	}
}

以下代码是通过HashMap取出Map中自定义对象:

需求:自定义对象学生,每一个学生都有对应的归属地,学生Student,地址String,学生属性:姓名,年龄。
姓名和年龄相同的视为同一个学生,保证学生的唯一性。
思路:
1.描述学生;
2.定义Map容器,将学生视为键,地址作为值存入;
3.获取map集合中的元素。

import java.util.*;
class Student implements Comparable<Student>
{
	private String name;
	private int age;
	Student(String name,int age)
	{
		this.name=name;
		this.age=age;
	}
	public int compareTo(Student s)
	{
		int num=new Integer(this.age).compareTo(new Integer(s.age));
		if(num==0)
			return this.name.compareTo(s.name);
		return num;

	}
	public int hashCode()  //hashSet通过hashcode和equals保证元素唯一性
	{
		return name.hashCode()+age*34;
	}
	public boolean equals(Object obj)
	{
		if(!(obj instanceof Student))
			throw new ClassCastException("类型不匹配");
		Student s=(Student)obj;
		return this.name.equals(s.name) && this.age==s.age; 
	}
	public String  getName()
	{
		return name;
	}

	public int getAge()
	{
		return age;
	}
	public String toString()
	{
		return name+":"+age;
	}
}



class MapTest 
{
	public static void main(String[] args) 
	{
		HashMap <Student,String> hm=new HashMap<Student,String>();//HashMap,取出结果无序

		hm.put(new Student("xiaobai1",27),"beijing");
		hm.put(new Student("xiaobai5",21),"shanghai");
		hm.put(new Student("xiaobai3",28),"tianjin");
		hm.put(new Student("xiaobai6",22),"nanjing");
		hm.put(new Student("xiaobai2",26),"luohe");
		hm.put(new Student("xiaobai1",27),"zhengzhou");  //和第一个元素键重复,把第一个键的值覆盖
		//第一种取出方式 keySet  , 
		Set<Student> keySet=hm.keySet();
		Iterator<Student> it=keySet.iterator();
		while (it.hasNext())
		{
			 Student stu=it.next();  //stu是键
			 String addr=hm.get(stu);  //addr是值
			 System.out.println(stu+"..."+addr);
		}

		//第二种取出方式  entrySet
		Set<Map.Entry<Student,String>> entrySet=hm.entrySet();
		Iterator<Map.Entry<Student,String>> iter=entrySet.iterator();
		while (iter.hasNext())
		{
			Map.Entry<Student,String> me =iter.next();
			Student stu=me.getKey();
			String addr=me.getValue();

			System.out.println(stu+"........."+addr);

		}
		 

	}
}

以下是利用TreeMap实现自定义对象排序的代码:

需求:实现可以对学生对象的年龄和姓名进行升序排序。因为数据是以键值对形式存在,所以要使用可以排序的Map合,TreeMap。

import java.util.*;
class Student implements Comparable<Student>
{
	private String name;
	private int age;
	Student(String name,int age)
	{
		this.name=name;
		this.age=age;
	}
	public int compareTo(Student s)
	{
		int num=new Integer(this.age).compareTo(new Integer(s.age));
		if(num==0)
			return this.name.compareTo(s.name);
		return num;

	}
	public int hashCode()  //hashSet通过hashcode和equals保证元素唯一性
	{
		return name.hashCode()+age*34;
	}
	public boolean equals(Object obj)
	{
		if(!(obj instanceof Student))
			throw new ClassCastException("类型不匹配");
		Student s=(Student)obj;
		return this.name.equals(s.name) && this.age==s.age; 
	}
	public String  getName()
	{
		return name;
	}

	public int getAge()
	{
		return age;
	}
	public String toString()
	{
		return name+":"+age;
	}
}
class StuNameComparetor implements Comparator<Student>  //定义Comparator,按年龄排序
{
	public int compare(Student s1,Student s2)
	{
		int num=s1.getName().compareTo(s2.getName());
		if (num==0)
		 return new Integer(s1.getAge()).compareTo (new Integer(s2.getAge()));
		return num;
	}
}

class  MapTest2
{
	public static void main(String[] args) 
	{
		TreeMap <Student,String> tm=new TreeMap<Student,String>(new StuNameComparetor()); //Comparator(比较器)中按姓名排序
	//	TreeMap <Student,String> tm=new TreeMap<Student,String>();   //Studeng类中按照年龄排序

		tm.put(new Student("xiaobai1",27),"beijing");
		tm.put(new Student("xiaobai5",21),"shanghai");
		tm.put(new Student("xiaobai3",28),"tianjin");
		tm.put(new Student("xiaobai6",22),"nanjing");
		tm.put(new Student("xiaobai2",26),"luohe");

		Set<Map.Entry<Student,String>> entrySet=tm.entrySet();
		Iterator<Map.Entry<Student,String>> it=entrySet.iterator();
		while (it.hasNext())
		{
			Map.Entry<Student,String> me =it.next();
			Student stu=me.getKey();
			String addr=me.getValue();

			System.out.println("key:"+stu+"value:"+addr);  //TreeMap可以对元素排序, 

		}
	}
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值