在线急求集合问题

tong_data 2012-05-04 04:52:51

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

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) + "]";
}

}


...全文
116 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
ylp198296 2012-05-05
  • 打赏
  • 举报
回复
HashMap 里面的value 是一个对象的引用,对HashMap里的对象的任何一次改动都是对同一个对象的改动,虽然你每次都new 了一个新的RandomInt的对象,放到HashMap里,但是你的RandomInt这个类里面有一个int[]对象的引用 in,这个引用一直没变,所以无论你怎么改变实际上都对同一个int[]对象的改动,所以最后的结果都相同,给你看一个例子就会明白

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));
}
}
}

上边这段代码的正确的输出结果:

get StringBufffer 1 from Hashtable: abc,def,mno,xyz.
get StringBufffer 2 from Hashtable: abc,def,mno,xyz.
get StringBufffer 3 from Hashtable: abc,def,mno,xyz.
get StringBufffer 4 from Hashtable: abc,def,mno,xyz.

而并不是这样的结果:

get StringBufffer 1 from Hashtable: abc,
get StringBufffer 2 from Hashtable: abc,def,
get StringBufffer 3 from Hashtable: abc,def,mno,
get StringBufffer 4 from Hashtable: abc,def,mno,xyz.

tong_data 2012-05-05
  • 打赏
  • 举报
回复
7楼谢谢了 我昨天晚上想明白了 跟你的一样
1楼,你的解答不是很好
sdojqy1122 2012-05-04
  • 打赏
  • 举报
回复
1楼有问题,3楼 是你要的吗?不是请说明需求,谢谢。。。
tong_data 2012-05-04
  • 打赏
  • 举报
回复
问题很急 ,求大神解答.....
tong_data 2012-05-04
  • 打赏
  • 举报
回复
list要new新的,那map可以吗?已经是新new的;
如果是因为没有new新的对象 ,那集合中的记录怎么还是在增加?list map map2中的记录不是一个.
sdojqy1122 2012-05-04
  • 打赏
  • 举报
回复

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

public class Cat {
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 = null;
list = new ArrayList<RandomInt>();
int id = 0;
for (int m = 1; m <4; m++) {

for (int n = m + 2; n <6; n++){
int[] a = new int[2];//这里对象引用问题。
a[0] = m; a[1] = n;
RandomInt cc=new RandomInt(a);
map.put(id++, cc);
map2.put(id, a[0]+a[1]);
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) + "]";
}

}
sdojqy1122 2012-05-04
  • 打赏
  • 举报
回复
不好意思在看看,好像还有其他问题。
sdojqy1122 2012-05-04
  • 打赏
  • 举报
回复
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 新的。 对象引用问题。

62,612

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧