Java ArrayList的奇怪行为

Java ArrayList的奇怪行为,java,jsp,jstl,javabeans,Java,Jsp,Jstl,Javabeans,我正在使用JSP、JSTL、servlet和JavaBeans编写一个网站 在我的代码的某一点上,我试图使用对象的ArrayList,但奇怪的事情发生了:当我添加第一个对象时,它很好,当我添加第二个对象时,它将其添加到第二个位置,但是索引(0)处的对象与索引(1)处的对象获得相同的值 也许这是个问题 ArrayList<Article> articleList = new ArrayList<Article>(); Article newArticle = new Art

我正在使用JSP、JSTL、servlet和JavaBeans编写一个网站

在我的代码的某一点上,我试图使用对象的ArrayList,但奇怪的事情发生了:当我添加第一个对象时,它很好,当我添加第二个对象时,它将其添加到第二个位置,但是索引(0)处的对象与索引(1)处的对象获得相同的值

也许这是个问题

ArrayList<Article> articleList = new ArrayList<Article>();
Article newArticle = new Article();

您正在两次呼叫newArticle.setArticleAuthor…我知道这不是列表问题的一部分,但这是一个观察。

我将尝试这种方式,看看它有什么作用

int x = 0;
while (rs.next()) {
    articleList.add(new Article());
    articleList.get(x).setArticleName(rs.getString("article_name"));
    articleList.get(x).setArticleBody(rs.getString("article_body"));
    articleList.get(x).setArticleAuthor(rs.getString("article_author"));
    articleList.get(x).setArticleDate(rs.getString("article_date"));
    articleList.get(x).setArticleId(rs.getString("article_id"));
    articleList.get(x).setArticleComments(this.getCommentsNum(articleId));
    x++;
}

代码看起来不错,如何显示使您认为两个索引中的值相同的列表?可能您的问题在于该代码。

您是否在阅读文章时同时向数据库添加文章?我认为,根据您的存储引擎,您可能会在进行更新时出现读取问题。

应该根据其他注释清理代码,但在功能上,它应该可以工作

以下是我认为正在发生的事情

您的代码中有以下两行:

newArticle.setArticleAuthor(rs.getString("article_name"));
newArticle.setArticleAuthor(rs.getString("article_author"));
没有相应的呼叫:

newArticle.setArticleName(rs.getString("article_name"));
这意味着您的对象没有指定文章名(即使指定了作者)。我敢打赌,在显示以某种方式合并同名文章的列表之前,您正在进行某种处理

作为调试的一般方法,我建议您模拟您的代码,以便在调试器中运行它,并查看实际发生的情况(目前,您的系统有太多移动部件,您很难深入了解实际问题)


在当前情况下,这非常简单,只需在web容器外部运行one方法,并使用调试器查看返回的列表中的对象。您会发现列表中的对象实际上是独立的对象-只是具有相同的articleName属性。

这是有效的!!!但我不明白为什么。如果你能解释一下原因,我会非常感激。当你这样做的时候,你每次都在处理一个不同的物品对象,而你这样做的时候,你指的是同一个对象,所以当你第二次更改它的时候,你也在更改第一个。呃,不。这种方式应该与第一种方式相同,除了在每个setXXX方法上从列表中检索文章的额外开销。我不知道,但当我发现问题时,我开始调试,结果表明,当我第一次将文章对象放入列表时,它运行良好,但一旦我开始为下一次添加到列表中阅读新的文章对象,它将更改列表中已经存在的对象的属性。很抱歉,这不是答案-Java按值传递,因此当newArticle传递到列表的add方法时,传递的是指向article的引用值(指针),而不是引用本身。发生所述行为的唯一方式是在结果集循环之外分配newArticle。您首先解析articleId然后立即将其转换回字符串有什么特殊原因吗?是复制并粘贴了getArticles()方法,还是实际代码略有不同?因为你的代码和士兵的代码应该没有功能上的区别。你每次都在创建一个新的Article对象,就像他一样。实际上我对此也很好奇,因为回顾过去,我不知道为什么我的代码能在你的代码不能工作的地方工作。mmyers,articleId在mysql数据库中是一个整数,但在Article对象中是字符串。当我写我的代码时,它看起来是正确的,然而,士兵。莫思的代码工作,而我的代码不工作。arraylist返回到另一个javabean,并从那里返回到jsp页面,在那里我用jstl foreach标记显示它。上面的代码从数据库中读取一个字符串(JDBC驱动程序将整数转换为字符串),然后将字符串转换为int,再将int转换回字符串。只需使用:newArticle.setArticleId(rs.getString(“article_id”);我调试了它,亲眼目睹了它在运行时的变化。我正在使用mysql。不,我在阅读时没有更新。我只是阅读了它,并显示了setArticleName,我几乎在发布代码后立即修复了它。该应用程序是一个博客网站,我只是试图从数据库中读取数据,然后在主页上用jstl foreach显示数据。如果在调试器中执行一个停止点,列表中的记录会是什么样子?moth的解决方案不应该与您的有任何不同(除了效率较低和代码有点不恰当)。真正理解你正在经历的问题可能非常重要。
newArticle.setArticleAuthor(rs.getString("article_name"));
newArticle.setArticleAuthor(rs.getString("article_author"));
newArticle.setArticleName(rs.getString("article_name"));