数据结构与算法-动态数组

什么是数据结构

数据结构是计算机存储,组织数据的方式

  • 线性结构:线性表(数组,链表,栈,列队,哈希表(数组))
  • 树形结构:二叉树(AVL树,红黑树,B树,堆,Trie,哈夫曼树,并查集)
  • 图形结构:邻接矩阵,邻接表

线性表

线性表是具有n个相同类型元素的有限序列(n>=0)
a1 是首节点(首元素),an是尾节点(尾元素)
a1是a2的前驱,a2是a1的后继

数组

数组是一种顺序存储的线性表,所有的元素的内存地址是连续的

int[] array =new int[]{11,22,33};

在很多编程中,数组都有个致命的缺点:无法动态修改容量
而实际开发中,我们更希望数组的容量可以动态改变的

动态数组

接口设计

int size();//元素的数量
boolean isEmpty();//是否为空
boolean contains(E element);//是否包含某个元素
void add(E element);//添加元素到最后面
E get(int index);//返回index位置对应的元素
E set(int index,E element);//设置index位置的元素
void add(int index,E element);//往index位置添加元素
E remove(int index);//删除index位置对应的元素
int indexOf(E element);//查看元素的位置
void clear();//清除所有元素

基本功能代码及实现


/**
 * @Author :Ersan
 * @Date 2020/10/27
 * @Description
 */
public class ArrayList {
    private int size; //元素的数量
    private int[] elements;//所有的元素
    private static final int DEFAULT_CAPACITY=10;
    private static final int ELEMENT_NOT_FOUND=-1;
    public ArrayList(int capaticy){
        capaticy=(capaticy<DEFAULT_CAPACITY)? DEFAULT_CAPACITY:capaticy;
        elements=new int[capaticy];
    }
    public ArrayList(){
        this(DEFAULT_CAPACITY);
    }
    /*
    *清除所有元素
    */
    public void clear(){
        size=0;
    }
    /*
    *元素的数量
    * return
    */
    public int size(){
        return size;
    }
    /*
     *是否为空
     * return
     */
    public boolean isEmpty(){
        return size==0;
    }
    /*
    *是否包含某个元素
    * param element
    * return
    */
    public  boolean contains(int element){
        return indexOf(element)!=ELEMENT_NOT_FOUND;
    }

    /*
    *添加元素到尾部
    * param element
    */
    public void add(int element){
        add(size,element);
    }

    /*
    *获取index位置的元素
    * param index
    * return
    */
    public int get(int index){
        rangeCheck(index);
        return elements[index];
    }

    /*
    *设置index位置的元素
    * param index
    * param element
    * return 原来的元素
    */
    public int set(int index,int element){
        rangeCheck(index);
        int old=elements[index];
        elements[index]=element;
        return old;
    }

    /*
    *在index位置插一个元素
    * param index
    * param element
    */
    public void add(int index,int element){
        rangeCheckForAdd(index);
        ensureCapacity(size + 1);//扩容

        for (int i= size-1;  i >= index ; i--) {
            elements[i+1]=elements[i];
        }
        elements[index]=element;
        size++;
    }

    /*
    *删除index位置的元素
    *param index
    * return
    */
    public int remove(int index){
        rangeCheck(index);
        int old=elements[index];
        for (int i = index + 1; i < size; i++) {
            elements[i-1]=elements[i];
        }
        size--;
        return old;
    }

    @Override
    public String toString() {
        StringBuffer string=new StringBuffer();
        string.append("size=").append(size).append(",  [");
        for (int i = 0; i < size; i++) {
            if (i!=0){
                string.append(", ");
            }
            string.append(elements[i]);

//            if (i!=size-1){
//                string.append(",");
//            }
        }
        string.append("]");
        return string.toString();
    }

    /*
    *查看元素的索引
    * param element
    * return
    */
    public int indexOf(int element){
        for (int i = 0; i < size; i++) {
            if (elements[i]==element) return i;
        }
        return ELEMENT_NOT_FOUND;
    }

    private void outOfBounds(int index){
        throw new IndexOutOfBoundsException("Index:"+index+", Size:"+size);
    }
    private void rangeCheck(int index){
        if (index<0||index>=size) {
            outOfBounds(index);
        }
    }
    private void rangeCheckForAdd(int index){
        if (index<0||index>size) {
            outOfBounds(index);
        }
    }
    //保证要有capacity的容量
    private void ensureCapacity(int capacity){
        int oldCapacity=elements.length;
        if (oldCapacity>=capacity) return;

        //新容量为旧容量的1.5倍
        int newCapacity = oldCapacity + (oldCapacity >> 1);
        int[] newElements=new int[newCapacity];
        for (int i = 0; i < size; i++) {
            newElements[i]=elements[i];
        }
        elements=newElements;
    }
}

泛型

public class ArrayList<E> {
	private int size;
	private E[] elements;
	
	elements = (E[])new Object[capacity];
}

ArrayList<Integer> list = new ArrayList<>(); 

对象数组

在这里插入图片描述在这里插入图片描述数组存的是对象的地址

内存管理细节

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

    public E remove(int index){
        rangeCheck(index);
        E old=elements[index];
        for (int i = index + 1; i < size; i++) {
            elements[i-1]=elements[i];
        }
        elements[--size]=null;
        return old;
    }

null的处理

    public int indexOf(E element){
        if (element==null) {
            for (int i = 0; i < size; i++) {
                if (elements[i]==null) return i;
            }
        }else {

            for (int i = 0; i < size; i++) {
                if (element.equals(elements[i])) return i;
            }
        }
        return ELEMENT_NOT_FOUND;
    }

完善后的代码

package dongtaishuzu;




/**
 * @Author :Ersan
 * @Date 2020/10/27
 * @Description
 */
public class ArrayList<E> {
    private int size; //元素的数量
    private E[] elements;//所有的元素
    private static final int DEFAULT_CAPACITY=10;//数组默认大小为10
    private static final int ELEMENT_NOT_FOUND=-1;
    public ArrayList(int capaticy){
        capaticy=(capaticy<DEFAULT_CAPACITY)? DEFAULT_CAPACITY:capaticy;
        elements= (E[]) new Object[capaticy];
    }
    public ArrayList(){
        this(DEFAULT_CAPACITY); //不给值,capacity大小为默认值
    }
    /*
    *清除所有元素
    */
    public void clear(){
        for (int i = 0; i < size; i++) {
            elements[i]=null;//数组存的是对象的地址,这边把地址为null,相应的对象就会被java自带的垃圾回收器回收
        }
        size=0;//size=0,用户就会访问不到,但数组还在,避免重新创建数组更加消耗内存,如果数组多大,我们可以考虑缩容,这里缩容和扩容方法差不多
    }
    /*
    *元素的数量
    * return
    */
    public int size(){
        return size;
    }
    /*
     *是否为空
     * return
     */
    public boolean isEmpty(){
        return size==0;
    }
    /*
    *是否包含某个元素
    * param element
    * return
    */
    public  boolean contains(E element){
        return indexOf(element)!=ELEMENT_NOT_FOUND;
    }

    /*
    *添加元素到尾部
    * param element
    */
    public void add(E element){
        add(size,element);
    }

    /*
    *获取index位置的元素
    * param index
    * return
    */
    public E get(int index){
        rangeCheck(index);
        return elements[index];
    }

    /*
    *设置index位置的元素
    * param index
    * param element
    * return 原来的元素
    */
    public E set(int index,E element){
        rangeCheck(index);
        E old=elements[index];
        elements[index]=element;
        return old;
    }

    /*
    *在index位置插一个元素
    * param index
    * param element
    */
    public void add(int index,E element){
       // if (element==null) return;  是否支持null
        rangeCheckForAdd(index);
        ensureCapacity(size + 1);

        for (int i= size-1;  i >= index ; i--) {
            elements[i+1]=elements[i];
        }
        elements[index]=element;
        size++;
    }

    /*
    *删除index位置的元素
    *param index
    * return
    */
    public E remove(int index){
        rangeCheck(index);
        E old=elements[index];
        for (int i = index + 1; i < size; i++) {
            elements[i-1]=elements[i];
        }
        elements[--size]=null;
        return old;
    }

    @Override
    public String toString() {
        StringBuffer string=new StringBuffer();
        string.append("size=").append(size).append(",  [");
        for (int i = 0; i < size; i++) {
            if (i!=0){
                string.append(", ");
            }
            string.append(elements[i]);

//            if (i!=size-1){
//                string.append(",");
//            }
        }
        string.append("]");
        return string.toString();
    }

    /*
    *查看元素的索引
    * param element
    * return
    */
    public int indexOf(E element){
        if (element==null) {
            for (int i = 0; i < size; i++) {
                if (elements[i]==null) return i;
            }
        }else {

            for (int i = 0; i < size; i++) {
                if (element.equals(elements[i])) return i;
            }
        }
        return ELEMENT_NOT_FOUND;
    }

    private void outOfBounds(int index){
        throw new IndexOutOfBoundsException("Index:"+index+", Size:"+size);
    }
    private void rangeCheck(int index){
        if (index<0||index>=size) {
            outOfBounds(index);
        }
    }
    private void rangeCheckForAdd(int index){
        if (index<0||index>size) {
            outOfBounds(index);
        }
    }
    //保证要有capacity的容量
    private void ensureCapacity(int capacity){
        int oldCapacity=elements.length;
        if (oldCapacity>=capacity) return;

        //新容量为旧容量的1.5倍
        int newCapacity = oldCapacity + (oldCapacity >> 1);
        Object[] newElements=new Object[newCapacity];
        for (int i = 0; i < size; i++) {
            newElements[i]=elements[i];
        }
        elements= (E[]) newElements;
    }
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值