java ArrayList()的引用

本文探讨了Java中ArrayList与C++中vector在添加元素时的行为差异,特别是在引用传递和拷贝构造方面。通过实例展示了如何在Java中直接修改ArrayList内对象的属性,而在C++中则需要通过拷贝构造函数来实现。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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

ArrayList()中存放的只是对象的引用,如果你将A存到ArrayList(),然后修改A的值,ArrayList()中存放的值就会自动转变。

如果有A的引用可以直接这么写A.a=你需要的值。

如果不知道可以通过ArrayList().get(indexof(A))取得A的引用,然后修改属性。

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

// 创建一个对象A,引用a指向对象A 。
A a = new A(); 
// 把上面创建的对象A放入list中。 
list.add(a); 

// 创建一个对象A,引用b指向对象A 。
A b = new A(); 
// 这个时候引用a发生了变化,它指向了b引用的对象,是一个新的对象。 
a = b; 
// 把a指向的对象放入list中,这个时候list中有两个元素。 
list.add(a) 

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

/ /创建一个对象A,引用a指向对象A。 
A a = new A(); 
// 把对象A的引用放入List,对象A本身没有放进List 。
list.add(a); 

// 创建一个对象A,引用b指向对象A。 
A b = new A(); 
// 这个时候引用a发生了变化,它指向了b引用的对象,是一个新的对象。 
a = b; 
// 这里同样是把a指向的新的对象的引用放入List,并不是把A对象本身放入List。
list.add(a)

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

修改ArrayList()中元素的值?


A test = new A();

test.a = 1;

test.b = 1;

List list = new ArrayList();

list.add(test);//加到List里

A test2 = (A) 

list.get(0);// 取出

test2.a = 2;

test2.b = 2;// 这样就行了


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

论Java的ArrayList.add(e)和C++的vector.push_back(e)的区别

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;
    }
}
复制代码

运行如下:


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 = 0; i < vec.size(); i++) {
        vec[i].out();
    }
    cout<<endl;
}

int main() {
    vector<A> aVec;
    aVec.clear();
    
    //弄1个值为1的a1,插入vector并打印
    A a1(1);
    aVec.push_back(a1);
    print(aVec);
    
    //改a1的值为2,再打印
    a1.a = 2;
    print(aVec);
    
    //修改vector内部的元素的值,再打印
    aVec[0].a = 3;
    print(aVec);
    return 0;
}
复制代码

 

打印结果发现:

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

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

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


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值