java HashMap与TreeMap总结

目录

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:.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条订单添加到HashMapts=in.nextInt();id=in.nextInt();if(a[ts].containsKey(id)) {//订单数+1a[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:1m.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是第一生产力。
  • 不要追求对人都无差别的热情,没有亲疏之别,怎么对得起你生命中那些重要的人。——蔡康永

我嘞个去,终于过了。。