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

问题描述

我定义了一个Person类,然后要把这个Person类的实例逐个添加到队列中,会出现后面的值把前面的值覆盖等问题。具体如下:Person.javapackage 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.javaimport java.util.concurrent.LinkedBlockingQueue;public class Test {public static void main(String[] args){function();}static void function(){Person person = new Person();BlockingQueue<Person> queue = new LinkedBlockingQueue<Person>();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)}}程序的输出结果是:ChinaUSAUSAUSA后入队的把前面的给覆盖掉了,但要是把输出放到循环里的话则显示正常,即把(3)注释掉,换成(2)输出,则结果为ChinaChinaUSAUSA正常。但要是把Person person = new Person();放到for循环里去new的话(代码中(1)处),则上面两种输出都是正确的。有人能解释下吗?谢谢!

解决方案

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

时间: 2024-10-31 22:47:54

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

关于C#中timer类 在C#里关于定时器类就有3个

定时 ·关于C#中timer类  在C#里关于定时器类就有3个   1.定义在System.Windows.Forms里   2.定义在System.Threading.Timer类里   3.定义在System.Timers.Timer类里  System.Windows.Forms.Timer是应用于WinForm中的,它是通过Windows消息机制实现的,类似于VB或Delphi中的Timer控件,内部使用API  SetTimer实现的.它的主要缺点是计时不精确,而且必须有消息循环,Co

打印队列里的打印任务清除方法

  在使用打印时有时会发生故障,无法打印.我们想清除打印队列里的打印任务,却无法删除,可以采取以下方法: 依次点击"开始"→"运行"→"services.msc"→"打开服务窗口,找到"Print Spooler"服务,点击左侧 "停止此服务" ,停止打印机服务. 依次点击"开始"→"运行"→"spool",在"spool&qu

eclipse-安卓studio里编写监听器类导入OnClickListener问题

问题描述 安卓studio里编写监听器类导入OnClickListener问题 我在我安卓studio1.3.2版本里敲下面这段代码 class ButtonClickListener implements OnClickListener 自动提示implements OnClickListener(android.dialogInterface) 而无法自动导入View.OnClickListener 但是我看许多视频里用eclipse就可以在这两个包中二选一导入.我不知道为什么,也不知道这两

ffmpeg-Qt里的QMediaPlayer类播放视频所用的解码器

问题描述 Qt里的QMediaPlayer类播放视频所用的解码器 如题 有没有参考资料哪?知道Qt的自带的mediaplayer需要安装gstreamer-0.10-ffmpeg,否则就无法播放,所以QmediaPlayer用的是ffmpeg吗? 解决方案 Qt在linux下使用gstreamer,Windows下使用directshow,Android下使用MediaPlayer.总之,Qt没有直接使用解码库,而是对平台相关的播放器框架做了封装,提供了平台无关的API. 解决方案二: gstr

winform里在其他类里不能改变picturebox的图片

问题描述 winform里在其他类里不能改变picturebox的图片 是这样的我在form1里面写了个静态的list,然后我在新建的一个类里面通过索引想改变他的图片然后失败了,求解为什么

C# 打印时 如何获取发送到打印队列里的jobid

问题描述 C#打印时如何获取打印队列里指定的jobid我已经能获取到打印队列里所有的jobid,代码如下:publicstaticStringCollectionGetPrintJobsCollection(stringprinterName){StringCollectionprintJobCollection=newStringCollection();stringsearchQuery="SELECT*FROMWin32_PrintJob";/*searchQuerycanals

内部类-Java编程中A类如何调用B类中M方法里的C类的实例?

问题描述 Java编程中A类如何调用B类中M方法里的C类的实例? import java.awt.*; import java.awt.event.*; public class TestListener{ public static void main(String[] args){ Counter c1 = new Counter("Hello"); c1.CreatButton(); c1.add(c1.button); ----------------------------(

android-Android怎么在java文件里设置第三方类包的属性值

问题描述 Android怎么在java文件里设置第三方类包的属性值 解决方案 查看这个控件的源码看看是否有相关的设置方法 解决方案二: 这个问题自己也不太了解,但可以推荐几篇有关这个方面的博文.http://blog.csdn.net/bruce_ke/article/details/6911237http://blog.csdn.net/tanqiantot/article/details/8588771 解决方案三: 在需要引用的xml文件中的根布局里面加上xmlns:app = "http

c++ 源代码-读一段c++源代码,里面的array类里面的输出函数,看不懂什么意思。

问题描述 读一段c++源代码,里面的array类里面的输出函数,看不懂什么意思. template //看不懂void array::print(void){ if(dim_3==1) { int ijk; bool threeD = (dim_2==1?false:true); for (k = 0; k< dim_2; k++) { if (threeD) cout<<endl<<""ans(::<<k+1<<"&qu