问题描述
我定义了一个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次,所以会覆盖。放在循环里面,每次循环时创建一个人并给附一个值,就没有覆盖现象了。