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: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是第一生产力。
  • 不要追求对人都无差别的热情,没有亲疏之别,怎么对得起你生命中那些重要的人。——蔡康永

我嘞个去,终于过了。。 

  • 6
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 6
    评论
Java中的HashMapTreeMap和LinkedHashMap都是实现了Map接口的类,它们都用于存储键值对。它们之间的主要区别在于它们的内部实现方式和性能表现。 1. HashMap HashMap是最常用的Map实现类之一,它基于哈希表实现,可以快速地进行数据查找和插入。HashMap允许插入null作为键或值,但是它不是线程安全的,如果多个线程同时修改一个HashMap实例,可能会导致数据不一致。另外,HashMap的迭代顺序是不确定的。 2. TreeMap TreeMap是基于红黑树实现的Map,它可以保证元素按照键的自然顺序排序或者使用自定义的Comparator进行排序。因为TreeMap的元素是有序的,因此它的性能比HashMap略差。另外,TreeMap不允许键为null,但是允许值为null。 3. LinkedHashMap LinkedHashMapHashMap的一个子类,它保留插入顺序,也就是说元素的迭代顺序和插入顺序一致。LinkedHashMap的性能比HashMap略差,但是在迭代访问时比HashMap更快。LinkedHashMap允许插入null作为键或值,但是不是线程安全的。 综上所述,如果需要快速的查找和插入,可以选择HashMap;如果需要按照键的自然顺序或者自定义顺序访问元素,可以选择TreeMap;如果需要保留插入顺序或者需要快速访问元素,可以选择LinkedHashMap。需要注意的是,以上三种Map都不是线程安全的,如果需要在多线程环境下使用,需要进行同步处理。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值