public static void main(String[] args) {
    HashMap hash = new HashMap();
    hash.put("a","1");
    test1.test11(hash);
  }  public void test11(HashMap h){
  h.put("a","2");
  System.out.println(h);
  }
大家都知道java中对引用是直接可以改变其值,如上面的例子 输出得是 {a = 2 }
那么请问如何可以做到输出的结果依然是{a = 1}呢?(除了h.clone方法)
就是说在方法 test11中对传入的参数进行操作,但是不改变它的值,有最好的办法么?
希望和各位成为朋友我的msn:[email protected]

解决方案 »

  1.   

    有两种解决方法
    1.是被楼主禁用的clone
    2.使HashMap变成一个不可变对象
      

  2.   

    好象只能用clone,要不在调用之前先序列化到一文件,然后再读回来?看楼下怎么说
      

  3.   

    而不可变对象的要求是,隐藏其可以改变对象值的方法,这个和楼主的要求不符,个人之见,还是用clone
      

  4.   

    不知道楼主是不是说值的使用范围的问题:a在test1中与在test1外的值不同?
      

  5.   

    http://www.javaeye.com/viewtopic.php?t=4189
    看看javaeye的这个精华贴吧!
    这边的很多人可能都没有搞清楚java里面的这个基础问题!
      

  6.   

    我问过类似的问题。
    在java基础的精华区。
    《如何完全clone 一个HashMap?》
    你可以去看看,基本上没有结果。只能用序列化。
      

  7.   

    楼上的,第二个方法做不到吧
    就算加了final也不行的
      

  8.   

    直接在方法里面new一个新的Map,构造函数参数为方法的参数
      

  9.   

    import java.util.*;class a{
    public static void main(String[] args) {
        HashMap hash = new HashMap();
        hash.put("a","1");
        test11(hash);
        
        System.out.println(hash);
      }  public static void test11(HashMap hash){
         HashMap h = new HashMap();
      h.put("a","2");
      
      hash = h;
      
      System.out.println(hash);
      }
    }->这样好像不符合楼主的要求 回复人: gogon() ( ) 信誉:100  2005-10-18 12:54:00  得分: 0  
     
     
       楼上的,第二个方法做不到吧
    就算加了final也不行的
      
    ->第二个方法不是单纯加final就可以了
      

  10.   

    clone 方法只能是一层map,对于多层的map,例如: 如果是一个map中含有另一个map是不好用的
    如果是包含另一个map那么需要对里面的它也进行clone,这样会很麻烦的
    一楼请问如果让它变成不可变对象?
    谢谢
    同时也谢谢大家的帮助
      

  11.   

    java传递是引用的拷贝,既不是引用本身,更不是对象
      

  12.   

    public static void main(String[] args) {
        HashMap hash = new HashMap();
        hash.put("a","1");
        test1.test11(hash);
      }  public void test11(HashMap h){
      h.put("a","2");
      System.out.println(h);
      }
    如果test11()方法中不做任何改动,只在main方法中做改动,就是说test11()方法只是一个黑盒子
    在里面有固定的操作,外界对他所知的就是参数类型,有些方法调用test11()需要改变传入参数得值,而有些则不需要改变
    该怎么去做?
      

  13.   

    public static void main(String[] args) {
        HashMap hash = new HashMap();
        hash.put("a","1");
        HashMap hh = new HashMap();
        test1.test11(hh);
      }  public void test11(HashMap h){
      h.put("a","2");
      System.out.println(h);
      }
      

  14.   

    楼主的这个列子不恰当,因为hashmap的使用关键点在key的唯一性上,不知楼主是要问对象的复制还是要问hashmap的知识,final关键字对基本类型变量的意思是'不能改变其值'而对对象的引用变量的意思是'当引用变量指向一个对象实例后便不能在指向其它的对象实例,不过该变量所指的对象仍然可以修改'
      

  15.   


    如果你想在语言层面解决这个问题。那么很遗憾的告诉你,不行,
    core java或者是 thinking in java里面明确的指出java并没有
    cpp里面的 const 关键字。
    final指能够防止它所保护变量(或者变量的引用)不被被修改,
    但不能够防止引用的成员数据的或者成员函数对成员数据的改变。
    而cpp的函数可以定义 int fun() const;能够保证
    成员函数不能修改数据成员。实际上cpp是通过 const修饰this指针的指向来实现。
    而不仅仅是限制this指针。
    在cpp中定义一个 const对象时编译器会将 const 修饰字自动的扩展到
    所定义的对象的 成员数据, 成员函数 身上。
    如果const对象的类的某些成员函数改变了某些成员数据,那么cpp的编译器将会检查出来。
    要求你提供一个 同名的 int fun() const;形式的版本的 成员函数。
    你需要的功能是这样子被cpp简单又和谐地解决的。
    java的final 对引用的修饰 的功能只有 const一半。
    只能修饰 变量引用的本身,不能修饰变量引用的指向。而且也不能修饰到成员函数的本身(可以那么用,但是不是这里期望的意思)。
    因此,在语言层面(在编译时候)不能够解决你要的那种功能。但是如果要达到你的目的,也是有办法的。但是不能够与原有的代码兼用。
    第一种:
    对类HashMap进行封装,
    在每次put进去前检查。是否已经有值,如果有值,则抛异常阿忽略并返回假值阿等操作。
    第二种:运用反射机制。实行传说中的代理模式。
    把对hashMap的使用全都扔给代理。
    或许还有别的方式的,
    但是无论是那种方式,都不能够改变旧的代码实现。
      

  16.   

    不过我觉得即使c++里面的const如 sjjf(水晶剑锋)  所说的那样强大
    又假设c++实现了类似java里面的HashMap
    也同样不可能通过某些“语言形式”去满足楼主的要求。使用一个不能增删改的只读HashMap没有意义(不如直接定义常量)而执行了下面两句
      h.put("a","2");
      System.out.println(h);
    却要输出a=1这纯粹是一种软件需求,如果直接这样写,就是你的程序流程
    有问题,为了实现这样的需求,比如说,可以这样写:
      if(!h.containsKey("a"))h.put("a","2");
      System.out.println...
      

  17.   

    恩,搂主的需求是矛盾的,  public void test11(HashMap h){
      h.put("a","2");
      System.out.println(h);
    要求输出 "1"举这样的例子应当是为了说明他的目的吧。
      

  18.   

    除了Clone、序列化以外,我能想到的唯一方法public static void main(String[] args) {
        HashMap hash = new MyHashMap();
        hash.put("a","1");
        test1.test11(hash);
      }  public void test11(HashMap h){
      h.put("a","2");
      System.out.println(h);
      }class MyHashMap extends HashMap {
      public Object put(Object key, Object value) {
        if (containsKey(key)) {
          return get(key);
        }
        
        return super.put(key, value);
      }
    }又,楼主的需求,不想是java的基础问题,反倒是像量子力学的基础问题