黑马程序员——集合——Map集合

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

一.Map集合



1.Map集合存储的是键值对元素。键是唯一的,值可以重复。


2.Map和Collection的区别?

A:Map是双列集合,存储的元素键值对,键唯一,值可以重复。

B:Collection是单列集合,存储的元素是单一的,
List集合可以重复,Set集合元素唯一。

3.Map集合的功能

A:添加功能
V put(K key,V value)

B:删除功能
remove(K key)

C:判断功能

判断键 containsKey(K key)
判断值 containsValue(V value)

D:获取功能

通过键获取值
V get(K key)

获取键的Set集合
Set keySet()

获取所有值的集合
Collection values()

获取键值对对象集合
Set> entrySet()

通过键值对对象获取键,获取值
Map.Entry:
getKey
getValue

E:长度功能
int size()


4.Map集合的数据结构

Map集合的数据结构对键有效,跟值无关。


它的底层数据结构和Set相同。



情况一:
底层数据结构是哈希表,哈希表依赖于哈希值。


最终通过重写两个方法hashCode(),equals()保证元素的唯一性。


比较顺序:


先比较hashCode()值:


结果为true:


后使用equals()方法判断:
true:说明元素重复。不添加。
false:说明元素不重复,添加。


结果为false:


就直接添加到集合。



情况二:
如果是二叉树结构,就有两种方式:Comparable,Comparator


根据返回值是否是0保证元素的唯一性.


元素的排序:


A:自然排序(元素具备比较性)
让元素所属的类实现Comparable接口
在类中重写compareTo(T t)方法


B:比较器排序(集合具备比较性)
在创建集合对象的时候,传递Comparator接口的子类对象
Comparator接口的子类重写compare(T t1,T t2)方法


5.Map的遍历方式

有一个HashMap集合hm,存储的键和值都是String类型.


方式一:根据键找值

a:获取所有键的集合
b:遍历键的集合,获取到每一个键
c:根据键找值


代码:

Set set = hm.keySet();
			for(String key : set) {
				String value = hm.get(key);
				System.out.println(key+"---"+value);
			}




方式二:根据键值对对象找键和值

a:获取所有键值对对象的集合
b:遍历键值对对象的集合,获取到每一个键值对对象
c:根据键值对对象获取键和值


代码:

Set> set = hm.entrySet();
			for(Map.Entry me : set) {
				String key  = me.getKey();
				String value = me.getValue();
				System.out.println(key+"---"+value);
			}



6.案例
A:统计一个字符串中每个字符出现的次数


package cn.itcast2;

import java.util.Set;
import java.util.TreeMap;

/**
 * "aabcbdeeeeedbddcc"获取字符串中每一个字母出现的次数。要求结果:a(2)b(3)c(3)d(4)e(5)
 */
public class Test5 {

	public static void main(String[] args) {

		// 看到题目最后的排序有顺序,并且一一对应,使用TreeMap集合
		// 定义字符串
		String s = "aabcbdeeeeedbddcc";
		// 创建集合对象
		TreeMap tm = new TreeMap();

		// 首先将字符串转化为字符数组
		char[] charArray = s.toCharArray();

		// 遍历字符数组,字符为键
		for (char charKey : charArray) {

			// 获取键所对应的值
			Integer intValue = tm.get(charKey);

			if (intValue == null) {
				tm.put(charKey, 1);

			} else {
				tm.put(charKey, intValue + 1);
			}
		}
		// 定义字符串缓冲区
		StringBuilder sb = new StringBuilder();
		// 遍历集合
		// 获取键的集合
		Set keySet = tm.keySet();
		// 遍历键的集合,获取键与键所对应的值
		for (Character characterKey : keySet) {
			Integer value = tm.get(characterKey);
			sb.append(characterKey).append("(").append(value).append(")");
		}

		// 输出结果

		String string = sb.toString();

		System.out.println(string);

	}

}


B:Map集合的嵌套存储和遍历


package cn.itcast2;

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

public class Test4 {

	/**
	 * 使用集合进行以下分类:
		北京总部
			-JAVAEE班:5个
			-JAVASE班:8个
		上海分校
			-JAVAEE:4个
			-JAVASE:7个

	 */
	public static void main(String[] args) {
		
		//使用Map集合嵌套Map集合创建集合对象
		Map>  mm = new HashMap>();
		
		//创建外层Map集合的元素对象1
		
		String s1="北京总部";
		
		// 创建内层Map集合对象
		
		Map  map = new HashMap();
		
		//创建内层Map集合的元素对象并添加进集合
		map.put("JAVAEE班", 5);
		map.put("JAVASE班", 8);
		
		
		//创建外层Map集合的元素对象2
		
		String s2="上海分校";
		
		// 创建内层Map集合对象
		
		Map  map2 = new HashMap();
		
		//创建内层Map集合的元素对象并添加进集合
		map2.put("JAVAEE班", 4);
		map2.put("JAVASE班", 7);
		
		//将外层Map集合的元素对象添加进集合
		mm.put(s1, map);
		mm.put(s2, map2);
		
		//查看集合
		System.out.println(mm);
		
		//遍历集合
		//首先遍历外层Map,获取外层集合的键的集合
		Set outKeySet = mm.keySet();
		
		//遍历外层键的集合
		for (String outKey : outKeySet) {
			//通过外层键获取到其对应的值
			Map map3 = mm.get(outKey);
			//输出外层键的名称
			System.out.println(outKey);
			
			//遍历内层map集合,首先获取键的集合
			Set inkeySet = map3.keySet();
			//遍历内层键的集合
			for (String inKey : inkeySet) {
				//通过内层键获取到其对应的值
				Integer value = map3.get(inKey);
				//输出内层键的名称和它对应的值
				System.out.println("班级名称:"+inKey+"   个数:"+value);
			}
			System.out.println();
		}
	}

}



7.Map集合的体系
Map
|--HashMap
|--LinkedHashMap
|--Hashtable
|--TreeMap


A:HashMap和Hashtable的区别?


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


HashMap:底层是哈希表数据结构,是线程不同步的。可以存储null键,null值。替代了Hashtable.

B:LinkedHashMap的键的特点?

LinkedHashMap是Map接口的哈希表和链接列表实现,具有可预知的迭代顺序。

你可能感兴趣的:(java学习日志)