Java中HashMap实现1对N

              我们都知道在Java中的HashMap默认的是1对1,但其实可以处理一下让他适合1对来存储数据,其实也就是对键值对中得值的数据进行及时的更新.我们实现这一操作作用到了分拣存储;

            那么什么是分拣存储呢?你可以这样理解,和快递员分捡快递来类比,快递的目的地有很多,比如有北京上海山东等等,比如一开始我拿到了一个发往山东的包裹,那么快递员就要看看是否已经有一个放发往山东的袋子,如果有就直接放入,如果没有就拿一个袋子来。 分拣存储也就这点东西。

         那么来看一个列子,给你一句英文,让你统计这句话中每个单词出现的次数:

import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import java.util.Set;
/**
 * HahMap :1:N
 * @author SKH&L
 *
 */
public class Main {
	public static void main(String[] args){
		String str="skh is very very cute and cute";
		String []s=str.split(" ");
		Map<String,Integer> map=new HashMap<String,Integer>();
		for(String q:s) {
			if(!map.containsKey(q)) {//如果不存在就创建一个袋子;
				map.put(q, 1);
			}
			else
			{//如果已存在就加入,并更新相应的V;
				map.put(q, map.get(q)+1);
			}
		}
		//迭代器遍历
		Set<String>set=map.keySet();
		//获取对象
		Iterator<String> it=set.iterator();
	   while(it.hasNext()) {
		   String key=it.next();
		   System.out.println(key+"-->"+map.get(key));
	   }	
	}
}

输出结果:

skh-->1
very-->2
and-->1
is-->1
cute-->2

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Java,`HashMap`是基于哈希表的线程非安全实现,它用来存储键值对,并且允许键为空(null)。以下是`HashMap`在Java的底层实现原理概述: ### 数据结构 - `HashMap`的基本单位是桶(Bucket)。在Java,桶是一个Node节点的数组。 - 每个Node包含一对数据:键(Key)和值(Value),以及指向下一个Node的引用(链接)。 ### 哈希函数 - `HashMap`使用键的hashCode()方法生成一个哈希值,然后对哈希表大小进行模运算得到桶的索引。 - 如果多个键产生相同的哈希值(哈希碰撞),`HashMap`采用链式探查(Linked List)来解决冲突。 ### 存储与搜索 - 当添加一个新的键值对时,首先计算键的哈希码,找到对应的桶。如果桶为空,创建一个新链表;若存在,则将新节点添加到链表末尾。 - 当搜索某个键时,同样使用它的哈希码定位到对应的桶,然后遍历链表查找目标键。 ### 扩容机制 - 当哈希表的负载因子(加载因子,默认为0.75)超过阈值时,`HashMap`会自动扩容。这时,它会创建一个新的、容量更大的哈希表,并重新将原有的元素按照新的哈希函数分配到新表。 - 扩容过程,旧的哈希表被复制到新的数组里,并清除一些临时数据。 ### 线程安全性 - Java 8及之后的版本引入了更强的线程同步策略。默认情况下,线程访问是不安全的,但如果需要线程安全的实现,可以通过使用`ConcurrentHashMap`替代。 ### 效率考量 - `HashMap`的平均时间复杂度为O(1),但由于哈希碰撞和扩容的影响,极端情况下性能可能下降到O(n)。 了解`HashMap`的工作原理有助于合理使用和优化它在应用程序的表现。记住适当调整负载因子和初始容量可以帮助避免不必要的扩张成本和提升性能。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值