如下是csdn网友的一段代码package exc;import java.util.*;
public class file { 
    public static void main(String args[]){ 
        Map map = new HashMap();
        User u1=new User(); 
            u1.setAddress("双和园");u1.setMoney(20); 
            User u2=new User(); 
            u2.setAddress("双和园");u2.setMoney(30); 
            User u3=new User(); 
            u3.setAddress("双和园");u3.setMoney(50);
            User u4=new User(); 
            u4.setAddress("南方花园");u4.setMoney(40); 
            User u5=new User(); 
            u5.setAddress("南方花园");u5.setMoney(20); 
            User u6=new User(); 
            u6.setAddress("百度空间");u6.setMoney(90);
      List <User> userlist=new  ArrayList<User>();
      userlist.add(u1);
      userlist.add(u4);
      userlist.add(u3);
      userlist.add(u2);
      userlist.add(u5);
         userlist.add(u6);
         for(User user:userlist) {
             Double freq =(Double)map.get(user.getAddress());//user.getAddress()是引用吗?还是user.getAddress()的值由于是string引用的原因?
             map.put(user.getAddress(),(freq==null?user.getMoney():freq+user.getMoney()));//freq+user.getMoney()是引用吗?不是吧?
         }
     System.out.println(map);
    } 
}class User { 
    private String name; 
    private double money; 
    private String address;     public String getName() { 
        return name; 
    } 
    
    public void setName(String name) { 
        this.name = name; 
    } 
    
    public double getMoney() { 
        return money; 
    } 
    
    public void setMoney(double money) { 
        this.money = money; 
    } 
    
    public String getAddress() { 
        return address; 
    } 
    
    public void setAddress(String address) { 
        this.address = address; 
    } 
    
    public String toString() {
        return this.getAddress()+"------"+this.getMoney(); 
    }
} 上面map函数中按道理传入的是引用吧,可是上面代码中好像不是吧?
另外:
在java编程思想(第三版)中关于统计0-20随机数的分布情况的程序中,
Integer r=new Integer(rand.nextInt(20));
if(hm.containKey(r))//上面的r不是通过new产生的引用吗,它应该不可能会有相同的key才对啊!这个if应该一直是false
  ((Counter)hm.get(r)).i++;
else
 hm.put(r,new Counter());

解决方案 »

  1.   

    hashmap里的get和contains等等方法都不是用对象相同来取得的。
    建议看看书。
      

  2.   

    hashmap里的get和contains等等方法都不是用对象相同来取得的。
    建议看看书。
      

  3.   

    一般来说他的key会是String类型,在取对象的时候就比较key来取对象的
      

  4.   

    不能这样说一般是string类型吧
      

  5.   

    我说一般,因为String实现了equals方法,而在get对象的时候要比较键,没有重写equals的比较的是地址,一般都不等
      

  6.   

     for(User user:userlist) {
                 Double freq =(Double)map.get(user.getAddress());//user.getAddress()是引用吗?还是user.getAddress()的值由于是string引用的原因?
                 map.put(user.getAddress(),(freq==null?user.getMoney():freq+user.getMoney()));//freq+user.getMoney()是引用吗?不是吧?
             }
    莫非传入map.get(key)和map.put(k,v)中的参数都是经过jdk1.5装包成String类型和Double类型?jdk1.5不是实现了基本类型的装包和拆包吗!
      

  7.   

    总之是根据key来比较的,如果key是String,两个比较的东西的key都是“abc”,那么就认为是相同
      

  8.   

    我现在最想知道的是map.get(user.getAddress())中的user.getAddress())(值是一个字符串)是不是一个引用?
    map.put(user.getAddress(),(freq==null?user.getMoney():freq+user.getMoney()));freq+user.getMoney()是引用吗?不是吧?难道是jdk自动装包了?
      

  9.   

    算啊,我还以为user.getAddress()本身是引用哦!
    由于键值是String类型,所以不需要重写equals方法和hashcode方法了。?
      

  10.   

    不过这里确实经过jdk装包了,我把myeclipse的jdk换成1.4后freq+user.getMoney()发现会出现语法错误
    The operator + is undefined for the argument type(s) Double, double
      

  11.   

    当然是引用啊,但是map.get()方法实际上也是接受的key的类型(这里就是String类型)的引用啊
    比如你写个方法
    a(Object obj){}
    然后你调用这个方法:
    Object o=new Object();
    a(o);
    那传递过去的就是o的引用啊,在执行a方法的过程中,这个引用被赋值给a方法中的局部变量obj。