黑马程序员-集合补充(Map类)


----------- android培训 java培训 、java学习型技术博客、期待与您交流! ------------

1.Map类

(Map集合中,以键值对的形式保存映射关系.)

1.1.分类:
按照键的保证唯一方式不同,分为两大类:
HashMap:通过键的hashCode()方法和equals()方法来保证唯一.
注意:
HashMap和Hashtable的区别在于,HashMap中任何对象,包括null都可以作为键值
而Hashtable中只有非null对象可以作为键值
TreeMap:通过键的compareTo()方法来保证唯一.
注意:
这里实现比较,达到二叉树的方法有两种,一种是在集合中元素的对象中实现compareTo()方法.
一种是在定义TreeMap时在参数列表中给定一个Comparator对象.

1.2.HashMap类



1.3.案例:统计字符串字符出现次数
我的代码
package demo;

/*
需求:获取一个字符串中出现的字母及其出现次数。
分析:字符串每位上的字符进行遍历,然后将每位上的字符添加入定义好的一个Map集合。存储动作时加上判断,如果集合中不存在该键(字符作键),添加该键值(字符,1),如果存在则值加1.
步骤:
1.键盘获取一个字符串对象.
2.定义一个Map,遍历字符串,将每一位上的字符当作键,存入Map集合。
3.存储都做加上判断,集合中没有,则值为1,存入。集合中有,则将已有值加一存入。
4.遍历Map集合并打印,达到要求格式。
*/
import java.util.Map;
import java.util.TreeMap;
import java.util.HashMap;
import java.util.Scanner;
import java.util.Set;
import java.util.TreeSet;
class ApearNum
{
	public static void main(String[] args)
	{
		Scanner in = new Scanner(System.in);
		System.out.println("请输入需要获取出现字母及其次数的字符串:");
		String str = in.nextLine();
		TreeMap <Character,Integer> strMap = new TreeMap<>();
		for(int i=0;i<str.length();i++)		//这里,突然想到增强for,适用于集合和数组,但不论从哪方面来说,String我都觉得他足够具有特殊性。
		//for(Character str.charAt(i) : str)		//所以这里,对增强for是否适用于String,进行了实验,事实证明,不行.
		//for(Character charI : str)
		{
			//Character temp =charI;
			Character temp=str.charAt(i);
			if(strMap.get(temp)==null)
			{
				strMap.put(temp,1);
			}
			else
			{
				strMap.put(temp,strMap.get(temp)+1);
			}
		}
		System.out.println(strMap);
		//TreeSet <Character> strSet = (TreeSet)strMap.keySet();   这里,运行出现类型转换异常,可以得知,keySet()得到的键集合是与Map对应的类型.
		//TreeSet <Character> strSet =(TreeSet)strMap.keySet();	为什么这里,我已经将Map改成TreeMap还是类型转换异常?
		//通过查看底层源码得知:虽然键集合的确符合TreeSet或者HashSet集合的特性,但他其实是SortedSet的一个子类,并不是想当然的是HashSet或者TreeSet.
		Set <Character>	strSet = strMap.keySet();
		StringBuilder strSB = new StringBuilder();
		for(Character key : strSet)
		{
			strSB.append("[").append(key+":").append(strMap.get(key)).append("] ");
		}
		System.out.println(strSB);
	}
}

1.4.总结Map

HashMap
底层数据结构是哈希表。线程不安全,效率高。它依赖两个方法:hashCode()和equals()保证唯一性.
顺序:
首先判断hashCode()值是否相同。
同:继续走equals(),看返回值
如果true:就不添加到集合。
如果false:就添加到集合。

不同:就添加到集合。
Hashtable

(注意,这里table为小写,因为Hashtable在早起jdk版本存在
底层数据结构是哈希表。线程安全,效率低。它依赖两个方法:hashCode()和equals())保证唯一性.
顺序:
首先判断hashCode()值是否相同。
同:继续走equals(),看返回值
如果true:就不添加到集合。
如果false:就添加到集合。
不同:就添加到集合。

TreeMap
底层数据结构是二叉树。线程不安全,效率高。根据返回是否是0保证唯一性。
自然排序(元素具备比较性):实现Comparable接口
比较器排序(集合具备比较性):实现Comparator接口



-----------android培训java培训、java学习型技术博客、期待与您交流! ------------
详情请查看:http://edu.csdn.net/
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值