如何高效的使用HashMap

本文介绍了如何高效地使用HashMap,包括理解HashMap的工作原理、重写HashCode()方法的原则,以及如何结合equals()方法确保数据的一致性和提高查找效率。
HashMap是知道怎么实现的了,哈哈,那么我们应该怎么使用HashMap才能达到最高的效率
HashMap通过hashcode对其内容进行快速查找,而TreeMap中所有的元素都保持着某种固定的顺序,如果你需要得到一个有序的结果你就应该使
用TreeMap(HashMap中元素的排列顺序是不固定的)。

使用HashMap,重写HashCode()的原则:
1.不必对每个不同的对象都产生一个唯一的hashcode,只要你的HashCode方法使get()能够得到put()放进去的内容就可以了。即"不为一原则"。
2.生成hashcode的算法尽量使hashcode的值分散一些,不要很多hashcode都集中在一个范围内,这样有利于提高HashMap的性能。即"分散原则"。
这两条的意思是hashCode可以返回一样,但是尽量不同。
当以对象作为key传递时,HashMap会取对象的hashCode()方法来进行位运算得到在HashMap中数组的下标(见HashMap源码解析).
如果不同的对象都产生一个唯一的hashCode(),那么其离散度会大一点,也就是取的时候可能直接根据下标得到对象。
第一条原则还有一点,你的HasCode方法使get()能够得到put(0放进去的内容,也就是说你的hashCode可以相同,那么你根据对象key得到的
就是木桶链(见HashMap源码解析),循环木桶链必须能够找到所对应的内容,这也是为什么我们要重写hashCode()和equals()方法的原因了

以下是我整理出来的原则,我们不仿把对象比喻成数据库的表,HashCode()比喻成其唯一键(可以是组合唯一键),equals()方法来得到唯一键计算的结束。[唯一键不同就为不同的对象],当然还有一种情况,我这张表(对象)没有唯一键怎么办,那么HashCode()方法根据离散原则尽量返回不同的值[int],在equals()方法必须判断其唯一性或者至少符合你的业务逻辑的需要.
### 题目重述 我们需要编写一个 Java 程序,完成以下两个任务: 1. 生成一个长度为10的数组,其中的元素是0到5之间的随机整数,并输出数组内容。 2. 统计数组中每个数字(0到5)出现的次数,**不使用HashMap**,并按照指定格式输出每个数字的出现次数。 --- ### 给出答案 下面是不使用 HashMap,而是使用数组进行统计的 Java 实现: ```java import java.util.Random; public class ElementFrequency { public static void main(String[] args) { // 1. 生成随机数组 Random rand = new Random(); int[] arr = new int[10]; System.out.print("数组内容:"); for (int i = 0; i < arr.length; i++) { arr[i] = rand.nextInt(6); // 生成0到5之间的随机整数 System.out.print(arr[i] + " "); } System.out.println(); // 2. 使用数组统计每个数字出现的次数(0到5) int[] count = new int[6]; // 下标0~5分别对应数字0~5的出现次数 for (int num : arr) { count[num]++; } // 3. 输出每个数字的出现次数 for (int i = 0; i < 6; i++) { System.out.println(i + "出现了" + count[i] + "次"); } } } ``` --- ### 代码解析 - `Random rand = new Random();`:创建一个随机数生成器。 - `int[] arr = new int[10];`:声明一个长度为10的整型数组。 - `arr[i] = rand.nextInt(6);`:生成0到5之间的随机整数并赋值给数组。 - `int[] count = new int[6];`:创建长度为6的数组,用于统计0~5各自出现的次数。 - `count[num]++;`:根据数组元素值,对相应下标的统计值进行自增。 - 最后通过一个循环,依次输出0到5的出现次数。 --- ### 知识点 1. **数组索引的灵活使用**:利用数组下标作为0~5的数字本身,实现高效的计数器功能。 2. **Random类的nextInt方法**:用于生成指定范围的随机整数。 3. **增强型for循环(for-each)**:用于遍历数组元素,使代码更简洁清晰。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值