`
scholers
  • 浏览: 620181 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

ArrayList对象引用的问题

 
阅读更多
老问题了,之所以贴出来是给大家看看,希望不要出现类似的错误:
this.item=new ArrayList(); 
   books = new Books(); 
   ResultSet rs = new DBoperate().getResultSet("select * from tblbooks"); 
   int i=0; 
   while (rs.next()) { 
   books.setBm(rs.getString("bm")); 
   books.setMc(rs.getString("mc")); 
   books.setAuthor(rs.getString("author")); 
   books.setPublisher(rs.getString("publisher")); 
   books.setPubdate(rs.getString("pubdate")); 
   books.setIsbn(rs.getString("isbn")); 
   books.setPrice(rs.getString("price")); 
   books.setLxbm(rs.getString("lxbm")); 
   books.setYm(rs.getString("ym")); 
   books.setPicpath(rs.getString("picpath")); 
   books.setContent(rs.getString("content")); 
   this.item.add(books); 
   } 

  
  上面的代码导致ArrayList里面都是同样的值,而且是数据库返回的最后一条记录的值;
  曾经一个朋友遇到这样的问题,那我们来分析一下:
  books在循环外部定义,那么在循环里面每次都同一个books,循环体对其进行赋值,然后将books的引用放入ArrayList里面;每次循环都在不停的改变其引用的值,那么ArrayList里面也会跟着改变其指引的books的值,那么最后停止循环的时候,ArrayList每个books的值都会被改变成最后一个值;
   所以也就不难理解,为啥都是一样的值,并且是最后一个。

或者说这么来解释:
只定义了一个books对象,循环都是在不停的改变其值,并且放入ArrayList里面的对象都是同一个,比如循环了20次,那么也就是加入了20个一模一样的books对象;当books的值最后一次被改变的时候,ArrayList里面由于都是同一个books对象,随之也会全部会改变成最后一次的值。
1
0
分享到:
评论
2 楼 scholers 2009-09-18  
pangbuddy 写道
应该在循环中每次都new一个books就好了。
还有个小建议 item 改叫items, books改叫book,这样应该更合理些吧。




这位朋友说的有道理,确实是这样
1 楼 pangbuddy 2009-09-18  
应该在循环中每次都new一个books就好了。
还有个小建议 item 改叫items, books改叫book,这样应该更合理些吧。

相关推荐

    jni操作arraylist对象

    1. **创建JNI函数**:在C/C++代码中定义一个JNI函数,这个函数的目的是接收ArrayList对象的本地引用,并对其进行操作。例如,你可以定义一个名为`AddIntToArrayList`的函数。 ```c++ JNIEXPORT void JNICALL Java_...

    《C#入门经典》第十章Array和ArrayList的相关问题!!!问题都在注释里!.docx

    5. 获取ArrayList中对象的索引,如果尝试通过`animalArrayList.IndexOf("鸡姐姐")`查找,会返回-1,因为默认的比较是基于对象的引用,而不是基于对象的属性。如果要根据对象的属性查找,你需要自定义比较器或者先...

    ArrayList深度剖析与简单实用

    Remove根据对象引用删除元素,RemoveAt通过索引删除;RemoveRange和InsertRange用于批量删除或插入;Insert在指定位置插入元素,影响后续元素的位置;Clear清空所有元素,Contains检查元素是否存在。 - **...

    ArrayList LinkedList Vector性能测试

    在Java编程语言中,ArrayList、LinkedList和Vector是三种常见的动态数组实现,它们都在java.util包中,用于存储和管理对象的集合。这三个类都实现了List接口,提供了多种操作方法,但它们在内部实现和性能特性上有所...

    C#ArrayList用法

    - `public ArrayList(ICollection collection)`: 使用一个`ICollection`对象构造,并将该集合的元素添加到`ArrayList`中。 - `public ArrayList(int capacity)`: 使用指定的容量初始化内部数组。 ##### 2. 线程同步...

    《C#入门经典》第十章Array和ArrayList的相关问题!!!问题都在注释里!.pdf

    5. **ArrayList 与 List**:`ArrayList` 是非泛型集合,可存储任何类型的对象,但不支持类型安全。`List<T>` 是泛型集合,提供类型安全。在示例中,`ArrayList` 用于动态存储不同类型的动物实例,但它的操作不如 `...

    C#中数组与arraylist

    ArrayList可以存储任意类型的对象,但所有元素必须是引用类型。ArrayList的大小会根据需要自动调整,这提供了更大的灵活性。例如,创建并操作ArrayList: ```csharp ArrayList list = new ArrayList(); list.Add(1)...

    .net(c#)中Array和ArrayList的异同点

    - **ArrayList**:支持多态性,可以存储基类引用指向派生类对象。 ### 示例代码解析 在提供的部分代码示例中,我们看到了ArrayList的一些基本用法: ```csharp ArrayList aList = new ArrayList(); aList.Add("a...

    arraylist的C#基本实现

    3. 不安全类型:ArrayList存储的是object类型的引用,因此在添加、访问和遍历元素时,需要进行类型转换,这可能导致类型安全问题。 在Visual Studio中的使用步骤: 1. 引用:首先确保你的项目引用了System....

    比较Vector、ArrayList和hashtable hashmap

    这意味着如果键不再被任何对象引用,那么即使在 WeakHashMap 中,这个键也会被垃圾收集器回收。这种方式可以防止内存泄漏,但也可能导致数据丢失。 总结: - Vector 和 ArrayList 都实现了 List 接口,其中 Vector ...

    浅析Java 对象引用和对象本身

    2. **集合操作**:在集合(如ArrayList)中,元素都是对象引用。当通过索引修改集合元素时,实际上是更改了该索引处的引用,使其指向新的对象: ```java userList.set(i, new User()); ``` 这将使集合中对应位置...

    C#检查指定对象是否存在于ArrayList集合中的方法

    否则,如果两个对象引用不同但具有相同的值,Contains可能无法正确识别。 此外,虽然ArrayList在.NET框架早期广泛使用,但现在已经被更现代、更安全的泛型集合如List所替代。List提供了与ArrayList相似的功能,但它...

    第二章 ArrayList源码解析1

    `remove(Object o)`或`remove(int index)`可以删除ArrayList中的对象,前者根据对象的引用,后者根据索引位置。 5. **遍历对象**: 可以通过`iterator()`获取迭代器进行遍历,或者使用增强型for循环(foreach)...

    ArrayList类[文].pdf

    - `Remove`:根据对象引用删除ArrayList中的元素。 - `RemoveAt`:根据索引删除ArrayList中的元素。 - `RemoveRange`:删除ArrayList中一段连续的元素。 - `Insert`:在指定位置插入一个元素,后面的元素依次...

    Java中ArrayList和LinkedList区别 时间复杂度 与空间复杂度1

    - LinkedList 使用链表数据结构,每个元素(节点)包含一个对象引用和两个链接到相邻节点的引用。链表结构利于快速插入和删除,但不支持随机访问。 2. 访问效率: - ArrayList 的 get 方法可以直接通过索引来访问...

    去除arraylist容器中的相同的对象元素的方法

    在Java编程中,ArrayList是一个常用的集合类,用于存储一组有序的、可变大小的对象。然而,当ArrayList中包含相同对象时,有时我们可能需要去除重复的元素。这通常涉及到对象的比较,而不仅仅是基于引用的相等性。...

    从原码解析ArrayList

    要快速根据下标清空ArrayList的一部分内容,可以使用`System.arraycopy`方法复制原始数组的一部分到新的数组,然后将原数组引用指向新的数组。这样可以避免遍历和删除元素带来的效率损失。 6. **按逻辑清除元素** ...

    合理运用ArrayList与LinkedList

    这种设计使得ArrayList在随机访问(即通过索引获取元素)时具有较高的效率,因为Java虚拟机可以通过对象引用和下标直接计算出元素的内存地址。然而,当需要在ArrayList中插入或删除元素时,可能会涉及到大量元素的...

    Java ArrayList教程

    并初始化ArrayList对象,例如:ArrayList<E> objectName = new ArrayList();其中E是泛型数据类型,objectName是对象名。 ArrayList提供了很多有用的方法,添加元素到ArrayList可以使用add()方法,例如: ```java ...

    c#重写ArrayList源代码

    在C#编程中,ArrayList是System.Collections命名空间中的一个类,它是.NET框架早期版本中用于存储动态大小对象数组的主要容器。然而,随着.NET Framework的发展,更高效、类型安全的List类应运而生。尽管如此,了解...

Global site tag (gtag.js) - Google Analytics