A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 罗雪梅 中级黑马   /  2012-9-18 22:25  /  1840 人查看  /  5 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 罗雪梅 于 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();
        }

}

评分

参与人数 1技术分 +1 收起 理由
创出一片辉煌 + 1 赞一个!

查看全部评分

5 个回复

正序浏览
我运行结果没问题的
回复 使用道具 举报
你那种可行的说法应该不对,你看看你的代码,上面的定义中private int size=0;
它只在add方法调用时增加1,所以可以添加数据。
你的Object [] old;应该还是原先的内容,大小没变。

不知道我说的对不对,你看下你写的
回复 使用道具 举报
黑马张涛 发表于 2012-9-18 23:16
你确定是一样的?
for(int i=0;i

式过了,是一样的效果
回复 使用道具 举报
你确定是一样的?
for(int i=0;i<size;i++){
                        
                        old=oldArr;//old,oldArr都是引用类型,存储的都是地址值,可以相互赋值,但是你这样就是把oldArr的地址值赋值给了old,那old肯定也是指向oldArr指向的地址了,但old.length肯定是和oldArr.length一样,扩容就没用了吧!
                 }
回复 使用道具 举报
因为old在栈内存中本身存在 现在Object[] oldArr这个在堆内存中指向了这个栈内存的old  和这个原谅是同理for(int i=0;i<size;i++){ //oldArr 中的元素赋值给old
                        
                        old=oldArr;
                }
都是堆内存中指向了这个栈内存的old  
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马