java ArrayList()的引用
来源:互联网 发布:xbox one s 国服 网络 编辑:程序博客网 时间:2024/05/22 07:44
==========================================================
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; }}
运行如下:
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 = 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里的东西的修改才有影响。
经过上述折腾,算是都搞清楚了。以后有不懂得问题,一定要照着全搞明白去搞,不要怕麻烦。
- java ArrayList()的引用
- Java ArrayList中存放引用数据类型的问题
- ArrayList对象引用的问题
- 【引用】Java容器类List、ArrayList、Vector及map、HashTable、HashMap分别的区别
- java的ArrayList使用
- java的ArrayList使用
- java的ArrayList使用
- java ArrayList的排序
- Java ArrayList的使用方法
- java ArrayList的排序
- java ArrayList 的实现
- java ArrayList的应用
- java ArrayList的问题
- java的arraylist排序示例(arraylist用法)
- android ArrayList和java ArrayList的区别
- java的arraylist排序示例(arraylist用法)
- java的ArrayList的值
- Java中的ArrayList的容量
- LintCode-剑指Offer-(112)删除排序链表中的重复元素
- C语言文件操作
- Linksys玩多了,来看看真正的Cisco~技术帖
- HFile Mapreduce阶段的优化
- C#中NPOI操作excel之读取和写入excel数据
- java ArrayList()的引用
- 扣丁学堂——Activity(二)
- 苹果开发者站神游薄记 - 概述
- 最大上升子序列和
- Single Number
- hpu(acm)大赛第
- Unity3D研究院之Android全自动打包生成apk(六十九)
- Spark-1.5.2安装
- Linux虚拟文件系统VFS