本文共 1789 字,大约阅读时间需要 5 分钟。
List接口是Java中的一个常用集合接口,它定义了一系列操作方法,使得程序能够对集合进行 CRUD(创建、读取、更新、删除)等操作。学习List接口的实现类,比如ArrayList,能够帮助我们更好地理解集合的优势。
在实际项目开发中,我们经常需要从数据库中读取数据并将其存储到List中。然而,最近在操作数据库时遇到了一个棘手的问题:从表中获取的记录在List中看起来都一样,且全部显示为最后一条记录。此次经历让我深刻认识到一个容易被忽视的问题,也让我对List对象的创建方式有了更深入的理解。
数据库表的结构如下:
CategoryID | CategoryName |
---|---|
1 | programming |
2 | design |
3 | analysis |
4 | testing |
我编写了如下的代码来获取所有分类:
public ListGetAllCategory() { try { String sql = "select * from tbCategory"; ResultSet rs = DbCRUD.Select(sql); List list = new ArrayList<>(); Category c = new Category(); while (rs.next()) { // c = new Category(); 这里缺少了这一行代码 // 后续操作会将同一对象多次添加到List中 c.setCategoryId(rs.getInt(1)); c.setCategoryName(rs.getString(2)); list.add(c); } // ... 其他代码 ... } catch (...) { // 处理异常逻辑 }}
通过调试,我发现问题出在GetAllCategory
方法中。当rs.next()
方法获取到数据库中的每一条记录时,程序执行c.setCategoryId()
和c.setCategoryName()
操作,然后将c
对象添加到List
中。然而,我没有在每次循环开始时创建新的Category
对象,而是重复使用了相同的c
对象。如果忘记重新创建c
,所有List中的元素都将指向同一个Category
对象,结果导致所有记录看起来都相同,且仅显示最后一条记录。
为了解决这个问题,我在循环开始处添加了以下代码:
public ListGetAllCategory() { try { String sql = "select * from tbCategory"; ResultSet rs = DbCRUD.Select(sql); List list = new ArrayList<>(); Category c = new Category(); while (rs.next()) { c = new Category(); c.setCategoryId(rs.getInt(1)); c.setCategoryName(rs.getString(2)); list.add(c); } // ... 其他代码 ... } catch (...) { // 处理异常逻辑 }}
这样,每次循环都会创建一个新对象c
,确保List中存储的每个Category
对象都是独一无二的,避免了引用同一对象多次的情况。
在进行数据库操作时,尤其是涉及对象复制和List存储时,注意对象的创建和引用非常关键。重复使用同一对象会导致意想不到的结果,影响程序的正确性和用户体验。这次经历让我更加注意对象的生命周期管理,以避免类似的错误再次发生。
转载地址:http://dleyk.baihongyu.com/