【Java数据结构】手写泛型数组

本文介绍了如何构建一个具备动态扩容功能的泛型数组,支持任意类型的数据存储,并提供了增、删、改、查等基本操作。通过封装一个Array类,利用Java泛型和Object数组实现,当容量不足时,使用2倍当前容量进行扩容,确保数据安全高效地存储和管理。
摘要由CSDN通过智能技术生成

如何构建一个我们自己使用的泛型数组
1.可以扩容
2.接收“任何”类型(基本数据类型使用包装类型 )
3.增删改查

存储泛型数据
private E[] data;
private int size;
构造函数
    public Array() {
        this(10);
    }

    public Array(int capacity) {
        data = (E[]) new Object[capacity];
        this.size = 0;
    }
//要注意了,这个是创建一个泛型数组,泛型数组不能通过下面的方式进行创建
new E[capacity];// 这是错误的 
扩容方法

扩容就是新建另一个数组,然后把当前数据拷贝到另一个数组中,然后data指向新数组

    private void resize(int capacity) {
        E[] newData = (E[]) new Object[capacity];
        for (int i = 0; i < size; i++) {
            newData[i] = data[i];
        data = newData;
        }
    }

插入数据方法

    /**
     * 向Array中index位置添加一个元素[即原来的index位]
     * @param index
     * @param e
     * @return
     */
    public void insert( int index , E e ) {
//      如果大小等于容量,就需要扩容
        if (size == data.length){
            resize(2 * data.length);
        }
        if (index < 0 || index > size){
            throw new IllegalArgumentException("添加失败,索引参数有误");
        }
        for (int i = size-1; i >= index; i--) {
            data[i+1] = data[i];
        }
        data[index] = e;
        size++;
    }

在for循环中,我们是从数组的后端,把每个元素都后移一位 。
为什么i是从size-1开始,会不会数组越界
size是数组的元素个数,在上一次添加时,就已经有了size个元素了(当前的元素没有添加进去,共有size个数,第size+1个数,即索引为size)
在这里插入图片描述
全部代码

public class Array<E> {
   private E[] data;
   private int size;

   /**
    * 构造方法 :如果传参,就按照传参大小创建容量,否则容量10
    */
   public Array() {
       this(10);
   }

   public Array(int capacity) {
       data = (E[]) new Object[capacity];
       this.size = 0;
   }

   /**
    * 向数组里面添加一个元素,添加到末尾
    * 由于我们已经写好了一个可以设置插入位置的插入元素方法
    * 所以现在可以通过
    */
   public void addLast(E e){

       insert(size,e);
   }

   private void resize(int capacity) {
       E[] newData = (E[]) new Object[capacity];
       for (int i = 0; i < size; i++) {
           newData[i] = data[i];
       data = newData;
       }
   }


   /**
    * 向Array中index位置添加一个元素[即原来的index位]
    * @param index
    * @param e
    * @return
    */
   public void insert( int index , E e ) {
//      如果大小等于容量,就需要扩容
       if (size == data.length){
           resize(2 * data.length);
       }
       if (index < 0 || index > size){
           throw new IllegalArgumentException("添加失败,索引参数有误");
       }
       for (int i = size-1; i >= index; i--) {
           data[i+1] = data[i];
       }
       data[index] = e;
       size++;
   }

   public E get(int index){
       if (index < 0 || index >= size){
           throw new IllegalArgumentException("获取数据失败,索引有误");
       }
       return data[index];
   }

   public void set(int index , E e ){
       if (index < 0 || index >= size){
           throw new IllegalArgumentException("获取数据失败,索引有误");
       }
       data[index] = e;
   }

   public boolean contains(E e){
       for (int i = 0; i < size; i++) {
           if (data[i] == e){
               return true;
           }
       }
       return false;
   }

   /**
    * 查找数组中元素e所在的索引,如果不存在e,就返回-1
    * @param e
    * @return
    */
   public int find(E e){
       for (int i = 0; i < size; i++) {
           if (data[i] == e){
               return i;
           }
       }
       return -1;
   }

   public E remove( int index ){
       if (index < 0 || index >= size){
           throw new IllegalArgumentException("获取数据失败,索引有误");
       }
       E deleteE = data[index];
       for (int i = index+1; i > size ; i--) {
           data[i-1] = data[i];
       }
       size--;
       return deleteE;
   }


   public E removeFirst(){
       return remove(0);
   }

   /**
    * 这里不需要使用
    * @param index
    * @return
    */
   public E removeLast(){
       return remove(size-1);
   }

   public void removeElement(E e){
       int index = find(e);
       if (index != -1){
           remove(index);
       }
   }

   public boolean isEmpty(){
       return size == 0;
   }



   public int getSize(){
       return size;
   }

   public int getCapacity(){
       return data.length;
   }

   @Override
   public String toString() {
       StringBuilder stringBuilder=new StringBuilder();
       for (int i = 0; i < size; i++) {
           stringBuilder.append(i+" ");
       }
       return "Array{" +
               "data = " + stringBuilder.toString() +
               ", size = " + size +
               '}' +
               "capacity = " + data.length;
   }
}

  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

渣渣高不会写Java

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值