java动态数组详解

KLQ 2020-08-12 15:16:06 java常见问答 3705

其实之前对于java动态数组的内容也有过一些介绍,但是还是有小伙伴不清楚,下面就又特地的整理了一些内容来做讲解,具体表现形式为代码,希望大家可以对它有更近一步的了解。

package generics;
import java.util.Arrays;
// 泛型类 -> 动态数组
public class DynamicArray < E >
{
    // field 
    private static final int DEFAULT_CAPACITY = 10;
    private int size;
    private Object[] elementData;
    // constructor 构造函数
    public DynamicArray()
    {
        this.elementData = new Object[DEFAULT_CAPACITY];
    }
    // method 
    // 确保数组有足够的长度
    private void ensureCapacity(int minCapacity)
    {
        int oldCapacity = elementData.length;
        if (oldCapacity >= minCapacity)
        {
            return;
        }
        int newCapacity = oldCapacity * 2;
        if (newCapacity < minCapacity)
        {
            newCapacity = minCapacity;
        }
        elementData = Arrays.copyOf(elementData, newCapacity);
    }
    // 添加元素
    public void add(E e)
    {
        ensureCapacity(size + 1);
        elementData[size++] = e;
    }
    // 搜索索引
    public E get(int index)
    {
        return (E) elementData[index];
    }
    // 返回大小
    public int size()
    {
        return size;
    }
    // 设置元素
    public E set(int index, E element)
    {
        E oldValue = get(index);
        elementData[index] = element;
        return oldValue;
    }
    // 泛型方法
    // 类型参数为T,放在返回类型前面
    public static < T > int indexOf(T[] arr, T elm)
    {
        for (int i = 0; i < arr.length; i++)
        {
            if (arr[i].equals(elm))
            {
                return i;
            }
        }
        return -1;
    }
    // 通配符 ?
    // <? extends E> -> 有限通配符,匹配E或E的某个子类型,用于实例化类型参数,未知具体类型
    public void addAllWailcard(DynamicArray < ? extends E > c)
    {
        for (int i = 0; i < c.size; i++)
        {
            add(c.get(i));
        }
    }
    // <T extends E> -> 用于定义类型参数,声明一个类型参数T,可放在泛型类定义中类名的后面、泛型方法返回值前面
    public < T extends E > void addAll(DynamicArray < T > c)
    {
        for (int i = 0; i < c.size; i++)
        {
            add(c.get(i));
        }
    }
    // <? super E> -> 超类型通配符,可以更灵活地写入
    public void copyTo(DynamicArray < ? super E > dest)
    {
        for (int i = 0; i < size; i++)
        {
            dest.add(get(i));
        }
    }
    @Override
    public String toString()
    {
        return Arrays.toString(elementData);
    }
    // __main__
    public static void main(String[] args)
    {
        DynamicArray < String > da = new DynamicArray < String > ();
        da.add("Hello");
        da.add("Hola");
        da.add("你好");
        System.out.println(da.get(2));
        System.out.println(da.size());
        System.out.println(da.set(1, "konnichiwa"));
        System.out.println(da.get(1));
        System.out.println(indexOf(new Integer[]
        {
            1
            , 3
            , 4
        }, 1));
        System.out.println(indexOf(new String[]
        {
            "Hello"
            , "Hola"
            , "你好"
        }, "hola"));
        System.out.println(indexOf(da.elementData, "你好"));
        System.out.println(da.toString());
        DynamicArray added = new DynamicArray();
        added.add("Hola");
        added.add("Aniaseyou");
        da.addAllWailcard(added);
        System.out.println(da.toString());
        da.addAll(added);
        System.out.println(da.toString());
        DynamicArray < Integer > ints = new DynamicArray < Integer > ();
        ints.add(100);
        ints.add(34);
        DynamicArray < Number > nums = new DynamicArray < Number > ();
        ints.copyTo(nums);
        System.out.println(ints.toString());
        System.out.println(nums);
    }
}

通过以上的代码你对于java动态数组了解的如何了呢?上面的代码还是讲解的很清楚的。更多java从入门到精通知识,请多多关注奇Q工具网来进行了解。

推荐阅读:

java动态数组定义该怎么创建?java定义一个动态数组

java动态数组怎么赋值? java动态赋值的相关问题

java动态数组实现要怎么编写?具体概念是什么?