java 之 集合体系(四 Map)

1.Map接口概述

查看API可以知道:
        * 将键映射到值的对象
        * 一个映射不能包含重复的键
        * 每个键最多只能映射到一个值
Map接口和Collection接口的不同
    * Map是双列的,Collection是单列的
    * Map的键唯一,Collection的子体系Set是唯一的

    * Map集合的数据结构值针对键有效,跟值无关;Collection集合的数据结构是针对元素有效


2.基本使用

因为底层是hash算法,所以存储无序;
* a:添加功能
* V put(K key,V value):添加元素。返回被覆盖的value,如果没有就返回null;
* 如果键是第一次存储,就直接存储元素,返回null
* 如果键不是第一次存在,就用值把以前的值替换掉,返回以前的值

* b:删除功能
* void clear():移除所有的键值对元素
* V remove(Object key):根据键删除键值对元素,并把值返回

* c:判断功能
* boolean containsKey(Object key):判断集合是否包含指定的键
* boolean containsValue(Object value):判断集合是否包含指定的值
* boolean isEmpty():判断集合是否为空

* d:获取功能
* Set<Map.Entry<K,V>> entrySet():
* V get(Object key):根据键获取值
* Set<K> keySet():获取集合中所有键的集合
* Collection<V> values():获取集合中所有值的集合
* e:长度功能
* int size():返回集合中的键值对的个数

3.map集合的遍历

第一种:Map没有迭代器interator,但是可以经map的键值转成set结合,通过set的迭代器去遍历:
	/**
	 * 通过查看Map集合的api发现没有iterator方法,那么双列集合如何迭代呢?
	 * 根据键获取值
	 */
	public static void main(String[] args) {
		Map<String, Integer> map = new HashMap<>();
		map.put("张三", 23);
		map.put("李四", 24);
		map.put("王五", 25);
		map.put("赵六", 26);
		
//		Integer i = map.get("张三");					//根据键获取值
//		System.out.println(i);
		
		//获取所有的键
		/*Set<String> keySet = map.keySet();			//获取所有键的集合
		Iterator<String> it = keySet.iterator();	//获取迭代器
		while(it.hasNext()) {						//判断集合中是否有元素
			String key = it.next();					//获取每一个键
			Integer value = map.get(key);			//根据键获取值
			System.out.println(key + "=" + value);
		}*/
		
		//使用增强for循环遍历
		for(String key : map.keySet()) {			//map.keySet()是所有键的集合
			System.out.println(key + "=" + map.get(key));
		}
	}


第二种:Map集合的遍历之键值对对象找键和值

			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());
			}


4.HashMap:复杂数据类型(对象)做键的时候:

底层会掉那个hash算法对键进行计算,然后通过计算出来的值才能找到value;所以对象作为键的话根据地址值计算出来的hash值是不同的;所以要对这个键对象进行重写hashcode和equals方法;



5.LinkedHashMap

这个是有序的,怎么存怎么显现;底层是链表实现的;其他和Hashmap是一样的;增删快,查找慢;


6.TreeMap

排序,二叉树
进行键值对排序,当对象作为键的是,要指定排序的规则,实现comparable接口,重写ConpareTo方法,存储方式和compareTo的返回值有关;
也可使用比较器comparator进行比较;


案例:统计字符串中每个字符出现的次数
通过hashmap是否包含键,计数为value;
			String str = "aaaabbbcccccccccc";
			char[] arr = str.toCharArray();						//将字符串转换成字符数组
			HashMap<Character, Integer> hm = new HashMap<>();	//创建双列集合存储键和值
			
			for(char c : arr) {									//遍历字符数组
				/*if(!hm.containsKey(c)) {						//如果不包含这个键
					hm.put(c, 1);								//就将键和值为1添加
				}else {											//如果包含这个键
					hm.put(c, hm.get(c) + 1);					//就将键和值再加1添加进来
				}
				
				//hm.put(c, !hm.containsKey(c) ? 1 : hm.get(c) + 1);
				Integer i = !hm.containsKey(c) ? hm.put(c, 1) : hm.put(c, hm.get(c) + 1);
						}
			
			for (Character key : hm.keySet()) {					//遍历双列集合
				System.out.println(key + "=" + hm.get(key));
			}


7.HashMap和HashTable的区别:


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

HashMap已经取代了HashTable


8.Collections类概述

针对集合操作 的工具类
public static <T> void sort(List<T> list) //排序,首先元素必须可以比较
public static <T> int binarySearch(List<?> list,T key) //二分查找某个元素
public static <T> T max(Collection<?> coll) //获取最大值,元素必须可以比较的
public static void reverse(List<?> list) //元素翻转
public static void shuffle(List<?> list) //重新洗牌,随机的,每次遍历结果都不同;



集合大总结:

	/**
	 * Collection
	 * 		List(存取有序,有索引,可以重复)
	 * 			ArrayList
	 * 				底层是数组实现的,线程不安全,查找和修改快,增和删比较慢
	 * 			LinkedList
	 * 				底层是链表实现的,线程不安全,增和删比较快,查找和修改比较慢
	 * 			Vector
	 * 				底层是数组实现的,线程安全的,无论增删改查都慢
	 * 			如果查找和修改多,用ArrayList
	 * 			如果增和删多,用LinkedList
	 * 			如果都多,用ArrayList
	 * 		Set(存取无序,无索引,不可以重复)
	 * 			HashSet
	 * 				底层是哈希算法实现
	 * 				LinkedHashSet
	 * 					底层是链表实现,但是也是可以保证元素唯一,和HashSet原理一样
	 * 			TreeSet
	 * 				底层是二叉树算法实现
	 * 			一般在开发的时候不需要对存储的元素排序,所以在开发的时候大多用HashSet,HashSet的效率比较高
	 * 			TreeSet在面试的时候比较多,问你有几种排序方式,和几种排序方式的区别
	 * Map
	 * 		HashMap
	 * 			底层是哈希算法,针对键
	 * 			LinkedHashMap
	 * 				底层是链表,针对键
	 * 		TreeMap
	 * 			底层是二叉树算法,针对键
	 * 		开发中用HashMap比较多
	 */


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值