手写ArraryList(动态数组设计)

1.线性表

线性表是具有n个相同类型元素的有限序列(n > 0 )

在这里插入图片描述

  • 常见的线性表有

    • 数组
    • 链表
    • 队列
    • 哈希表(散列表)
  • 数组

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

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

    在这里插入图片描述

2.动态数组设计(手写ArrayList)

2.1接口设计

在这里插入图片描述

2.2动态数组设计

在这里插入图片描述

2.3添加元素-add(E element)

在这里插入图片描述

2.4打印数组

  • 重写toString方法
  • 在toString方法中将元素拼接成字符串
  • 字符串拼接建议用StringBuilder

2.5删除元素-remove(int index)

在这里插入图片描述

2.6添加元素-add(int index , E element)

在这里插入图片描述

2.7扩容机制

在这里插入图片描述

2.7.1扩容说明
  • 首先,数组是向内存申请连续的存储空间,当内存空间不足以储存数据时,需要继续申请新的存储空间,此时计算机做不到将新申请的内存和原先的内存拼接起来的。
2.7.2扩容原理
  1. 通过new向堆区重新申请内存空间(创建一个新数组),设置新数组大小为原先数组的1.5倍。
  2. 依次遍历原数组元素,将其放置在新数组中。
  3. 原数组引用指向新数组

3.源码实现

3.1主要方法类

package dataStruct.dynamic;

import java.util.Arrays;

public class ArraryList{
    
    
    private int size  ;
    private int[] elements;
    //默认容量
    private static final int DEFAULT_CAPACITY = 10;
    //找不到元素默认返回值
    private static final int ELEMENT_NOT_FOUND = -1;

    public ArraryList(){
    
    
        this(DEFAULT_CAPACITY);
    }
    public ArraryList(int capacity){
    
    
        capacity = (capacity < DEFAULT_CAPACITY) ? DEFAULT_CAPACITY : capacity;
        elements = new int[capacity];
    }

    /**
     * 查看集合大小
     * @return
     */
    public int size(){
    
    
        return  size;
    }

    /**
     * 判读集合是否为空
     * @return
     */
    public boolean isEmpty(){
    
    
        return size == 0;
    }

    /**
     * 判断数组是否包含元素
     * @param element
     * @return
     */
    public boolean contains(int element){
    
    
       for(int i = 0; i < size ; i++ ){
    
    
           if(elements[i] == element) return true;
       }
        return false;
    }

    /**
     * 添加元素
     * @param element
     */
    public void add(int element){
    
    
        addByIndex(size,element);
    }

    /**
     * 11 22 33 44 55 ___
     *指定位数增加
     * @param index
     * @param element
     * @return
     */
    public void add(int index ,int element){
    
    
        indexOutForCheck(index);//检查数据是否越界
        for (int i = size; i >= index ; i-- ){
    
    
            if(i == index){
    
    
                elements[i-1] = element;
            }else {
    
    
                elements[i-1] = elements[i-2];                //元素右移一位
            }
        }
        size ++;
    }

    /**
     * 在索引处增加数据
     * @param index
     * @param element
     */
    public void addByIndex(int index ,int element){
    
    
        ensureCapacity(size+1);//数组动态扩容
        indexOutForaddCheck(index);//检查数据是否越界
        for (int i = size - 1; i >= index ; i-- ){
    
    
            elements[i+1] = elements[i];
        }
        elements[index] = element;
        size ++;
    }

    /**
     * 根据索引查找元素
     * @param index
     * @return
     */
    public int get(int index){
    
    
        indexOutForCheck(index);//检查数据是否越界
        return  elements[index];
    }

    /**
     * 指定索引添加元素,
     * 并返回之前元素
     * @param index
     * @param element
     * @return
     */
    public int set(int index,int element){
    
    
        indexOutForCheck(index);//检查数据是否越界
        int old  = elements[index];
        elements[index] = element ;
        return  old;
    }

    /**
     * 删除索引的元素
     * @param index
     * @return
     */
    public int remove(int index){
    
    
        int removeData = elements[index];
        for(int i = index; i < size - 1  ; i ++ ){
    
    
            elements[i] = elements[i+1];
        }
        size-- ;
        return removeData;
    }

    /**
     * 查看元素所在的位置
     * @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;
    }

    /**
     * 清除数组
     */
    public void clear(){
    
    
        this.size = 0;
    }

    public void ensureCapacity(int capacity){
    
    
        int oldCapacity = elements.length;
        if(capacity < oldCapacity) 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;//原数组指针指向新数组
        System.out.println("原数组容量: "+ oldCapacity +"扩容为:"+ newCapacity);


    }

    /**
     * 重写toString方法
     * @return
     */
    @Override
    public String toString() {
    
    
        StringBuilder string = new StringBuilder();
        string.append("size: ").append(size).append(", [");
        for (int i = 0 ; i < size ; i++){
    
    
            string.append(elements[i]);
            if(i != size() - 1){
    
    
                string.append(",");
            }
        }
        string.append("]");
        return string.toString();
    }
    public void indexOutForCheck(int index){
    
    
        if(index < 0 || index >= size){
    
    
            throw new IndexOutOfBoundsException("index: " + index + " size: " + size);
        }
    }

    public void indexOutForaddCheck(int index){
    
    
        if(index < 0 || index > size){
    
    
            throw new IndexOutOfBoundsException("index: " + index + " size: " + size);
        }
    }
}

3.2测试类

package dataStruct.dynamic;

public class ArraryListTest {
    
    
    public static void main(String[] args) {
    
    
      ArraryList list = new ArraryList();
      //添加元素
        for (int i = 0 ; i < 5 ; i++){
    
    
            list.add(i);
        }
        //打印集合list
        System.out.println(list);
        //添加元素22到索引为4的位置
        list.addByIndex(4,22);
        System.out.println(list);
        System.out.println("判断集合是否为空: "+ list.isEmpty());
        System.out.println("判断集合是否包含元素22: "+ list.contains(22));
        //将元素-1添加到索引为4的位置上
        list.set(4,-1);
        //打印数组
        System.out.println(list);
        //删除索引4的元素
        list.remove(4);
        //打印数组
        System.out.println(list);
        //查看元素4的索引
        System.out.println(list.indexOf(4));
        //删除索引
        list.clear();
        System.out.println(list);

      //数组动态扩容
      for (int i = 10 ; i < 20 ; i++){
    
    
        list.add(i);
      }
      System.out.println(list);
    }
}

3.3测试结果

在这里插入图片描述

文章.md笔记:提取码:fybo

おすすめ

転載: blog.csdn.net/qq_41239465/article/details/121383624