HashMap的put()方法

java Debug ------------------集合 HashMap

需求: 希望从文件里读数据,每一行都存到HashMap中,key是每一行第一个段,Value是ArrrayList对象,key如果有重复责存入同一个ArrayList中;

budge 修复后:

if(pName_file.equals(pName_map))
{
/// sop("if ::" + pName_map); list.add(line);
}
else 
{/// sop("else ::" + pName_file);hm.put(pName_map, new ArrayList(list)); // Debug 此处的value必须要new 一个新的对象,不然后面list对象改动map中也会改变
pName_map = pName_file;
list.clear();
list.add(line);
}


完整代码:

class HashMapTest
{
	
	public static void main(String[] args)
	{
		
		readFromFile();
		
	}

	public static void readFromFile()
	{
		HashMap hm = new HashMap();
		List list = new ArrayList();

		BufferedReader bufr = null;

		String pName_map = null;
		String[] str_arr = null;
		String line = null;
		try
		{
			//打开文件
			File f = f = new File("D:\\桌面\\xxxxxxxxxxx\\yyyyyyyyyy\\zzzzzzzzzzz\\test");
			bufr =new BufferedReader( new InputStreamReader(new FileInputStream(f)));
		
			// 获取 文件第一行的包名 
			if ((line = bufr.readLine()) != null)
			{
				str_arr = line.split(";");
				assert(str_arr.length >= 3);
				pName_map = str_arr[0];		
		//		cname = str[1];		
		//		mname = str[2];		
				
///				sop("FIRST LINE:" + line);
				list.add(line);
			}
			

			//在读取文件信息 到HashMap
			while((line = bufr.readLine()) != null)
			{
				
				str_arr = line.split(";");
				assert(str_arr.length >= 3);
				String pName_file = str_arr[0];
				
///				sop(pName_file);
///				sop(pName_map);
				if(pName_file.equals(pName_map))		// 注意对象的比较 只能是equals   
				{
///					sop("if ::" + pName_map);
					list.add(line);
				}
				else 
				{
///					sop("else ::" + pName_file);
					hm.put(pName_map, new ArrayList(list));        // Debug 此处的value必须要new 一个新的
					pName_map = pName_file;	
					list.clear();
					list.add(line);
					
				}
			}
			hm.put(pName_map, new ArrayList(list));

			output(hm);
		}
		catch (Exception e)
		{
			e.printStackTrace();
		}
		finally
		{
			if (bufr != null)
			{
				try
				{
					bufr.close();
				}
				catch (Exception e)
				{
					e.printStackTrace();
				}
				
			}			
		}
	}

	public static void output(Map map)
	{  
      if (map != null)
		 {  
			 Object key = null;  
			 Object value = null;  
			 //使用迭代器遍历Map的键,根据键取值  
			 Iterator it = map.keySet().iterator();  
			 while (it.hasNext())
			 {  
				key = it.next();  
				value = map.get(key); 
//				sop(value.toString());
				ArrayList v = (ArrayList)value;
//				sop(v.toString());
				System.out.println("key: " + key + "; value: ");  
				
				
				Object[] objArr = v.toArray();
				for (int i = 0; i < objArr.length ; i++ )
				{
					sop(objArr[i]);
				}
				
				/*
				Iterator it1 = v.listIterator();

				while(it1.hasNext())
				{
					sop(it1.next() + "\n");
				}*/
				
			 }  
			/*
			 //或者使用迭代器遍历Map的记录Map.Entry  
			 Map.Entry entry = null;  
			 it = map.entrySet().iterator();  
			 while (it.hasNext())
			 {  
				//一个Map.Entry代表一条记录  
				entry = (Map.Entry)it.next();  
				//通过entry可以获得记录的键和值  
				//System.out.println("key: " + entry.getKey() + "; value: " + entry.getValue());  
			 } */
		 }
	  }

	public static void sop(Object obj)
	{
		System.out.println(obj);
	}
}




从程序员的视角,看计算机系统! 本书适用于那些想要写出更快、更可靠程序的程序员。通过掌握程序是如何映射到系统上,以及程序是如何执行的,读者能够更好的理解程序的行为为什么是这样的,以及效率低下是如何造成的。粗略来看,计算机系统包括处理器和存储器硬件、编译器、操作系统和网络互连环境。而通过程序员的视角,读者可以清晰地明白学习计算机系统的内部工作原理会对他们今后作为计算机科学研究者和工程师的工作有进一步的帮助。它还有助于为进一步学习计算机体系结构、操作系统、编译器和网络互连做好准备。 本书的主要论题包括:数据表示、C程序的机器级表示、处理器结构,程序优化、存储器层次结构、链接、异常控制流、虚拟存储器和存储器管理、系统级I/O、网络编程和并发编程。书中所覆盖的内容主要是这些方面是如何影响应用和系统程序员的。例如,在讲述数据表示时,本书说明了用来表示数字的表示方法是有限的,它能够近似地表示整数和实数,但是这种表示方法是有限制的,程序员必须了解。在讲述高速缓存时,本书讨论了矩阵代码中的循环变量的顺序是如何影响程序的性能的。在讨论网络互连时,本书描述了并发服务器如何能有效地处理来自多个客户端的请求。 本书基于Intel兼容(IA32)机器,在Unix或者相关的操作系统(例如,Linux)上执行C程序。虽然书中包括了一些帮助读者将Java转化成C的提示,但是还是要求读者对C或者C++有一定的了解。 您可以通过本书的Web网站www.csapp.cs.cmu.edu获得完整的资料,包括实验和作业,授课笔记和代码示例。 本书英文版久负盛名,被众多专业人士称为“最伟大的计算机教材”之一,著名的美国卡内基梅隆大学计算机科学系一直将本书作为教材使用,程序员眼中的透彻讲述计算机系统的扛鼎之作。作者Randal E. Bryant是卡耐基梅隆大学的计算机科学系主任,ACM和IEEE双院士(Fellow),其研究成果多次获得ACM和IEEE颁发的大奖。   本书共分十三章,分别介绍了信息的表示和处理、程序的机器级表示、处理器体系结构、存储器层次结构、静态和动态链接、虚拟存储器、系统级I/O、网络编程和并发编程等精彩内容。其目的是解释计算机系统的所有本质概念,并向读者展示这些概念是如何实际地影响应用程序的正确性、性能和实用性。与其他主要针对系统构造人员的系统类书籍不同,这本书是写给程序员的,是从程序员的角度来描述的。本书为软件和硬件之间搭起了一个桥梁,它给出了一种帮助读者分别从硬件和软件的角度去理解一个程序及其行为的途径,这也填补了国内计算机系统教学中的一个空白。本书的最大优点是帮助读者理解概念,让读者很清楚地在脑海中构造一个层次型的计算机系统,从最低层数据在内存中的表示(如我们一直陌生的浮点数表示),到流水线指令的构成,到虚拟存储器,到编译系统,到动态加载库,到最后的用户应用。   本书提供了大量的例子和练习及部分答案。尤其值得一提的是,对于每一个基本概念都有相应的笔头或程序试验,加深读者的理解。
HashMap的put方法是用来将键值对存储到HashMap中的。在put方法中,首先通过hash(key)计算出要存储的位置,然后调用putVal方法来实际执行插入操作。\[1\] 在putVal方法中,首先判断要插入的位置是否已经存在元素。如果该位置为空,则直接将键值对存储在该位置上。如果该位置已经存在元素,则需要根据具体情况进行处理。 如果该位置上的元素是一个链表,则需要遍历链表,查看是否存在与要插入的键相同的键。如果存在相同的键,则更新对应的值;如果不存在相同的键,则将新的键值对添加到链表的末尾。同时,还需要判断链表的长度是否达到了阈值,如果达到了阈值,则将链表转换为红黑树。\[2\] 如果该位置上的元素是一个红黑树节点,则将要插入的键值对封装成一个红黑树节点,并添加到红黑树上。在添加过程中,还会判断红黑树中是否已经存在相同的键,如果存在,则更新对应的值。\[3\] 总结起来,HashMap的put方法会根据键的哈希值计算出存储位置,然后根据具体情况进行插入操作,包括直接存储、链表插入和红黑树插入。 #### 引用[.reference_title] - *1* *2* [HashMap中put方法详解](https://blog.csdn.net/lubiaojava/article/details/119780055)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item] - *3* [HashMap的put方法](https://blog.csdn.net/AAAWell/article/details/125898104)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值