黑马程序员技术交流社区

标题: 数组赋值的问题 [打印本页]

作者: 罗雪梅    时间: 2012-9-18 22:25
标题: 数组赋值的问题
本帖最后由 罗雪梅 于 2012-9-21 13:54 编辑

模仿的是arrayList的底层实现,其中标红色的话句都是把数组中的元素操作给另一个,但是一个是整体就赋过去了,另一个则遍历过去的,我试了把2下面遍历的语句换成和第一句一样的,也可以达到一样的效果,但不是明白为什么不用遍历就能直接这样做???

class MyList
{
        private Object[] old;
        private int size=0;

        public MyList(){
                this(10);
        }

        public MyList(int init){
               
                old=new Object[init];
        }

        public void add(Object obj){
               

                changeArraySize();
                old[size++]=obj;

        
        }

        private void changeArraySize(){
               
                Object[] oldArr=old; //将old数组中的内容保存
        
                int length=oldArr.length+(int)(oldArr.length*0.5); //根据old数组长度得到一个新长度  50%

                old=new Object[length]; //old重新定义,长度增长

                for(int i=0;i<size;i++){ //oldArr 中的元素赋值给old
                        
                        old=oldArr;
                }

        }

        public Object get(int index){
               
                return old[index];
        }
        
        public int size(){
               
                return size;
        }
        
        public String toString(){
               
                StringBuilder build=new StringBuilder();

                build.append("[");

                for(int i=0;i<size;i++){
                        
                        if(i==size-1){
                                build.append(old);
                        }else{
                                build.append(old).append(",");
                        }
                }
                build.append("]");

                return build.toString();
        }

}


作者: 尤圣回    时间: 2012-9-18 22:33
因为old在栈内存中本身存在 现在Object[] oldArr这个在堆内存中指向了这个栈内存的old  和这个原谅是同理for(int i=0;i<size;i++){ //oldArr 中的元素赋值给old
                        
                        old=oldArr;
                }
都是堆内存中指向了这个栈内存的old  
作者: 黑马张涛    时间: 2012-9-18 23:16
你确定是一样的?
for(int i=0;i<size;i++){
                        
                        old=oldArr;//old,oldArr都是引用类型,存储的都是地址值,可以相互赋值,但是你这样就是把oldArr的地址值赋值给了old,那old肯定也是指向oldArr指向的地址了,但old.length肯定是和oldArr.length一样,扩容就没用了吧!
                 }
作者: 罗雪梅    时间: 2012-9-20 07:52
黑马张涛 发表于 2012-9-18 23:16
你确定是一样的?
for(int i=0;i

式过了,是一样的效果
作者: 程振    时间: 2012-9-20 14:00
你那种可行的说法应该不对,你看看你的代码,上面的定义中private int size=0;
它只在add方法调用时增加1,所以可以添加数据。
你的Object [] old;应该还是原先的内容,大小没变。

不知道我说的对不对,你看下你写的
作者: 罗雪梅    时间: 2012-9-20 15:45
我运行结果没问题的




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2