Java 为什么队列中的元素相同

Java 为什么队列中的元素相同,java,queue,Java,Queue,在项目中我负责邮件发送功能,但在使用队列时出现问题 private void createReportEmail() { try { List<Map> list = emailMapper.getToAddress(); System.out.println(list); MailSenderInfo mailSenderInfo = new MailSenderInfo(); mailSenderIn

在项目中我负责邮件发送功能,但在使用队列时出现问题

private void createReportEmail()
{
    try
    {
        List<Map> list = emailMapper.getToAddress();
        System.out.println(list);
        MailSenderInfo mailSenderInfo = new MailSenderInfo();
        mailSenderInfo = CreateEmailService.sendReportMail(emailMapper);
        InternetAddress address = new InternetAddress();
        for (int i = 0; i < list.size(); i++)
        {
            if (list.get(i).get("address").toString() != null && list.get(i).get("address").toString() != "")
                address = new InternetAddress(list.get(i).get("address").toString());
            MailSenderInfo mailSenderInfo2 = new MailSenderInfo();
            mailSenderInfo2 = mailSenderInfo;
            mailSenderInfo2.setAddress(address);
            queue.offer(mailSenderInfo2);
        }
        for(int i =0;i<list.size();++i)
        {
            System.out.println(queue.poll().getAddress());
        }

    } catch (Exception e)
    {
        e.printStackTrace();
    }
}
private void createReportEmail()
{
尝试
{
List List=emailMapper.getToAddress();
系统输出打印项次(列表);
MailSenderInfo MailSenderInfo=新的MailSenderInfo();
mailSenderInfo=CreateEmailService.sendReportMail(emailMapper);
InternetAddress地址=新的InternetAddress();
对于(int i=0;i对于(int i=0;i您在循环的每个迭代中创建一个新的
MailSenderInfo
实例,这是正确的操作,但随后您将其替换为一个现有的
MailSenderInfo
实例(在-
MailSenderInfo MailSenderInfo=new MailSenderInfo();
中循环之前创建),因此您总是将相同的
MailSenderInfo
实例添加到队列中:

    for (int i = 0; i < list.size(); i++) { 
        ...
        MailSenderInfo mailSenderInfo2 = new MailSenderInfo();
        mailSenderInfo2 = mailSenderInfo; // remove this
        mailSenderInfo2.setAddress(address);
        queue.offer(mailSenderInfo2);
    }
for(inti=0;i
如果使用
StringUtils

if (StringUtils.isNotBlank(list.get(i).get("address").toString()))
      address = new InternetAddress(list.get(i).get("address").toString());
      MailSenderInfo mailSenderInfo2 = new MailSenderInfo();
      mailSenderInfo2.setAddress(address);
      queue.offer(mailSenderInfo2);

并删除行
mailSenderInfo2=mailSenderInfo;
。因为
mailSenderInfo
包含较旧的对象引用。

是的,但我更改了它的“地址”,当我打印“地址”时,我发现它们都是相同的。@Vayne这没关系。如果你多次将同一对象添加到队列中,调用
mailSenderInfo2.setAddress(address)
更改队列中所有元素的地址。是的,也许我知道原因。队列存储在指针中,我更改的是唯一的对象,所有元素(指针)都指向同一个对象。为什么不针对
(list.get(i).get(“address”).toString()使用
StringUtils.isBlank()
类!=null&&list.get(i.get(“地址”).toString()!=“”)
。它将在一个方法中检查这两个条件
isBlank()
。谢谢:)好主意。谢谢!!!