测开笔记———利用多态抽象类接口设计List列表

该博客探讨了Java中抽象类和接口的概念,通过一个具体的例子展示了如何使用它们来定义动态数组和静态数组。动态数组(DynamicArray)实现了数组的动态扩容功能,而静态数组(FixedArray)则限制了数组容量,当数组满时会抛出异常。这两个类都继承自抽象类AbstractArray,该抽象类定义了数组的基本操作并提供了默认实现,但将特定策略(如扩容和缩容)留给子类实现。
摘要由CSDN通过智能技术生成

接口:抽象,描述数组的基本行为
抽象类:抽象,将固定的写在此,将无法确定的,给到子类
实现类:动态、静态

接口:

/**
 * 抽象,描述数组的基本行为
 * @param <E>
 */
public interface Array<E> {

    // -------------对数组的修改操作-------------

    E add(E element);

    E remove(E element);

    E updata(E element);

    //-------------对数组的属性操作-------------

    int getCapacity();

    int getSize();

    boolean isEmpty();

    boolean isFull();

    void printArr();

}

抽象类:

/**
 * 抽象,将固定的写在此,将无法确定的,给到子类
 * @param <E>
 */
public abstract class AbstractArray<E> implements Array<E> {

	// 默认数组大小
    protected static final int DEFAULT_CAPACITY = 10;

    protected int size;

    protected E[] arr;

    protected AbstractArray(int capacity){
        this.arr = (E[]) new Object[capacity];
    }

    /**
     * 子类负责处理满了之后的策略,父类中不清楚子类要怎么处理
     */
    protected abstract void handleFullyArray();

    @Override
    public E add(E element) {
        if (isFull()){
            // 这里如果满了,要做个处理,至于处理是什么,暂时不指定
            handleFullyArray();
        }

        int index = this.size++;

        this.arr[index] = element;

        return element;
    }


    @Override
    public E remove(E element) {
        if (isEmpty()){
            // 空
            throw new IllegalStateException("空了不能删");
        }

        for (int i = 0; i < this.size - 1; i++) {
            if (this.arr[i].equals(element)) {
                for (int j = i; j < this.size - 1; j++) {
                    this.arr[j] = this.arr[j + 1];
                }
            }
        }

        if(this.size-- < this.getCapacity() / 2){
            handleReduceArray();
        }
        return element;
    }

    //
    protected abstract void handleReduceArray();

    @Override
    public E updata(E element) {
        return null;
    }

    @Override
    public int getCapacity() {
        return this.arr.length;
    }

    @Override
    public int getSize() {
        return this.size;
    }

    @Override
    public boolean isEmpty() {
        return this.size == 0;
    }

    @Override
    public boolean isFull() {
        return this.size == this.arr.length;
    }

    @Override
    public void printArr() {
        for (E e : this.arr) {
            if (e != null){
                System.out.println(e);
            }
        }
    }
}

动态数组:

public class DynamicArray<E> extends AbstractArray<E>{

    private DynamicArray(){
        super(DEFAULT_CAPACITY);
    }

    private DynamicArray(int capacity){
        super(capacity);
    }

    public static <E> DynamicArray<E> of(){
        return new DynamicArray<>();
    }

    public static <E> DynamicArray<E> of(int capacity){
        return new DynamicArray<>(capacity);
    }
    
    @Override
    protected void handleFullyArray() {
        // TODO 这里的扩容是遍历,实际用System.arraycopy();效果更佳

       Integer newCapacity =  this.getCapacity() * 2;

        if(newCapacity >= 2048){
            throw new IllegalStateException("");
        }

        E[] buf = (E[]) new Object[this.getCapacity() * 2];

        for (int i = 0; i < this.size; i++) {
            buf[i] = this.arr[i];
        }

        this.arr = buf;
    }

    @Override
    protected void handleReduceArray() {
        Integer newCapacity = Math.max(DEFAULT_CAPACITY, this.getCapacity() / 2);

        E[] buf = (E[]) new Object[newCapacity];

        for (int i = 0; i < this.size; i++) {
            buf[i] = this.arr[i];
        }

        this.arr = buf;

    }
}

静态数组:

public class FixedArray<E> extends AbstractArray<E>{

    FixedArray(){
        super(DEFAULT_CAPACITY);
    }

    private FixedArray(int capacity){
        super(capacity);
    }

    public static <T> FixedArray<T> of(){
        return new FixedArray<>();
    }

    public static <T> FixedArray<T> of(int capacity){
        return new FixedArray<>(capacity);
    }

    @Override
    protected void handleFullyArray() {
        throw new IllegalStateException("数组满了");
    }

    @Override
    protected void handleReduceArray() {
        return;
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值