日期:2014-05-20  浏览次数:20789 次

在线急求集合问题

本意:在map中存入对象RandomInt,对象只有一个属性int[].
出现错误:打印map时,values
全为最后一条记录的values.
Java code

package com.test;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

public class Test {
    public static void main(String[] args) {
        Map<Integer, RandomInt> map = new HashMap<Integer, RandomInt>();
        Map<Integer, Integer> map2 = new HashMap<Integer, Integer>();
        List<RandomInt> list=new ArrayList<RandomInt>();
        int id = 0;
        int[] a = new int[2];
        for (int m = 1; m <4; m++) {
            a[0] = m;
            for (int n = m + 2; n <6; n++) {
                a[1] = n;
                RandomInt cc=new RandomInt(a);
                map.put(id++, cc);
                map2.put(id++, a[1]+a[0]);
                list.add(cc);    
            }
        }
        System.out.println(map);//打印结果
        System.out.println(map2);//结果无问题
        System.out.println(list);//
        System.out.println("***********");
    }
}

class RandomInt {
    private int[] in;

    public RandomInt() {

    }

    public RandomInt(int[] in) {
        this.in = in;
    }

    public int[] getIn() {
        return in;
    }

    public void setIn(int[] in) {
        this.in = in;
    }

    @Override
    public String toString() {
        return "RandomInt [in=" + Arrays.toString(in) + "]";
    }

}





------解决方案--------------------
for (int m = 1; m <4; m++) {
List<RandomInt> list=new ArrayList<RandomInt>();
a[0] = m;
for (int n = m + 2; n <6; n++) {
a[1] = n;
RandomInt cc=new RandomInt(a);
map.put(id++, cc);
map2.put(id++, a[1]+a[0]);
list.add(cc);
}
}
list 要new 新的。 对象引用问题。
------解决方案--------------------
HashMap 里面的value 是一个对象的引用,对HashMap里的对象的任何一次改动都是对同一个对象的改动,虽然你每次都new 了一个新的RandomInt的对象,放到HashMap里,但是你的RandomInt这个类里面有一个int[]对象的引用 in,这个引用一直没变,所以无论你怎么改变实际上都对同一个int[]对象的改动,所以最后的结果都相同,给你看一个例子就会明白
Java code

package a;

import java.util.*;

public class HashMapAdd {
    public static void main(String[] args) {
        HashMap<String, Object> hm = new HashMap<String, Object>();
        StringBuffer sb = new StringBuffer();
        sb.append("abc,");
        hm.put("1", sb);
        sb.append("def,");
        hm.put("2", sb);
        sb.append("mno,");
        hm.put("3", sb);
        sb.append("xyz.");
        hm.put("4", sb);
        int numObj = 0;
        Set<String> key = hm.keySet();
        for (Iterator it = key.iterator(); it.hasNext();) {
            String s = (String) it.next();
            System.out.print("get StringBufffer " + (++numObj)
                    + " from Hashtable: ");
            System.out.println(hm.get(s));
        }
    }
}