justforme123 2010-09-10 14:26
浏览 189
已采纳

往队列里添加自定义的类时值会被覆盖等问题

我定义了一个Person类,然后要把这个Person类的实例逐个添加到队列中,会出现后面的值把前面的值覆盖等问题。具体如下:
Person.java
package com.test;

public class Person {
private String country;
private String city;

public String getCountry() {
    return country;
}
public void setCountry(String country) {
    this.country = country;
}
public String getCity() {
    return city;
}
public void setCity(String city) {
    this.city = city;
}

}

Test.java

import java.util.concurrent.LinkedBlockingQueue;

public class Test {
public static void main(String[] args){
function();
}
static void function(){
Person person = new Person();
BlockingQueue queue = new LinkedBlockingQueue();
String[] countries = {"China","USA"};
String[] cities = {"Beijing","Washington"};

for(int i = 0 ; i < 2 ; i ++){

// Person person = new Person(); //(1)
person.setCountry(countries[i]);
person.setCity(cities[i]);
queue.add(person);
System.out.println(person.getCountry());
// System.out.println(queue.poll().getCountry()); //(2)
}
System.out.println(queue.poll().getCountry()); //(3)
System.out.println(queue.poll().getCountry()); //(3)
}
}
程序的输出结果是:
China
USA
USA
USA
后入队的把前面的给覆盖掉了,但要是把输出放到循环里的话则显示正常,即把(3)注释掉,换成(2)输出,则结果为
China
China
USA
USA
正常。
但要是把Person person = new Person();放到for循环里去new的话(代码中(1)处),则上面两种输出都是正确的。
有人能解释下吗?谢谢!

  • 写回答

1条回答 默认 最新

  • iteye_14351 2010-09-10 15:37
    关注

    new的作用就是创建一个人。如果在循环外面,只new一次,但是给这个人赋值2次,所以会覆盖。放在循环里面,每次循环时创建一个人并给附一个值,就没有覆盖现象了。

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

悬赏问题

  • ¥15 安卓adb backup备份应用数据失败
  • ¥15 eclipse运行项目时遇到的问题
  • ¥15 关于#c##的问题:最近需要用CAT工具Trados进行一些开发
  • ¥15 南大pa1 小游戏没有界面,并且报了如下错误,尝试过换显卡驱动,但是好像不行
  • ¥15 没有证书,nginx怎么反向代理到只能接受https的公网网站
  • ¥50 成都蓉城足球俱乐部小程序抢票
  • ¥15 yolov7训练自己的数据集
  • ¥15 esp8266与51单片机连接问题(标签-单片机|关键词-串口)(相关搜索:51单片机|单片机|测试代码)
  • ¥15 电力市场出清matlab yalmip kkt 双层优化问题
  • ¥30 ros小车路径规划实现不了,如何解决?(操作系统-ubuntu)