【java】【Map】HashMap、Hashtable、Collections

一、基本概述

键值对:一个映射不能包含重复的键,每个键最多只能映射到一个值


Map接口和Collection接口的不同

  •  Map是双列的,Collection是单列的
  • Map的键唯一,Collection的子体系Set是唯一的
  • Map集合的数据结构值针对键有效,跟值无关。Collection集合的数据结构是针对元素有效。

二、Map集合的功能

1、添加功能

  • V  put(Kkey,V value):添加元素。

            * 如果键是第一次存储,就直接存储元素,返回null

            * 如果键不是第一次存在,就用值把以前的值替换掉,返回以前的值

2、删除功能

        * void clear():移除所有的键值对元素

        * V  remove(Object key):根据键删除键值对元素,并把值返回

 3、判断功能

        * boolean  containsKey(Object key):判断集合是否包含指定的键

        * boolean  containsValue(Object value):判断集合是否包含指定的值

        * boolean  isEmpty():判断集合是否为空

4、获取功能

        *Set<Map.Entry<K,V>>  entrySet():

                说明:Map.Entry表示Entry是Map的内部接口,将键和值封装成了Entry对象,并存储在Set集合中

        * V  get(Object key):根据键获取值

        *Set<K>  keySet():获取集合中所有键的集合

        *Collection<V>  values():获取集合中所有值的集合

5、长度功能

        * intsize():返回集合中的键值对的个数

三、Map集合的遍历

1、键找值 思路:

    * 获取所有键的集合

    * 遍历键的集合,获取到每一个键

    * 根据键找值

HashMap<String, Integer> hm = new HashMap<>();
hm.put("张三", 23);
hm.put("李四", 24);
hm.put("王五", 25);
hm.put("赵六", 26);
			
Set<String> keySet = hm.keySet();		//获取集合中所有的键
Iterator<String> it = keySet.iterator();	//获取迭代器
while(it.hasNext()) {				//判断单列集合中是否有元素
	String key = it.next();			//获取集合中的每一个元素,其实就是双列集合中的键
	Integer value = hm.get(key);		//根据键获取值
	System.out.println(key + "=" + value);	//打印键值对
}
			
for(String key : hm.keySet()) {			//增强for循环迭代双列集合第一种方式
	System.out.println(key + "=" + hm.get(key));
}

2、键值对对象找键和值  思路

    * 获取所有键值对对象的集合

    * 遍历键值对对象的集合,获取到每一个键值对对象

    * 根据键值对对象找键和值

HashMap<String, Integer> hm = new HashMap<>();
hm.put("张三", 23);
hm.put("李四", 24);
hm.put("王五", 25);
hm.put("赵六", 26);
/*Set<Map.Entry<String, Integer>> entrySet = hm.entrySet();	//获取所有的键值对象的集合
Iterator<Entry<String, Integer>> it = entrySet.iterator();      //获取迭代器
while(it.hasNext()) {
	Entry<String, Integer> en = it.next();			//获取键值对对象
	String key = en.getKey();				//根据键值对对象获取键
	Integer value = en.getValue();				//根据键值对对象获取值
	System.out.println(key + "=" + value);
}*/
			
for(Entry<String,Integer> en : hm.entrySet()) {
	System.out.println(en.getKey() + "=" + en.getValue());
}

四、LinkedHashMap,TreeMap

LinkedHashMap:底层是链表实现的可以保证怎么存就怎么取

TreeMap:底层是二叉树,会对键值对进行排序


五、案例:统计字符串中每个字符出现的次数

分析:
1、定义一个需要被统计字符的字符串
2、将字符串转换为字符数组
3、定义双列集合,存储字符串中字符以及字符出现的次数
4、遍历字符数组获取每一个字符,并将字符存储在双列集合中
5、存储过程中要做判断,如果集合中不包含这个键,就将该字符当作键,值为1存储,如果集合中包含这个键,就将值加1存储
6、打印双列集合获取字符出现的次数

import java.util.HashMap;
public class Test1 {	
	public static void main(String[] args) {
		//1,定义一个需要被统计字符的字符串
		String s = "aaaabbbbbccccccccccccc";
		//2,将字符串转换为字符数组
		char[] arr = s.toCharArray();
		//3,定义双列集合,存储字符串中字符以及字符出现的次数
		HashMap<Character, Integer> hm = new HashMap<>();
		//4,遍历字符数组获取每一个字符,并将字符存储在双列集合中
		for(char c: arr) {
			//5,存储过程中要做判断,如果集合中不包含这个键,就将该字符当作键,值为1存储,如果集合中包含这个键,就将值加1存储
			/*if(!hm.containsKey(c)) {			//如果不包含这个键
				hm.put(c, 1);
			}else {
				hm.put(c, hm.get(c) + 1);
			}*/
			hm.put(c, !hm.containsKey(c) ? 1 : hm.get(c) + 1);
		}
		//6,打印双列集合获取字符出现的次数
		
		for (Character key : hm.keySet()) {				//hm.keySet()代表所有键的集合
			System.out.println(key + "=" + hm.get(key));//hm.get(key)根据键获取值
		}
	}
}

六、HashMap和Hashtable的区别

  • Hashtable是JDK1.0版本出现的,是线程安全的,效率低,HashMap是JDK1.2版本出现的,是线程不安全的,效率高
  • Hashtable不可以存储null键和null值,HashMap可以存储null键和null值

七、Collections

针对集合操作 的工具类

  • public static <T> void sort(List<T> list)

  •  publicstatic <T> int binarySearch(List<?> list,T key):二分查找法

 publicstatic <T> T max(Collection<?> coll):获取最大值

publicstatic void shuffle(List<?> list):随机置换,可以用来洗牌

publicstatic void reverse(List<?> list):反转





猜你喜欢

转载自blog.csdn.net/love_aym/article/details/80169256