首先定义接口 List<E> ,以下是对每个方法的详细解释:

  • int size(): 返回列表中元素的数量。
  • boolean isEmpty(): 判断列表是否为空,如果为空则返回true,否则返回false。
  • boolean contains(Object o): 判断列表是否包含指定的元素,如果包含则返回true,否则返回false。
  • Object[] toArray(): 将列表转换为一个数组。
  • boolean add(E e): 将指定的元素添加到列表的末尾,并返回true。
  • boolean remove(Object o): 从列表中移除指定的元素,如果成功移除则返回true,否则返回false。
  • boolean containsAll(List<E> c): 判断列表是否包含另一个集合中的所有元素,如果是则返回true,否则返回false。
  • boolean addAll(List<? extends E> c): 将另一个集合中的所有元素添加到列表的末尾,如果成功添加则返回true。
  • boolean addAll(int index, List<? extends E> c): 在指定位置插入另一个集合中的所有元素。
  • boolean removeAll(List<?> c): 移除列表中与另一个集合相同的所有元素。
  • void clear(): 移除列表中的所有元素,使其为空。
  • E get(int index): 返回指定位置的元素。
  • E set(int index, E element): 将指定位置的元素替换为新的元素,并返回原来的元素。
  • void add(int index, E element): 在指定位置插入一个元素。
  • E remove(int index): 移除并返回指定位置的元素。
  • int indexOf(Object o): 返回指定元素在列表中第一次出现的位置索引,如果不存在则返回-1。

这个接口定义了列表常用的操作,实现这个接口的类需要提供对应的方法实现,例如ArrayList或LinkedList。

public interface List<E> {
    int size();
    boolean isEmpty();
    boolean contains(Object o);
    Object[] toArray();
    boolean add(E e);
    boolean remove(Object o);
    boolean containsAll(List<E> c);
    boolean addAll(List<? extends E> c);
    boolean addAll(int index, List<? extends E> c);
    boolean removeAll(List<?> c);
    void clear();
    E get(int index);
    E set(int index, E element);
    void add(int index, E element);
    E remove(int index);
    int indexOf(Object o);

}

接下来定义 TArrayList,它实现了之前提到的 List 接口。以下是对代码的详细解释:

  • TArrayList 类实现了 List 接口,并使用泛型来表示列表的元素类型。

  • 类中的成员变量:

    • value: 用于存储列表元素的数组,初始长度为零。
    • size: 当前列表中的元素个数。
    • length: 表示数组当前的长度,即最大容量。
    • DEFAULT_LENGTH: 默认的最大容量,设定为20。
private Object[] value = {};//长度为零的数组
private int size;//当下坐标,当前存储的元素个数
private int length;//表示数组当前的长度 最大容器
private static final int DEFAULT_LENGTH = 20;//默认最大容量

  • 构造方法 TArrayList(int initiallength)

    • 根据传入的 initiallength 初始化数组长度,但不允许小于等于零。
    • 如果 initiallength 小于等于默认容量(20),则使用默认容量初始化数组。
    • 否则,使用传入的 initiallength 初始化数组。
public TArrayList (int initiallength){
        if (initiallength <= 0){
            throw new IllegalArgumentException("initiallength 不能小于0");
        }
        if (initiallength <= 20){
            length = DEFAULT_LENGTH;
            value = new Object[length];
            size=0;
        }
        else{
            length = initiallength;
            value = new Object[length];
            size=0;
        }
    }
  • 方法实现:

size(): 返回当前列表中的元素个数。

public int size() {
        return size;
    }//元素个数

isEmpty(): 判断列表是否为空。

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

contains(Object o): 判断列表是否包含指定元素。

public boolean contains(Object o) {
        for (int i = 0; i < size; i++) {
            if (value[i].equals(o)) {
                return true;
            }
        }
        return false;
    }//是否包含指定元素

toArray(): 将列表转换为数组。

public Object[] toArray() {
        return Arrays.copyOf(value, size);
    }//列表转换为数组

add(Object o): 向列表末尾添加元素。

public boolean add(Object o) {
        if(size==length){
            int oldLength = length;
            int newLength = oldLength+(oldLength>>1);
            length = newLength;
            Object[] newValues = new Object[length];
            for (int i=0;i<oldLength;i++){
                newValues[i]=value[i];
            }
            value=newValues;
            System.out.println("扩容:" +length);
        }
        value[size++]=o;
        return true;
    }//向列表中添加元素

remove(Object o): 从列表中移除指定元素。

public boolean remove(Object o) {
        for (int i = 0; i < size; i++) {
            if (value[i]==o) {
                value[i]=null;;
                for( int x=i ;x<size;x++){
                    value[x]=value[x+1];
                }
            }
        }
        return true;
    }//从列表中移除指定的元素

containsAll(List c): 判断列表是否包含另一个集合中的所有元素。

public boolean containsAll(List c) {
        for (int i = 0; i < c.size(); i++) {
            Object element = c.get(i);
            boolean found = false;

            for (int j = 0; j < size; j++) {
                if (value[j] != null && value[j].equals(element)) {
                    found = true;
                    break;
                }
            }

            if (!found) {
                return false;
            }
        }
        return true;
    }

addAll(List c): 将另一个集合中的所有元素添加到列表末尾。

public boolean addAll(List c) {
        int elementsToAdd = c.size();
        if (size + elementsToAdd > DEFAULT_LENGTH) {
            // 如果需要,调整数组大小
            int newLength = Math.max(size + elementsToAdd, length * 2);
            value = Arrays.copyOf(value, newLength);
            length = newLength;
            System.out.println("扩容:"+length);
        }

        for (int i = 0; i < elementsToAdd; i++) {
            value[size + i] = c.get(i);
        }
        size += elementsToAdd;
        return true;
    }

addAll(int index, List c): 在指定位置插入另一个集合中的所有元素。

public boolean addAll(int index, List c) {
        if (index < 0 || index > size) {
            throw new ArrayIndexOutOfBoundsException("Index is out of bounds. Index: " + index + ", Size: " + size);
        }

        int newSize = size + c.size();

        // Ensure capacity
        if (newSize > length) {
            int newCapacity = Math.max(length * 2, newSize);
            value = Arrays.copyOf(value, newCapacity);
            length = newCapacity;
        }

        // Shift elements to make space for new elements
        for (int i = size - 1; i >= index; i--) {
            value[i + c.size()] = value[i];
        }

        // Insert elements from the given list at the specified index
        for (int i = 0; i < c.size(); i++) {
            value[index + i] = c.get(i);
        }

        size = newSize;
        return true;
    }

clear(): 移除列表中的所有元素。

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

get(int index): 获取指定位置的元素。

public Object get(int index) {
        if(index>=0&&index<size){
            return value[index];
        }else{
            throw new ArrayIndexOutOfBoundsException("index 超过了范围 max:"+(size-1));
        }
    }

set(int index, Object element): 替换指定位置的元素。

public Object set(int index, Object element) {
        value[index]=element;
        return value[index];
    }

add(int index, Object element): 在指定位置插入一个元素。

public void add(int index, Object element) {
        for(int i=size;i>index;i--){
            value[i]=value[i-1];
        }
        value[index]=element;
    }

remove(int index): 移除指定位置的元素。

public Object remove(int index) {
        if(index<0||index>size-1){
            throw new ArrayIndexOutOfBoundsException("index 超过了范围 max:"+(size-1));
        }else{
            value[index]=null;
            for(int i=index;i<size;i++){
                value[i]=value[i+1];
            }
        }
        return null;
    }

indexOf(Object o): 获取第一个匹配元素的索引。

public int indexOf(Object o) {
        for(int i=0;i<size;i++){
            if(value[i]==o){
                return i;
            }
        }
        return -1;//没找到返回-1
    }//获取第一个元素出现的下标

removeAll(List c): 移除列表中与另一个集合相同的所有元素。

public boolean removeAll(List c) {
        for (int i=0;i<c.size();i++) {
            Object element = c.get(i);
            for(int j =0;j<size;j++){
                if(value[j]==element){
                    value[j]=null;
                    for(int x=j;x<size;x++){
                        value[x]=value[x+1];
                    }
                }
            }
        }
        return false;
    }
  • main 方法:

    • 创建 TArrayList 对象并进行一系列操作的演示,对实现的方法进行测试,包括添加、移除、查询等。
public static void main(String[] args) {
        TArrayList myList = new TArrayList(20);
        for(int i=1;i<=10;i++){
            myList.add(i);
        }
        for(int i=0;i<20;i++){
            System.out.println(myList.value[i]);
        }


        //Object[] array = myList.toArray();
        //for (Object element : array) {
            //System.out.print(element + " ");
        //}


        //System.out.println(myList.size);

        //System.out.println(myList.isEmpty());

        //System.out.println(myList.contains(5));
        //System.out.println(myList.contains(11));

        //System.out.println(myList.get(9));

        //System.out.println(myList.set(9,11));

        //myList.add(10,11);
        //for(int i=0;i<20;i++){
            //System.out.println(myList.value[i]);
        //}

        //myList.remove(9);
        //for(int i=0;i<20;i++){
            //System.out.println(myList.value[i]);
        //}

        //System.out.println(myList.indexOf(5));

        //myList.remove((Integer)5);
        //for(int i=0;i<20;i++){
            //System.out.println(myList.value[i]);
        //}

        //myList.clear();
        //for(int i=0;i<20;i++){
            //System.out.println(myList.value[i]);
        //}


        TArrayList List1 = new TArrayList(3);
        for(int i=1;i<=3;i++){
            List1.add(i);
        }
        for(int i=0;i<3;i++){
            //System.out.println(List1.value[i]);
        }
        TArrayList List2 = new TArrayList(3);
        for(int i=11;i<=13;i++){
            List2.add(i);
        }

        //System.out.println(myList.containsAll(List1));
        //System.out.println(myList.containsAll(List2));

        //myList.addAll(List2);
        //for(int i=0;i<20;i++){
            //System.out.println(myList.value[i]);
        //}

        //myList.addAll(0,List2);
        //for(int i=0;i<20;i++){
            //System.out.println(myList.value[i]);
        //}

        //myList.removeAll(List1);
        //for(int i=0;i<20;i++){
            //System.out.println(myList.value[i]);
        //}

    }

数组是一种常见的数据结构,具有以下特点:

  • 连续的内存空间: 数组中的元素在内存中是连续存储的,这使得对数组的随机访问和遍历操作非常高效。

  • 相同数据类型: 数组中的元素必须是相同的数据类型,这是因为数组是一个固定大小的结构,每个元素占据相同的内存空间。

  • 固定大小: 数组的大小是固定的,一旦创建,其大小通常不能动态改变。

  • 随机访问: 由于元素的连续存储,可以通过索引直接访问数组中的任何元素,使得随机访问变得非常高效。

常见的数组操作包括:

  • 访问元素: 通过索引可以快速访问数组中的任何元素。

  • 插入元素: 在数组中插入元素可能需要将后续元素向后移动,这可能是一个耗时的操作。

  • 删除元素: 删除数组中的元素同样可能需要将后续元素向前移动,同样可能是一个耗时的操作。

  • 遍历: 遍历数组中的所有元素,执行特定的操作。

  • 查找元素: 在数组中查找特定元素,可以使用线性查找或者二分查找等算法。

  • 更新元素: 修改数组中特定位置的元素值。

需要注意的是,由于数组的固定大小,插入和删除元素可能涉及到移动大量元素的操作,因此在这些操作频繁进行的情况下,可能会考虑使用其他数据结构,如链表或动态数组。

更多推荐