日期:2014-05-19  浏览次数:20724 次

关于arraylist的问题。
arraylist操作我总搞不清楚哪个是对象引用和哪个是对象copy。
比如我想拿出arraylist中的一个引用,用来修改里面的值。
是不是
myclass   m1   =   (myclass)arraymyclass[10];
这样应该是对象的引用吧?
那对象的copy呢?
如何自己定义一个对象,替换掉arraylist中的某一个?
还有如何返回arraylist中的一部分,比如我想拿出arraymyclass[3]~arraymyclass[5],做成一个新的arraylist,以拷贝形式。
arraylist里存储的是什么?arraylist里存储的都应该是对象指针,那么是copy出来个新对象,并且存储对象指针还是原对象的指针?
arraylist能不能存储的全都是引用,以方便修改对象的值?

------解决方案--------------------


还有如何返回arraylist中的一部分,比如我想拿出arraymyclass[3]~arraymyclass[5],做成一个新的

_--------------------
你可以用ArrayList自带的CopyTo方法

ArrayList存储的是object,而object是所有类的基类(包括引用类型和值类型),所以ArrayList中可能存放的是对象的引用也有可能是存放的对象的值!
------解决方案--------------------
从ArrayList里使用系统实现的拷贝,应该是浅拷贝,也就是引用拷贝,要实现对象拷贝,估计要自己实现了。
至于你说的存储引用和存储对象,我没明白什么意思。ArrayList应该是以以下方式存储的(值类型的在存储进该集合的时候,因为参数是Object类型,好像会自对装箱)
对象A-------------------》栈中为A分配地址,该地址指向对像在堆中的地址-------》DA
ArrayList中存储的是DA,而不是A,同样取出来的时候,新对像也是在栈中分配地址,并拷贝DA过去,如果单从A的方向来说,说是把A的值拷贝也无不可
------解决方案--------------------
值到 引用 做 装箱(boxing) 操作.
引用到值 撤箱(unboxin) 操作.


所谓装箱和拆箱是一个很抽象的概念

装箱是将值类型转换为引用类型
拆箱是将引用类型转换为值类型
利用装箱和拆箱功能,可通过允许值类型的任何值与Object 类型的值相互转换,将值类型与引用类型链接起来
例如:
int val = 100;
object obj = val;
Console.WriteLine (“对象的值 = {0} ", obj);
这是一个装箱的过程,是将值类型转换为引用类型的过程

int val = 100;
object obj = val;
int num = (int) obj;
Console.WriteLine ( "num: {0} ", num);
这是一个拆箱的过程,是将值类型转换为引用类型,再由引用类型转换为值类型的过程
------解决方案--------------------
arraylist操作我总搞不清楚哪个是对象引用和哪个是对象copy。
比如我想拿出arraylist中的一个引用,用来修改里面的值。
是不是
myclass m1 = (myclass)arraymyclass[10];
这样应该是对象的引用吧?//是的。
那对象的copy呢?//copy应该调用clone方法,如果myclass有实现的话。对象copy需要对象自己定义。如果没有clone(或者类似的方法),你只能new一个然后一项一项的赋值。
如何自己定义一个对象,替换掉arraylist中的某一个?//arraymyclass[10] = myclassX;原来的arraymyclass[10]如果没其他的引用指向他,gc会在合适的时候回收掉它。如果是有指向并且你希望destroy掉他的话,需要自己写析构并显式调用。
还有如何返回arraylist中的一部分,比如我想拿出arraymyclass[3]~arraymyclass[5],做成一个新的arraylist,以拷贝形式。//不是很清楚.net有没有现成的这样的方法。如果没有,自己写一个collection <T> copy(int startIndex, int endIndex)也不是很麻烦。
arraylist里存储的是什么?arraylist里存储的都应该是对象指针,那么是copy出来个新对象,并且存储对象指针还是原对象的指针?//是原对象地址,arraylist会creat一块新的空间(一个新的ArrayList对象)来存放原来对象们的地址。

arraylist能不能存储的全都是引用,以方便修改对象的值?//本来就是这样。
------解决方案--------------------
arraylist里存储的是什么?arraylist里存储的都应该是对象指针
----------------
你看看这个:
int testInt=10;
ArrayList arr=new ArrayList();
arr.Add(testInt);
testInt=11;
......//你认为此时arr[0]与testInt的值是一样的吗?