最近在写java程序时遇到了一个诡异的问题:一个vector或arraylist 对象,我在循环中依次使用add方法向容器中添加多个对象,最后输出容器中的内容发现容器中的对象值全都相同都变成最后一次add进容器中的对象的值。下面举两个不同的例子对比一下:

例1:

       ValuePair vp1 = new ValuePair("hello",1);

ValuePair vp2 = new ValuePair("world",2);

    Vector<ValuePair> ve = new  Vector<ValuePair> ();

ve.add(vp1);

ve.add(vp2);

System.out.println(ve.toString);

以上vector对象ve输出的结果为【hello 1  , world 2】结果正确。

例 2:

  事先有一个Iterable<ValuePair>的对象 values;里面有两个ValuePair对象“hello” 1,和“world” 2.

  Vector<ValuePair> ve = new Vector<ValuePair>();

  for(ValuePair value : values){

ve.add(value)

}

System.out.println(ve.toString);

  以上vector对象输出的结果却为【world 2  , world 2】,即容器中所有的对象均变成最后一次add进去的对象的值。

  第二个例子的原因:地址引用的问题。也就是说value这个对象名是一个引用类型,它指向内存中的一块地址空间。当第一次add方法,该内存空间存放hello 1,当第二次add时,该内存空间存放world 2,这样第一次add进去的内容同样指向该空间,即同样指向world 2,所以最终ve中add进去的都指向同一个对象。

  解决方法:在每次add时,都拷贝处一个副本(即 新建一个ValuePair 对象,将value的值都赋给该副本ValuePair对象),add该副本。这样输出的结果即为正确结果:【hello 1,world 2】,代码如下:

Vector<ValuePair> ve = new Vector<ValuePair>();

for(ValuePair value : values) 

{

ValuePair temp = new ValuePair();

temp.name = value.name;

temp.count = value.count;

ve.add(temp);

}

System.out.println(ve.toString);

转载于:https://www.cnblogs.com/Dreama/articles/2196869.html

arraylist/vector add()方法诡异之---多次add进去的对象最终都变成最后一次add进去的对象值...相关推荐

  1. cdate在java中_Java Calendar.add方法代码示例

    本文整理汇总了Java中java.util.Calendar.add方法的典型用法代码示例.如果您正苦于以下问题:Java Calendar.add方法的具体用法?Java Calendar.add怎 ...

  2. HashSet中的add()方法( 三 )(详尽版)

    上接HashSet中的add()方法( 二 )(详尽版) ,前两篇说的是泛型为String类的add()方法的具体执行过程,此后三篇说说泛型为自定义类的add()方法的具体执行过程: 首先让我们来自定 ...

  3. python torch exp_Python torch.add方法代码示例

    本文整理汇总了Python中torch.add方法的典型用法代码示例.如果您正苦于以下问题:Python torch.add方法的具体用法?Python torch.add怎么用?Python tor ...

  4. Collection 属性ArrayList.add方法内部调用过程

    Collection 属性 //二进制搜索阈值 private static final int BINARYSEARCH_THRESHOLD = 5000; //改变阈值 private stati ...

  5. java arraylist.add(),Java ArrayList add()方法与示例

    ArrayList类add()方法 语法:public boolean add(T ele); public void add(int indices, T ele);add()方法在java.uti ...

  6. ArrayList的add方法详解——让我们好好看看一个元素是如何插入到ArrayList集合当中(源码级别)

    先看看源码的add方法都涉及到了那些主要方法         这是add方法 这是确保内部容量方法和判断是否扩容方法 这是扩容方法 一.没有手动设置集合大小 1) 确保内部容量< ensureC ...

  7. ArrayList.add方法底层浅析

    java ArrayList.add方法一共有两种方式,如下代码: ArrayList<Integer> arr = new ArrayList<>(); arr.add(1) ...

  8. 回味集合(三)ArrayList的add方法

    啥也不说了,直接撸源码: public class ArrayList<E> extends AbstractList<E>implements List<E>, ...

  9. 【转】ArrayList Vector LinkedList 区别与用法

    ArrayList 和Vector是采用数组方式存储数据,此数组元素数大于实际存储的数据以便增加和插入元素,都允许直接序号索引元素,但是插入数据要设计到数组元素移动等内存操作,所以索引数据快插入数据慢 ...

最新文章

  1. transactionscope 中的异步 处理 异常_协程中的取消和异常 | 异常处理详解
  2. Shell教程(四):条件语句、循环语句、break/continue
  3. ubuntu的xfce4的display只有一种分辨率选项
  4. 线段树——操作格子(蓝桥杯试题集)
  5. 正规表达式与有限自动机
  6. 2015中国银联业务(武汉)面试经验(软件开发)
  7. DPDK初始化分析(一)
  8. Java集合详解(超详细)
  9. 【学英语】老友记S1E1
  10. 智能电视主流的CPU有三家。一个是Mstar(晨星),另两个是MTK和Amlogic(晶晨)
  11. STM32 - 使用FSMC控制LCD
  12. unity3D之简单的碰撞检测 .
  13. 5. Layui数据表格的快速使用
  14. correl函数相关系数大小意义_Excel使用Correl函数返回相关系数并确定属性关系的步骤方法...
  15. 【测试分析】KYM全面收集测试信息
  16. AMD Xilinx官网由于合规性不通过导致无法下载软件原因及解决办法
  17. Django 中的根ulr与APP的url关联的思考
  18. 客服工单系统的工单管理功能
  19. C语言火焰图,Python程序性能分析和火焰图
  20. javaWeb项目不报错但网页报500错误

热门文章

  1. c#中如何删除数组中的元素_C中的数组
  2. Android Espresso
  3. 熊猫read_csv()–将CSV文件读取到DataFrame
  4. primefaces_Primefaces命令按钮
  5. jsf el 表达式_JSF表达式语言– JSF EL
  6. Java属性文件– java.util.Properties
  7. scala 连接符_Scala标识符示例教程
  8. C++基础:C++的封装/继承/多态
  9. Java新职篇:使用程序块
  10. 使用Logic Apps从Azure Blob存储中删除超过X天的文件