ArrayList的值出现覆盖问题

public class User {
    private int id;
    private String name;
    public User(){

    }
    public User(int id, String name) {
        super();
        this.id = id;
        this.name = name;
    }
    public int getId() {
        return id;
    }
    public void setId(int id) {
        this.id = id;
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }

}
public class User1 {
    private int id;
    private String name;
    public User(){

    }
    public User(int id, String name) {
        super();
        this.id = id;
        this.name = name;
    }
    public int getId() {
        return id;
    }
    public void setId(int id) {
        this.id = id;
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }

}
public class Demo01 {
    public static void main(String[] args) {

        List<User>user_list = new ArrayList<User>();
        user_list.add(new User(1,"a"));
        user_list.add(new User(2,"b"));
        user_list.add(new User(3,"c"));

        List<User1>user1_list = new ArrayList<User1>();
        User1 user1 = new User1();
        for (User user : user_list) {
            user1.setId(user.getId());
            user1.setName(user.getName());
            user1_list.add(user1);
        }

        for (User1 u : user1_list) {
            System.out.print(u.getName());
        }

    }
}

输出 : c c c

以上代码想把user_list集合的值保存到user1_list集合中,但是发现输出的值都是 c,原因是在for循环外面创建user1对象,所以三次遍历都是操作一个实例对象。至于user1_list中保存的的为什么都是c,这个问题我也纠结了好久,是一开始添加的就是c,还是被覆盖成c,debug一下:

当foreach第一次遍历时,user1_list集合的长度为1,保存了一个name为a的对象。

==============================================================

当foreach第二次遍历时,user1_list集合的长度为2,保存了两个name为b的对象。

=============================================================

当foreach第三次遍历时,user1_list集合的长度为3,保存了三个name为c的对象。

可以看出每次遍历,ArrayList都会覆盖之前保存的值,因为只创建了一个对象实例,不可能保存三个不同对象,只能选择覆盖之前保存的对象

时间: 2024-12-12 12:48:46

ArrayList的值出现覆盖问题的相关文章

ArrayList添加新元素的覆盖问题

首先,看一个代码段: 1. ArrayList<ArrayList<String>> list = new ArrayList<ArrayList<String>>();2. ArrayList<String> str = new ArrayList<String>();3 . for(int i = 0;i<5;i++){4. str.add(i+"");5. list.add(str);6. System

解决 java循环中使用 Map时 在put值时value值被覆盖的问题

其实很简单,只需要把容器换成list 然后在循环中 每次循环末尾 或者直接在循环中实例化hashmap,这样就不会造成map覆盖了. @RequestMapping("controller/json/AssetsController/getAssetsInfosysAndType") @ResponseBody public Msg getAssetsInfosysAndType() { List list = new ArrayList(); List<AssetsInfosy

Java源码之ArrayList

本文源码均来自Java 8 总体介绍 Collection接口是集合类的根接口,Java中没有提供这个接口的直接的实现类.Set和List两个类继承于它.Set中不能包含重复的元素,也没有顺序来存放.而List是一个有序的集合,可以包含重复的元素. 而Map又是另一个接口,它和Collection接口没有关系.Map包含了key-value键值对,同一个Map里key是不能重复的,而不同key的value是可以相同的. 在这里借用一张别人总结的对比图进行总结 集合类对比 (上图来源:http:/

JAVA中只有值传递

今天,我在一本面试书上看到了关于java的一个参数传递的问题: 写道 java中对象作为参数传递给一个方法,到底是值传递,还是引用传递? 我毫无疑问的回答:"引用传递!",并且还觉得自己对java的这一特性很是熟悉! 结果发现,我错了! 答案是: 值传递!Java中只有按值传递,没有按引用传递! 回家后我就迫不及待地查询了这个问题,觉得自己对java这么基础的问题都搞错实在太丢人! 综合网上的描述,我大概了解了是怎么回事,现在整理如下,如有不对之处望大神提出! 先来看一个作为程序员都熟

HLG1407Leyni的游戏【最小点权覆盖集】

大意: 给你一个n行m列的矩阵 1 2 1 1 每次操作可使一整行或一整列的一个数减少1(如果是0则不变) 问最少多少次操作会使所有的数变为零 分析: 该题很像poj消灭外星人的那道题 思路也差不很多 将x轴当左集合,y轴当右集合,边权值为所在点的数字 那么一条边就代表了矩阵中的一个点 只要找出最小的权值去覆盖所有的边就能把所有的数字变为零 也就是传说中的最小点权覆盖集 最小点权覆盖集 = 最大权匹配 KM跑一遍就可以了 但是需要注意的是如果两边点的个数不相等 那么我们用虚拟点代替就可以了 代码

【转】Java 集合系列04之 fail-fast总结(通过ArrayList来说明fail-fast的原理、解决办法)

概要 前面,我们已经学习了ArrayList.接下来,我们以ArrayList为例,对Iterator的fail-fast机制进行了解.内容包括::1 fail-fast简介2 fail-fast示例3 fail-fast解决办法4 fail-fast原理5 解决fail-fast的原理 转载请注明出处:http://www.cnblogs.com/skywang12345/p/3308762.html 1 fail-fast简介 fail-fast 机制是java集合(Collection)中

C# - ArrayList与Hashtable及其泛型版本

C#的集合类继承关系UML图: ICollection - ICollection<T> ICollection:所有非泛型集合的大小.枚举器和同步方法 public interface ICollection : IEnumerable { int Count { get; } bool IsSynchronized { get; } // 对ICollection的访问是否是同步的(线程安全) object SyncRoot { get; } // 获取可用于对ICollection同步访

Java 集合类学习之ArrayList

1.ArrayList的常用方法和原理 package com.fish.list; import java.util.ArrayList; /* 集合的体系: ----------| Collection 单列集合的根接口 ----------------| List 如果实现了List接口的集合类,具备的特点:有序,可重复. --------------------| ArrayList  ArrayList底层是维护了一个Object数组实现的,特点:查询速度快,增删慢. 什么时候使用Ar

ArrayList的序列化与反序列化

最近在阅读ArrayList的源代码时,发现了ArrayList中的用来保存数据的数据使用了transient关键字声明.如下: private transient Object[] elementData; 当时产生了一个疑问,难道ArrayList不可以序列化吗?但是它又实现了Serializable接口,感觉有点自相矛盾了. public class ArrayList<E> extends AbstractList<E> implements List<E>,