`

hashmap中赋值问题,存取问题

阅读更多

参考:http://hi.baidu.com/sunflower87/item/bf613b045a1f3717addc70ca

 

1, 有一个hashmap1, 将它赋给 hashmap2,当将 hashmap2作改动时,hashmap1也会有变动,如code1。怎么才能让它们俩的操作不相关呢?

HashMap<Integer, String> hashmap1 = new HashMap<Integer, String>();
   hashmap1.put(1, "sunday");
   hashmap1.put(2, "monday");
   hashmap1.put(3, "tuesday");
   hashmap1.put(4, "Wednesday");
   hashmap1.put(5, "Thursday");
   hashmap1.put(6, "Friday");
   hashmap1.put(7, "Saturday");

   System.out.println("the value of map is :" + hashmap1.values());

   Map<Integer, String> testMap = new HashMap<Integer, String>();
   testMap = hashmap1; // 赋值操作
   System.out.println(" 新的 testMap 中值为:-------------");
   System.out.println("testmap:" + testMap.values()+ "\n");
  
   if (Calendar.getInstance().get(Calendar.DAY_OF_WEEK) == 5) {
    testMap.remove(Calendar.getInstance().get(Calendar.DAY_OF_WEEK));
   }
   System.out.println(" 新的 testMap 中,删除一个元素后,为:-------------");
   System.out.println("testMap remove" + testMap.values() + ",week:"
     + Calendar.getInstance().get(Calendar.DAY_OF_WEEK) + "\n");
   System.out.println(" 新的 testMap 中,删除一个元素后,原来 的 hashmap1 为:-------------");
   System.out.println("the result map :" + hashmap1.values());

结果:

the value of map is :[sunday, monday, tuesday, Wednesday, Thursday, Friday, Saturday]
新的 testMap 中值为:-------------
testmap:[sunday, monday, tuesday, Wednesday, Thursday, Friday, Saturday]

新的 testMap 中,删除一个元素后,为:-------------
testMap remove[sunday, monday, tuesday, Wednesday, Friday, Saturday],week:5

新的 testMap 中,删除一个元素后,原来 的 hashmap1 为:-------------
the result map :[sunday, monday, tuesday, Wednesday, Friday, Saturday]

remove后,hashmap1 和 testMap 都没有 Thursday 了。

原因:testmap = hashmap1; 表示testMap和map都指向同一个对象,所以调用testMap.remove也就是调用map.remove,其实都是对同一个对象进行操作。Java值传递,你new的第二个Map没有存放东西,指向了第一个Map对象,两个引用都指向了第一个Map对象,清空操作当然会清空第一个Map的

这里有三个解决方法:

1。建议clone()方法创建新的testMap

2. 将第一个map的值通过遍历的方式赋值给第二个map,这样你操作任意一个map, 
另一个map都不会改变。 见code3.
3. 用putAll方法赋值,本质也是 2 中的方法。见 code2.

code2:

firstMap.put("1", "one");
         firstMap.put("2", "two");
         firstMap.put("3", "three");

         Map<String, String> anotherMap = new HashMap<String, String>();
         anotherMap.putAll(firstMap); //赋值操作
         
         System.out.println("firstMap 赋给 anotherMap 后,firstMap为:" + firstMap.values());
         anotherMap.remove("2");

         System.out.println("anotherMap remove KEY 为 \"2\"后,anotherMap为 :" + anotherMap.values());
         System.out.println("anotherMap remove KEY 为 \"2\"后,firstMap为:" + firstMap.values());

结果:

firstMap 赋给 anotherMap 后,firstMap为:[three, two, one]
anotherMap remove KEY 为 "2"后,anotherMap为 :[three, one]
anotherMap remove KEY 为 "2"后,firstMap为:[three, two, one]

code3:

HashMap<Integer, String> hashmap1 = new HashMap<Integer, String>();
   hashmap1.put(1, "sunday");
   hashmap1.put(2, "monday");
   hashmap1.put(3, "tuesday");
   hashmap1.put(4, "Wednesday");
   hashmap1.put(5, "Thursday");
   hashmap1.put(6, "Friday");
   hashmap1.put(7, "Saturday");

   System.out.println("the value of map is :" + hashmap1.values());

   Map<Integer, String> testMap = new HashMap<Integer, String>();

   Iterator it = (Iterator) hashmap1.entrySet().iterator(); // 赋值操作
   while (((java.util.Iterator<Entry<Integer, String>>) it).hasNext()) {
    Map.Entry entry = (Map.Entry) it.next();
    Integer key = (Integer) entry.getKey();
    Object val = entry.getValue();
    testMap.put(key, (String) val);
   }
  
  
  
   System.out.println(" 新的 testMap 中值为:-------------");
   System.out.println("testmap:" + testMap.values()+ "\n");
  
   if (Calendar.getInstance().get(Calendar.DAY_OF_WEEK) == 5) {
    testMap.remove(Calendar.getInstance().get(Calendar.DAY_OF_WEEK));
   }
   System.out.println(" 新的 testMap 中,删除一个元素后,为:-------------");
   System.out.println("testMap remove" + testMap.values() + ",week:"
     + Calendar.getInstance().get(Calendar.DAY_OF_WEEK) + "\n");
   System.out.println(" 新的 testMap 中,删除一个元素后,原来 的 hashmap1 为:-------------");
   System.out.println("the result map :" + hashmap1.values());

结果:

the value of map is :[sunday, monday, tuesday, Wednesday, Thursday, Friday, Saturday]
新的 testMap 中值为:-------------
testmap:[sunday, monday, tuesday, Wednesday, Thursday, Friday, Saturday]

新的 testMap 中,删除一个元素后,为:-------------
testMap remove[sunday, monday, tuesday, Wednesday, Friday, Saturday],week:5

新的 testMap 中,删除一个元素后,原来 的 hashmap1 为:-------------
the result map :[sunday, monday, tuesday, Wednesday, Thursday, Friday, Saturday]

分享到:
评论

相关推荐

    ASP实现类似hashMap功能的类

    java中的hashMap存取数据非常方便,可惜ASP中没有类似的类。作者在开发程序中需要类似的数据类型,于是构造了一个能基本类似hashMap功能的类,可以实现键值存取操作等,存取的数据可以为ASP 中的任何基本类型。 下面...

    java面试宝典

    202、用jdom解析xml文件时如何解决中文问题?如何解析? 48 203、编程用JAVA解析XML的方式. 49 204、EJB2.0有哪些内容?分别用在什么场合? EJB2.0和EJB1.1的区别? 51 205、EJB与JAVA BEAN的区别? 51 206、EJB的基本...

    2021-2022计算机二级等级考试试题及答案No.4031.docx

    - **问题描述**:正确地在CSS文件中插入注释的方式是什么? - **解析**:在CSS文件中插入注释是为了提高代码的可读性,方便开发者理解和维护代码。CSS支持一种注释格式,即使用`/* ... */`来包围注释内容。这种...

    java课程设计(通讯录管理系统).pdf

    在Java中,HashMap是线程不安全的,但是相比于Hashtable,HashMap的存取速度更快,因为它没有同步锁。 知识点五:异常处理 在execute()方法中,可以看到使用了try-catch语句块来捕获并处理异常。这是一种常见的编程...

    2021-2022计算机二级等级考试试题及答案No.10825.docx

    12. RAM特性:RAM(随机存取存储器)中的数据在电源断开后会丢失。 13. PowerPoint图表插入:在PowerPoint中,可以通过【插入】菜单的【图表】命令插入图表。 14. 关系模型:关系模型是一种数据模型,用二维表的...

    java泛型的应用

    3. 存取HashMap中的元素,如`test4()`方法所示,可以使用`Map, Integer&gt;`限定键值对的类型,然后通过`map.entrySet()`获取所有键值对的Set,并用迭代器遍历它们。 需要注意的是,泛型类型参数只能是引用类型,不能...

    jsp结合javabean的实践

    //HashMap是非常常用的对象,用put(obj key,obj value)赋值,用get(obj key)获得对应的value 对象。 hm.put("sum",new Double(sum_dingdan)); }catch (Exception e){ System.out.println(e.getMessage());...

    2021-2022计算机二级等级考试试题及答案No.19257.docx

    4. 制作和传播计算机病毒是违反法律的行为,可能导致法律责任和网络安全问题。 5. 在Word中,无论是编辑文字还是图形,都需要先选定操作对象,这是基本的编辑原则。 6. 复选框控件的`Value`属性在选中时,其值可以...

    java编码规范考试题答案.docx

    1. **集合类**:Java中的集合类(如ArrayList, HashSet, HashMap等)需要指定模板类型,以保证类型安全。集合类的属性命名应体现复数意义,例如`users`, `products`。垃圾回收器会自动回收集合中的对象,无需手动...

    JAVA面试宝典包含名词解释,常问问题。

    final 类不能有子类,final 方法不能在子类中被重定义,而 final 变量一旦初始化后就不能再次赋值。 5. **String 类的常用方法**: String 类提供了多种方法,如 `indexOf()` 查找子字符串的位置,`charAt()` 获取...

    2021-2022计算机二级等级考试试题及答案No.12977.docx

    15. 对象赋值:在 Java 中,用 "u=v" 会导致引用 u 指向 v 指向的对象,可能导致原 u 对象成为垃圾,等待系统回收。其他选项并不会导致对象回收。 16. RAM:随机存取存储器(Random Access Memory)允许对任何位置...

    2021-2022计算机二级等级考试试题及答案No.15636.docx

    1. 变量未赋值时,数值型变量的默认值:在编程语言中,如C、C++、Java等,数值型变量在未被赋值前,其值通常为0,因此正确答案是C。 2. Visual FoxPro 中表的属性:在Visual FoxPro中,数据库表可以定义字段的有效...

    八股文.pdf

    3. **成员变量类型:** 抽象类中的成员变量可以是任何类型的,接口的成员变量只能是`public static final`类型的,并且必须初始化赋值。 #### 二、重载与重写 **重载:** - 发生在同一类中,方法名称相同但参数...

    几个java实例,适合初学者

    此外,掌握变量声明、赋值以及运算符的用法也是基础。 2. **控制流程**: 控制流程语句包括条件语句(if-else、switch)和循环语句(for、while、do-while),它们用于决定程序执行的路径。通过实践,初学者能更好...

    java基础笔记

    - `final`变量一旦被赋值后就不能改变其值,对于基本类型来说,其值将固定不变;对于引用类型来说,该引用指向的对象不能更改。 - `final`方法不能被子类重写。 7. **类型转换与异常:** - 类型转换时需要注意...

    2021-2022计算机二级等级考试试题及答案No.11371.docx

    4. Java集合框架位于`java.util`包中,包括ArrayList、LinkedList、HashMap等常用数据结构。 5. ISP(Internet Service Provider)是指提供互联网接入服务的公司或机构,选项B正确。 6. 在Java中,将线程设置为...

    Java面试 全解下载

    - **实现原理**:通过哈希算法将键映射到哈希表中的特定位置,以达到快速存取的目的。当冲突发生时,使用链表或红黑树等方式解决。 - **应用场景**:适合用于频繁的查找操作,以及不需要保证顺序的场景。

    2021-2022计算机二级等级考试试题及答案No.18987.docx

    它包括ArrayList、LinkedList、HashSet、HashMap等,提供了添加、删除、查找和修改元素的功能,适用于各种数据组织需求。 2. **命令窗口操作**:在Windows操作系统中,可以通过多种方式打开或关闭命令提示符窗口,...

    JAVA面试题集-个人网络收集整理。

    这种方式有助于开发者明确哪些部分可能会出现问题,并且能够针对性地进行错误处理。 - **C++中的异常处理**:尽管C++也支持异常处理,但它通常留给程序员更多的控制权,比如是否使用异常以及何时抛出异常。C++允许...

Global site tag (gtag.js) - Google Analytics