目录

1、HashMap vs TreeMap

2、HashMap简介

3、Java HashMap 与TreeMap方法

4、HashMap例题  2019蓝桥杯B组JAVA  试题G: 外卖店优先级

5、TreeMap例题  统计词频 

6、java面试题之HashMap和TreeMap


1、HashMap vs TreeMap

Map:在数组中是通过数组下标来对 其内容进行索引的,而Map是通过对象来对 对象进行索引的,用来 索引的对象叫键key,其对应的对象叫值value;

1、HashMap是通过hashcode()对其内容进行快速查找的;HashMap中的元素是没有顺序的;

    TreeMap中所有的元素都是有某一固定顺序的,如果需要得到一个有序的结果,就应该使用TreeMap;

2、HashMap和TreeMap都不是线程安全的;

3、HashMap继承AbstractMap类;覆盖了hashcode() 和equals() 方法,以确保两个相等的映射返回相同的哈希值;

     TreeMap继承SortedMap类;他保持键的有序顺序;

4、HashMap:基于hash表实现的;使用HashMap要求添加的键类明确定义了hashcode() 和equals() (可以重写该方法);为了优化HashMap的空间使用,可以调优初始容量和负载因子;

     TreeMap:基于红黑树实现的;TreeMap就没有调优选项,因为红黑树总是处于平衡的状态;

5、HashMap:适用于Map插入,删除,定位元素;

     TreeMap:适用于按自然顺序或自定义顺序遍历键(key);

2、HashMap简介

  1. HashMap 是一个散列表,它存储的内容是键值对(key-value)映射。
  2. HashMap 实现了 Map 接口,根据键的 HashCode 值存储数据,具有很快的访问速度,最多允许一条记录的键为 null,不支持线程同步。
  3. HashMap 是无序的,即不会记录插入的顺序。
  4. HashMap 继承于AbstractMap,实现了 Map、Cloneable、java.io.Serializable 接口。

 HashMap 类位于 java.util 包中,使用前需要引入它,语法格式如下:

import java.util.HashMap; // 引入 HashMap 类

创建一个 HashMap 对象 Sites, 整型(Integer)的 key 和字符串(String)类型的 value:

HashMap<Integer, String> Sites = new HashMap<Integer, String>();

创建一个 HashMap 对象的数组a

		HashMap<Integer, Integer> a[]=new HashMap[t+1];
		for(int i=0;i<=t;i++) {
			a[i]=new HashMap<Integer, Integer>();
		}

3、Java HashMap 与TreeMap方法

Java HashMap 常用方法列表如下:(TreeMap方法与HashMap 方法大致一样)

方法 描述
clear() 删除 hashMap 中的所有键/值对
clone() 复制一份 hashMap
isEmpty() 判断 hashMap 是否为空
size() 计算 hashMap 中键/值对的数量
put() 将键/值对添加到 hashMap 中
putAll() 将所有键/值对添加到 hashMap 中
putIfAbsent() 如果 hashMap 中不存在指定的键,则将指定的键/值对插入到 hashMap 中。
remove() 删除 hashMap 中指定键 key 的映射关系
containsKey() 检查 hashMap 中是否存在指定的 key 对应的映射关系。
containsValue() 检查 hashMap 中是否存在指定的 value 对应的映射关系。
replace() 替换 hashMap 中是指定的 key 对应的 value。
replaceAll() 将 hashMap 中的所有映射关系替换成给定的函数所执行的结果。
get() 获取指定 key 对应对 value
getOrDefault() 获取指定 key 对应对 value,如果找不到 key ,则返回设置的默认值
forEach() 对 hashMap 中的每个映射执行指定的操作。
entrySet() 返回 hashMap 中所有映射项的集合集合视图。
keySet() 返回 hashMap 中所有 key 组成的集合视图。
values() 返回 hashMap 中存在的所有 value 值。
merge() 添加键值对到 hashMap 中
compute() 对 hashMap 中指定 key 的值进行重新计算
computeIfAbsent() 对 hashMap 中指定 key 的值进行重新计算,如果不存在这个 key,则添加到 hasMap 中
computeIfPresent() 对 hashMap 中指定 key 的值进行重新计算,前提是该 key 存在于 hashMap 中。

4、HashMap例题  2019蓝桥杯B组JAVA  试题G: 外卖店优先级

oj:http://oj.ecustacm.cn/problem.php?id=1458

“饱了么”外卖系统中维护着N 家外卖店,编号1 N。每家外卖店都有一个优先级,初始时(0 时刻) 优先级都为0。每经过1 个时间单位,如果外卖店没有订单,则优先级会减少1,最低减
到0;而如果外卖店有订单,则优先级不减反加,每有一单优先级加2。如果某家外卖店某时刻优先级大于5,则会被系统加入优先缓存中;如果优先级小于等于3,则会被清除出优先缓存。给定T 时刻以内的M 条订单信息,请你计算T 时刻时有多少外卖店在优
先缓存中。

【输入格式】
第一行包含3 个整数N、M 和T。以下M 行每行包含两个整数ts 和id,表示ts 时刻编号id 的外卖店收到一个订单。
【输出格式】输出一个整数代表答案。
【样例输入】
2 6 6
1 1
5 2
3 1
6 2
2 1
6 2

【样例输出】
1

【样例解释】6 时刻时,1 号店优先级降到3,被移除出优先缓存;2 号店优先级升到6,加入优先缓存。所以是有1 家店(2 号) 在优先缓存中。

package javaB省赛2019;

/*有个坑:
虽然优先级的减少和增加貌似是一起进行的,但是,容易出现一种特殊情况。
店家本来优先级为6…就是说店家在优先级内
如果第四天接到1个订单…店家此时优先级为4,但是不在优先队列内。
所以优先级的减少和增加应该分开操作,并且每次操作后都应该进行判断,此时是否应该存在于优先队列*/
import java.util.HashMap;
import java.util.Scanner;
public class G外卖店优先级 {
	@SuppressWarnings("unchecked")
	public static void main(String[] args) {
		Scanner in = new Scanner(System.in);
		int n=in.nextInt();
		int m=in.nextInt();
		int t=in.nextInt();
		//hashMap记录编号和订单数
		HashMap<Integer, Integer> a[]=new HashMap[t+1];
		for(int i=0;i<=t;i++) {
			a[i]=new HashMap<Integer, Integer>();
		}
		int ts,id;
		for(int i=0;i<m;i++) {//将m条订单添加到HashMap
			ts=in.nextInt();
			id=in.nextInt();
			if(a[ts].containsKey(id)) {//订单数+1
				a[ts].put(id, a[ts].get(id)+1);
			}
			else {
				a[ts].put(id,1);
			}
		}
		int[] pri=new int[n+1];
		int[] last=new int[n+1];
		int[] score=new int[n+1];
		for(int i=0;i<=t;i++) {//枚举时间
			for(int j:a[i].keySet()) {//枚举外卖店
				score[j]=Math.max(score[j]-(i-last[j]-1), 0);//减去无订单的失分,但最小值为0
				//增减优先级分开判断的目的:防止当6->3->5时变成6->5而仍在队中
				if(score[j]>5&&pri[j]==0)pri[j]=1;  //判断是否入队
				else if(score[j]<4&&pri[j]==1)pri[j]=0;
				score[j]+=2*a[i].get(j);//加上当前外卖店的订单对应得分
				if(score[j]>5&&pri[j]==0)pri[j]=1;//判断是否入队
				last[j]=i;//记录最后一次有订单时间				
			}
		}
		for(int i=0;i<=n;i++){//最后时间t,需要再处理分数!!再判断一次是否会出队!
			score[i]=Math.max(score[i]-(t-last[i]),0);
			if(score[i]<4&&pri[i]==1){
				pri[i]=0;
			}
		}
		int ans=0;
		for(int i=0;i<=n;i++)
			ans+=pri[i];
		System.out.println(ans);
	}
}

5、TreeMap例题  统计词频 

package demo1;
import java.util.Scanner;
import java.util.TreeMap;
//题目:统计最多的词频,按字典序输出最多的单词和次数
//Five Little Monkeys Jumping on the Bed. It was bedtime. So five little monkeys took a bath. Five little Monkeys put on their pajamas.
//len<=1000
//output: five 3
public class Test2 {
	public static void main(String[] args) {
		Scanner in = new Scanner(System.in);
		String s=in.nextLine();
		String[] s1=s.split(" ");
		char last_ch;
		TreeMap<String,Integer> m=new TreeMap<>();
		for(int i=0;i<s1.length;i++) {
			s1[i]=s1[i].toLowerCase();
			last_ch=s1[i].toCharArray()[s1[i].length()-1];
			if(last_ch<'a'||last_ch>'z') {//非字符就去掉
				s1[i]=s1[i].substring(0, s1[i].length()-1);
			}
		}
		for(int i=0;i<s1.length;i++) {
			if(!m.containsKey(s1[i])) { //如果不存在,则存进去 比如   five:1
				m.put(s1[i],1);
			}
			else {  //如果存在 ,先找到 此key对应的 value值
				int value=m.get(s1[i]);
				m.put(s1[i], value+1);//覆盖前者的的key值,并且比前者多加一次
			}
		}
		for(String ss:m.keySet()) {
			System.out.println(ss+":"+m.get(ss));
		}
		int max=0;
		for(String ss:m.keySet()) {//查找最高频次
			max=Math.max(m.get(ss), max);
		}	
		for(String ss:m.keySet()) {//查找最高频次对应的单词
			if(m.get(ss)==max) {
				System.out.println(ss);
				System.out.println(max);
				break;
			}
		}
	}
}

6、java面试题之HashMap和TreeMap

1.HashMap和TreeMap的异同点?

相同点:

  1. 都是以key和value的形式存储;
  2. key不可以重复;
  3. 都是线程不安全的;

不同点:

  1. HashMap的key可以为空
  2. TreeMap的key值是有序的(使用了红黑树的二叉树结构存储的Entry)

2.如何决定使用HashMap还是TreeMap?

  • HashMap基于散列桶(数组和链表)实现;TreeMap基于红黑树实现。

  • HashMap不支持排序;TreeMap默认是按照Key值升序排序的,可指定排序的比较器,主要用于存入元素时对元素进行自动排序。

  • HashMap大多数情况下有更好的性能,尤其是读数据。在没有排序要求的情况下,使用HashMap。

我的妈呀!服了!改了n遍,审核老是不让过啊啊啊啊,所以我决定文章末尾加上一些一些不相干的内容,大伙勿在意。。。可自行跳过

  • I love you so much,I just don’t like you any more.”。意为:“我还是很爱你,只是已经不再喜欢你了。
  • 你最初爱的那个人并不是你最终爱的那个人,爱不是最终目标,而是一个过程,借助这个过程,一个人想去了解另一个人。——约翰·威廉斯《斯通纳》
  • 无论谁离开了你,别忘了,他没来之前,你本就是一个人生活。
  • 真正坚持到最后的人靠的不是激情,而是恰到好处的喜欢和投入。
  • 你的善良,要有点锋芒。
  • 此地不留爷,自有留爷处。
  • 人要往前看。
  • 不勉强,不强求,不欺骗,不将就,一个人,向前走,天涯共此生,明月诚相待,若是无所求,天地仍光明。
  • 痛苦不是成本,失去机会才是。
  • 真的是有压力才有动力,deadline是第一生产力。
  • 不要追求对人都无差别的热情,没有亲疏之别,怎么对得起你生命中那些重要的人。——蔡康永

我嘞个去,终于过了。。 

Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐