Java的ArrayList和C++的vector很类似,都是很基本的线性数据结构。但是他们的表现却不同。

在工作中碰到一个问题就是,搞不清楚到底传进去的是一个新对象,还是当前对象的引用!

经过实战分析:

在Java的ArrayList.add(e)中,传入的是引用,因此当你传入e以后,再改变e的成员,则ArrayList里的e也同样会改变,因为本身e和ArrayList中的e就是同一个东西。

而C++的vector.push_back(e)则会调用拷贝构造函数,因此当你传入e以后,再改变e的成员,则vector里的e不会变,因为已经是两个对象了。

Java代码:

import java.util.ArrayList;

public class TestJavaArrayListAdd {
public static void main(String[] args) {
ArrayList<A> all = new ArrayList<A>(); //这里构造一个值为1的a,插入all并打印
A a = new A(1);
all.add(a);
TestJavaArrayListAdd tester = new TestJavaArrayListAdd();
tester.print(all); //改a的值为2,并再次打印all
a.memberA = 2;
tester.print(all);
} private void print(ArrayList<A> all) {
for (int i = 0; i < all.size(); i++) {
System.out.print(all.get(i).memberA + " ");
}
System.out.println();
}
} class A {
public int memberA; A (int anotherMemberA) {
this.memberA = anotherMemberA;
}
}

运行如下:

1
2

可以看到,对于外面引用的改变对于ArrayList里面的元素也起作用了,下面来看看C++会怎么样。

C++代码:

#include <iostream>
#include <vector>
using namespace std; class A{
public: A(int aa) {
a = aa;
cout<<"In Constructor(aa)"<<endl;
} A(const A & another) {
cout<<"In Constructor(&A)"<<endl;
a = another.a;
} void out() {
cout<<a<<" ";
} int a;
}; void print(vector<A> &vec) {
for (int i = ; i < vec.size(); i++) {
vec[i].out();
}
cout<<endl;
} int main() {
vector<A> aVec;
aVec.clear(); //弄1个值为1的a1,插入vector并打印
A a1();
aVec.push_back(a1);
print(aVec); //改a1的值为2,再打印
a1.a = ;
print(aVec); //修改vector内部的元素的值,再打印
aVec[].a = ;
print(aVec);
return ;
}

打印结果发现:

In Constructor(aa)
In Constructor(&A)
1
1
3

说明确实调用了拷贝构造函数,那么vector内部的对象aVec[0]和外部的对象a1自然是两个独立的对象了,自然对a1.a的任何修改对于aVec内的值没有影响,只有对vector里的东西的修改才有影响。

经过上述折腾,算是都搞清楚了。以后有不懂得问题,一定要照着全搞明白去搞,不要怕麻烦。

论Java的ArrayList.add(e)和C++的vector.push_back(e)的区别的更多相关文章

  1. java之ArrayList.add

    ArrayList添加 public boolean add(E e) { ensureCapacityInternal(size + 1); // Increments modCount!! ele ...

  2. 内功心法 -- java.util.ArrayList<E> (2)

    写在前面的话:读书破万卷,编码如有神--------------------------------------------------------------------下文主要对java.util ...

  3. Java ArrayList add(int index, E element) example

    Simple add() method is used for adding an element at the end of the list however there is another va ...

  4. java 遍历arrayList的四种方法

    package com.test; import java.util.ArrayList;import java.util.Iterator;import java.util.List; public ...

  5. 初涉java库--ArrayList

    我的车就差一个轮子啦,造好轮子,我就飞上天与太阳肩并肩啦,想想都激动.什么你要自己造轮子,是不是傻,商店里不都是别人造好的吗,又好又方便,只需一点money,你没有money,那你只能做个安静的美男子 ...

  6. java集合-- arraylist小员工项目

    import java.io.*; import java.util.ArrayList; public class Emexe { public static void main(String[] ...

  7. java 16-2 ArrayList的练习2

      需求:去除集合中自定义对象的重复值(对象的成员变量值都相同 注意: 我们按照和字符串一样的操作,发现出问题了. 为什么呢? 我们必须思考哪里会出问题? 通过简单的分析,我们知道问题出现在了判断上. ...

  8. java 16-1 ArrayList的练习1

    需求: ArrayList去除集合中字符串的重复值(去掉相同的字符串) 分析: 第一种做法:创建一个新的空集合: A:创建1个具有相同字符串的集合 B:创建1个空的集合 C:遍历第一个集合里面的元素 ...

  9. Java.util.ArrayList详解

    java.util.ArrayList就是传说中的动态数组. 继承了关系,有此可看出ArrayList与list的collection的关系 public class ArrayList<E&g ...

随机推荐

  1. android camera preview常用格式

    在Camera中推荐使用NV21和YV12,因为这两种格式支持所有的相机设备. 但是在Camera2中,推荐使用的格式则是YUV_420_888. 总的来说,在Android里面YUV用得比较多的应该 ...

  2. N皇后问题【递归求解】

    n皇后问题:输入整数n, 要求n个国际象棋的皇后,摆在n*n的棋盘上,互相不能攻击,输出全部方案. 输入一个正整数N,则程序输出N皇后问题的全部摆法.输出结果里的每一行都代表一种摆法.行里的第i个数字 ...

  3. 长按listview弹出选项列表对话框

    Android中通过xml资源文件定义数组.来自微风的网络日志. 文章链接:http://leybreeze.com/blog/?p=1524 Android ListView两种长按弹出菜单方式 h ...

  4. Safari导入书签

    1.打开Safari 这边safari会自动带出一些关联的浏览器,但如果你要导入的浏览器不在这里的话,就需要看第二步. 2.比如,这里我要从QQ浏览器导入,先打开QQ浏览器. 其他浏览器都类似,找到书 ...

  5. Java实现List数组的几种替代方案

    在Java中,禁止定义List<Integer>a[],这种List数组结构. 但是还是可以使用其它一些方式来实现列表数组. 一.使用Node把List包裹起来 public class ...

  6. Solr删除managedschema

    一.创建solr核心 solr createcore 二.删除managedschema managedschema是solr自动生成的,里面包含大量无用配置. solr是检查用户定义的schema. ...

  7. JavaScript 表单验证入门

    JavaScript 表单验证 JavaScript 可用来在数据被送往服务器前对 HTML 表单中的这些输入数据进行验证. 被 JavaScript 验证的这些典型的表单数据有: 用户是否已填写表单 ...

  8. I/O Completion Ports学习

    表示还是自己看MSDN最直接,别人的介绍都是嚼剩下,有木有? IO完成端口为在多处理器系统处理多个异步IO请求提供一个高效的线程模型.当一个进程新建一个完成端口,操作系统新建一个目的为服务这些请求的队 ...

  9. Redis学习之路(000)- 目录

    本文是博主学习整理网上大神的文件以及自学的心得. Redis学习之路(000)- 目录 Redis学习之路(001)- Redis介绍以及安装(Linux) Redis学习之路(002)- Ubunt ...

  10. opencv 摄像头 线程

    #include <stdio.h>#include <stdlib.h>#include <string.h>#include <pthread.h> ...