Java Map

原创
06/01 16:10
阅读数 35

Map

Collection子类存储数据是为了输出,Map子类存储数据是为了查询。

HashMap

  • HashMap 是无序的存储,你存储数据的顺序,和实际存储的顺序不一定一致
  • 在使用put方法存数据的时候,key可以重复,最后的值,覆盖前面的值,当遇到重复的key时使用put时,返回旧数据,否则返回null
  • put函数的key可以为null,当key不存在的时候,返回null
  • 初始化容量大小为16个元素,当达到阙值(0.75倍)的时候(比如:初始化是16个元素,0.75倍就是12,达到12个元素的时候,就会扩充),就会开始扩充,扩充的倍数为2倍
  • HashMap的实现原理(jdk1.8之后开始的):HashMap使用的Node类完成存储的,那么其数据结构就只可能是链表(时间复杂度O(n))和二叉树(时间复杂度O(log(n)))。HashMap中定义了一个常量(8),当存储的数据数量小于这个常量的时候,用链表存储,大于这个常量的时候,用的是红黑二叉树进行存储,并利用左旋和右旋实现数据查询的性能。

LinkedHashMap

LinkedHashMap 存储的数据结构为链表,因此不适合存储大量的数据。但是他存储数据的顺序和实际的存储的数据的顺序是一致的。

Hashtable

这个类的key和value都不能为null,否则会抛出异常

HashMap与Hashtable的异同

  • HashMap中的方法都是属于异步操作(非线程安全),允许保存null数据
  • Hashtable中的方法都是同步操作(线程安全),不允许保存null数据,否则抛出空指针异常

TreeMap

TreeMap属于有序的Map集合类,它可以按照Key进行排序,但是key不允许为null,因为需要用compareTo排序,但是value可以为空

Map.Entry

(以下代码适用于JDK1.9以后)在整个Map集合中,Map.Entry的作用就是作为一个Key,Value的包装类型使用。大部分情况下进行数据存储的时候都会将Key,Value包装成Map.Entry对项进行使用。

	Map.Entry<String, Integer> entry = Map.entry("one", 1);
		System.out.println("获取key:" + entry.getKey());
		System.out.println("获取value:" + entry.getValue());
		System.out.println(entry.getClass().getName());

Map集合输出

Map利用Iterator输出

  1. 将Map利用entrySet函数转为Set集合
  2. 将Set集合利用iterator函数转为Iterator实例
  3. 迭代输出每一组Map.Entry对象,然后利用getKeygetValue函数,获取数据
		Map<String, Integer> map = new HashMap<String, Integer>();
		map.put("one", 1);
		map.put("two", 2);
		
		Set<Map.Entry<String, Integer>> set= map.entrySet();
		for (Map.Entry<String, Integer> entry : set) {
			System.out.println("key:" + entry.getKey() + "; value:" + entry.getValue());
		}

Map虽然支持集合迭代输出,但是Map主要是为了通过key查找数据。

Key 的定义

对于自定义的Key,一定要覆写hashCodeequals函数。原因在于:

  1. Map的put方法,在存入的时候,存入hashCode方法生成的hash值
  2. Map的get方法,在取数据的时候,会使用hashCode来查询数据,equals函数对比

hashCodeequals函数,eclipse可以自动生成。

展开阅读全文
打赏
0
0 收藏
分享
加载中
更多评论
打赏
0 评论
0 收藏
0
分享
返回顶部
顶部