欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

【java】【Map】HashMap、Hashtable、Collections

程序员文章站 2022-06-04 19:59:26
...

一、基本概述

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


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):反转