02 Java面向对象—第4节 面向对象高级~数组增删查案例(动态扩容)

一、面向对象高级训练任务

2、数组增删查案例

问题描述

设置一个类, 命名为 MyList 类中包含属性:Object[ ] element 方法有如下几个:

  1. 增加方法 add : 可以向数组属性中依次存储 Object,数组内容存满时,需实现动态扩容(详解在下面)。
  2. 删除方法 remove :可以根据数据或下标,从数组属性中删除 Object 数据,删除后,数组后续元素需前移。
  3. 查询方法 get :方法传入下标,返回数组中指定下标的数据。 当前存储数据量 size : 获取当前存储的有效数据长度

动态扩容详解:无需真正增加原数组的容量,只用将原内容复制到新的大数组,然后让原数组名称重新等于大数组即可。由于原数组数据在堆中,失去引用会被 GC 自动回收。

解题思路

增加方法add时,题意很清晰要求动态扩容,所以得考虑两个问题:(1)竟然要创建新数组,那新数组最大容量是多少呢?——最大容量capacity (2)添加新的元素时,那它要放到新数组哪个位置呢?——实际数组长度size…

代码

MyList.java

public class MyList {
    
    
	//属性
	private Object[] element;//盛放元素的数组
	private int capacity;//容量
	private int size;//实际大小
	
	//构造方法
	public MyList() {
    
    
		size=0;//实际大小默认就是0
		capacity=4;//默认容量--可以自己定义
		element=new Object[capacity];//分配数组的空间--数组的空间一定开辟就不能改变大小
	}
	
	//方法
	/**
	 * 添加元素
	 * @param obj
	 */
	public void add(Object obj) {
    
    
		if(size>=capacity){
    
    //数组内容是否存满,满了之后需要扩容
			//动态扩容
			Object[] newArr=new Object[capacity*2];//新数组的大小可以自己决定,比原来大就可以
			//将原有数组的元素复制到新的数组中
			for (int i = 0; i < element.length; i++) {
    
    
				newArr[i]=element[i];
			}
			//让原数组名称重新等于新数组即可
			element=newArr;
		}
		element[size]=obj;//存放元素
		size++;//实际大小+1
	}
	
	/**
	 * 根据指定的对象删除
	 * @param obj
	 * @return
	 */
	public Object remove(Object obj) {
    
    
		//先判断该对象是否存在
		for (int i = 0; i < element.length; i++) {
    
    
			if(element[i]!=null && obj==element[i]) {
    
    
				return remove(i);
			}
		}
		return null;//该数组中没有要删除的对象
	}
	/**
	 * 根据下标删除
	 * @param index
	 * @return
	 */
	public Object remove(int index) {
    
    
		//如果是最后一个元素
		if(index==size-1) {
    
    
			size--;
			return element[index];//返回被删除的数值
		}
		//数组后续元素需前移
		Object obj=element[index];
		for(int i=index;i<size;i++) {
    
    
			element[i]=element[i+1];
		}
		size--;//删除成功之后实际大小要-1
		return obj;//返回被删除的数值
	}
	
	/**
	 * 查询方法
	 * @param index
	 * @return
	 */
	public Object get(int index) {
    
    
		return element[index];
	}
	
	public int getSize() {
    
    
		return size;
	}
}

MyListTest.java

public class MyListTest {
    
    
    public static void main(String[] args) {
    
    
        MyList list = new MyList();
        //添加元素
        for (int i = 0; i < 5; i++) {
    
    
            list.add("爱摸鱼的TT~"+i);
        }
        String s="爱摸鱼的TT~";
        String s1="爱摸鱼的TT";
        list.add(s);
        //删除元素
        Object obj=list.remove(s1);
        System.out.println("删除的元素:"+obj);
        //获取元素
        for (int i = 0; i < list.getSize(); i++) {
    
    
            System.out.println(list.get(i));
        }
    }
}

运行结果:
在这里插入图片描述

动态扩容

无需真正增加原数组的容量,只用将原内容复制到新的大数组,然后让原数组名称重新等于大数组即可。由于原数组数据在堆中,失去引用会被 GC 自动回收。

猜你喜欢

转载自blog.csdn.net/weixin_46312449/article/details/113101423
今日推荐