我的集合学习笔记

一,ArrayList

实现自己的ArrayList:主要是添加方法,理解自动扩容机制

代码+注释:

package com.amazing.jdk.learn2List.list_08_13;

/**
 * 1.实现ArrayList接口的增删改查方法
 * 2.理解自动扩容机制
 *参考:http://blog.youkuaiyun.com/u011240877/article/details/52802849
 */
public class MyArrayList<E> {
    //需要扩容的数组
    transient Object[] elementData;
    //数组里的元素个数
    private int size;

    public boolean add(E o) {
        /*
        1.先判断一下,不然会报空指针
         */
        if(elementData==null){
            elementData=new Object[]{};
            size=0;
        }
        /*
        2.再判断当数组被元素填满时,扩容
         */
        if(size==elementData.length){
            //3.定义一个数组接收原来数组的元素
            Object[] oldData=elementData;
            //4.扩容1.5倍
            int newCapacity=(elementData.length*3)/2;
            if(newCapacity<size) newCapacity=size;
            //5.定义一个新长度的数组
            elementData=new Object[newCapacity];
            //6.复制
            System.arraycopy(oldData,0,elementData,0,size);
        }
        elementData[size++] = o;
        return true;
    }

    public int size(){
        return size;
    }

    public E get(int index){
        return (E) elementData[index];
    }

    public void clear(){
        for(int i=0;i<size();i++){
            elementData[i]=null;
        }
        size=0;
    }

                /*
            System提供了一个静态方法arraycopy(),我们可以使用它来实现数组之间的复制。其函数原型是:
            public static void arraycopy(Object src,
                             int srcPos,
                             Object dest,
                             int destPos,
                             int length)
            src:源数组;	srcPos:源数组要复制的起始位置;
            dest:目的数组;	destPos:目的数组放置的起始位置;	length:复制的长度。
            注意:src and dest都必须是同类型或者可以进行转换类型的数组.
            有趣的是这个函数可以实现自己到自己复制,比如:
            int[] fun ={0,1,2,3,4,5,6};
            System.arraycopy(fun,0,fun,3,3);
            则结果为:{0,1,2,0,1,2,6};
            实现过程是这样的,先生成一个长度为length的临时数组,将fun数组中srcPos
            到srcPos+length-1之间的数据拷贝到临时数组中,再执行System.arraycopy(临时数组,0,fun,3,3).

             */

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值