黑马程序员---集合框架之Map集合重点盲点总结


------- android培训java培训、期待与您交流! ----------

 Map与Collection在java集合框架中属于并列存在的,map存储的是键值对。

可以说整个集合框架中的容器分为两种,一种是单列集合,指的就是Collection

另外一种是双列集合,就是指map。


map下主要有HashTable、HashMap和TreeMap

他们的特点是:

HashTable:底层数据结构是哈希表,是线程同步的。不可以存储null键和null值。

HashMap:线程不同步,底层数据结构也是哈希表。但是可以存储null键和null值。

TreeMap:能对键进行排序。排序原理和TreeSet相同,事实上,TreeSet底层就是调用了TreeMap。


map集合的共性方法分析:

1,添加。

 put(key,value):当存储的键相同时,新的值会替换老的值,并将老值返回。如果键没有重复,返回null。

void putAll(Map);

2,删除。

void clear():清空

value remove(key) :删除指定键。

3,判断。

boolean isEmpty():

boolean containsKey(key):是否包含key

boolean containsValue(value) :是否包含value

4,取出。

int size():返回长度

value get(key) :通过指定键获取对应的值。如果返回null,可以判断该键不存在。当然有特殊情况,

就是在hashmap集合中,是可以存储null键null值的。Collection values():获取map集合中的所有的值。

5,想要获取map中的所有元素:

map中是没有迭代器的,collection具备迭代器,只要将map集合转成Set集合,可以使用迭代器了。

之所以转成set,是因为map集合具备着键的唯一性,其实set集合就来自于map,set集合底层其实用的就是map的方法。


获取Map集合的两种方法:

获取Map集合中元素的原理是:因为map集合中没有迭代器,所以,要想需要先将map转化成集合

然后使用集合中的迭代器遍历。有两种方法:

第一:使用keySet方法。获取key的集合,遍历key集合,使用map中get方法,来获取值。

第二:使用entrySet方法。获取键值对映射关系的集合Map.Entry。使用迭代器遍历Map.Entry集合,

再通过Map.Entry中的getKey和getValue方法。


下面分别用两种方法取出Map集合中的元素代码示例:

package com.itheima;

import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import java.util.Set;

public class MapTest
{
	public  static void main(String args[])
	{
		//map集合取出原理:
		//因为map集合中没有迭代器。
		//是先将map转化成set集合,再使用set集合中的迭代器
		//来遍历集合。从而取出map集合中的元素。
		//Map元素取出的第一种方式。先取出map集合中键的集合。
		//使用map中的keySet方法。
		Map<String ,String> map = new HashMap<String ,String>();
		
		map.put("02","lisod");
		map.put("03","lzhgnsl");
		map.put("01","lisodni");
		map.put("07","zhangsan");
		
		//使用keySet将map集合中的键取出存入到set集合中。
		Set<String> set = map.keySet();
		Iterator<String> it = set.iterator();
		
		while (it.hasNext())
		{
			String string =  it.next();
			System.out.println(string + "....." + map.get(string));
			
		}
		
		//map集合取出的第二种方式:
		//先将map集合中的映射关系取出。通过map集合中的entrySet方法。
		Set<Map.Entry<String, String>> entrySet = map.entrySet();
		Iterator<Map.Entry<String, String>> it1 = entrySet.iterator();
		while (it1.hasNext())
		{
			Map.Entry<java.lang.String, java.lang.String> entry = 
					(Map.Entry<java.lang.String, java.lang.String>) it1.next();
			System.out.println(entry.getKey()+"______"+entry.getValue());
			
		}
	}
}

与Map有关的练习代码示例:

需求是创建学生对象,每个学生都有地址属性。姓名和年龄若相同则视为同一个学生。

保证学生的唯一性。

package com.itheima;

import java.util.HashMap;
import java.util.Iterator;
import java.util.Set;

/**
 * map集合被使用是因为具备映射关系。
 * 当一个类会产生大量的对象时,则有可能需要容器存储。
 * 存储时有可能存入不同的集合。*/
class Student1 implements Comparable<Student1>
{
	private String name;
	private int age ;
	Student1(String name,int age)
	{
		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;
	}
	public String toString()
	{
		return name + ":" + age;
	}
	public int hashCode()
	{
		return name.hashCode()+age*34;
	}
	@Override
	public boolean equals(Object obj)
	{
		if (!(obj instanceof Student1))
		{
			throw new ClassCastException("类型不匹配");
		}
		Student1 s = (Student1)obj;
		return this.name.equals(s.name) && this.age==s.age;
	}
	@Override
	public int compareTo(Student1 s)
	{
		// TODO Auto-generated method stub
		int num = new Integer(this.age).compareTo(new Integer(s.age));
		if(num==0)
		{
			return this.name.compareTo(s.name);
		}
		return num;
	}
}

public class MapPractice
{
	public static void main(String args[])
	{
		HashMap<Student1,String> hm = new HashMap<Student1,String>();
		hm.put(new Student1("lse",23),"shaoyang");
		hm.put(new Student1("lily",21),"chagde");
		hm.put(new Student1("lily",21),"tianjing");
		hm.put(new Student1("mike",26),"xiangtan");
		hm.put(new Student1("jack",25),"cahngsha");
		
		
		Set<Student1> set = hm.keySet();
		
		Iterator<Student1> it = set.iterator();
		
		while (it.hasNext())
		{
			Student1 student =  it.next();
			System.out.println(student+".........."+hm.get(student));
			
		}
	}
}

TreeMap分析:

TreeMap是存储以键值对形式存在的数据,并且能对键进行排序。

排序原理和TreeSet相同,事实上,TreeSet底层就是调用了TreeMap。

TreeMap练习:sdfgzxcvasdfxcvdf"获取该字符串中的字母出现的次数。

希望打印结果:a(1)c(2).....

package com.itheima;

/*思路:
1,将字符串转换成字符数组。因为要对每一个字母进行操作。

2,定义一个map集合,因为打印结果的字母有顺序,所以使用treemap集合。

3,遍历字符数组。
	将每一个字母作为键去查map集合。
	如果返回null,将该字母和1存入到map集合中。
	如果返回不是null,说明该字母在map集合已经存在并有对应次数。
	那么就获取该次数并进行自增。,然后将该字母和自增后的次数存入到map集合中。覆盖调用原理键所对应的值。

4,将map集合中的数据变成指定的字符串形式返回。



*/
import java.util.*;
public class  TreeMapPractice
{
	public static void main(String[] args) 
	{
		String s= charCount("ak+abAf1c,dCkaAbc-defa");
		System.out.println(s);
	}
	
	public static String charCount(String str)
	{
		char[] chs = str.toCharArray();

		TreeMap<Character,Integer> tm = new TreeMap<Character,Integer>();

		
		int count = 0;
		for(int x=0; x<chs.length; x++)
		{
			

			if(!(chs[x]>='a' && chs[x]<='z' || chs[x]>='A' && chs[x]<='Z'))
				continue;

			Integer value = tm.get(chs[x]);

			
			if(value!=null)
				count = value;
			count++;
			//直接往集合中存储字符和数字,为什么可以,因为自动装箱。
			tm.put(chs[x],count);

			count = 0;
			/*
			if(value==null)
			{
				tm.put(chs[x],1);
			}
			else
			{
				value = value + 1;
				tm.put(chs[x],value);
			}
			*/


		}

		//System.out.println(tm);

		StringBuilder sb = new StringBuilder();

		Set<Map.Entry<Character,Integer>> entrySet = tm.entrySet();
		Iterator<Map.Entry<Character,Integer>>  it = entrySet.iterator();

		while(it.hasNext())
		{
			Map.Entry<Character,Integer> me = it.next();
			Character ch = me.getKey();
			Integer value = me.getValue();
			sb.append(ch+"("+value+")");
		}



		return sb.toString();
	}

}








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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值