实际开发中,存在很多很多使用大量数据的情况,如果使用单一变量来处理数据是很不科学的,操作极为繁琐,且不具有通用性,这显然不是程序员应该做出的事情。

于是就出现了数组,虽然数组让操作存在了一定的通用性,方便程度也远远高于单一变量的操作,但是数组操作通常都是需要程序员自己定义完成一大堆方法,并且数据类型的单一性,数组容量的确定性,都限制了数组的便捷程度。


数据结构之可变长数组(一)

为了更好的操作数据,就出现了一种数据结构【可变长数组】。Java中的代表之作,就是ArrayList。

接下来的时间里,我们会使用Java来完成一个自定义的ArrayList,也可以让大家更好的学习和使用ArrayLst。

首先我们先要解决的问题是数据类型的单一性

因为数组在创建的时候,需要确定数据类型。但是实际开发中,数据类型可以说是千变万化的。单一的类型只能满足一种情况,不能满足其他情况。如果在实际使用中,每一次都要因为数据类型的问题,重新定义数组,而且要修改与之匹配的方法,这显然是非常麻烦的。

所以,这里就需要使用到Java中的一种方式 【泛型】来解决。那么首先我们来说【泛型】到底是什么。

泛型,按照我自己的总结,就是解决数据类型一致化,并且可以让代码灵活程度更好的一种方式。有同学就会想到一个问题,解决数据类型一致化???等等,这不还是数据类型单一吗?No No No 此一致,非彼单一。

上代码!!!

package com.qfedu.genericity;

class TestType<T> {
    public T test(T t) {
        return t;
    }
}

public class Demo1 {
    public static void main(String[] args) {
        test(10);
        test(3.15);
        
        TestType<String> tt = new TestType<String>();
        tt.test("213");
    }
    
    /**
     * 自定义泛型无意义占位符 T
     * @param t
     * @return
     */
    public static <T> T test(T t) {
        return t;
    }
}

可变长如何来完成(二)

数组在创建的时候,就已经确定了数组的容量,并且该容量是无法改变的。既然原数组的容量是不可以改变的,我们就创建新数组跟你们玩一玩~~~~

上代码~~~

package com.qfedu.newarray;

class TestArray {
    Object[] array = new Object[10];
    /*
     这里需要考虑一个数组的扩容方案
     */
    public void grow() {
        // 原数组的容量
        int oldCapacity = array.length;
        
        // 新数组容量
        int newCapacity = oldCapacity + oldCapacity / 2;
        
        Object[] newArr = new Object[newCapacity];
        
        // 数据的拷贝
        for (int i = 0; i < oldCapacity; i++) {
            newArr[i] = this.array[i];
        }
        
        this.array = newArr;
    }
}

public class Demo1 {
    public static void main(String[] args) {
        TestArray ta = new TestArray();
        
        System.out.println(ta.array.length);
        
        ta.grow();
        
        System.out.println(ta.array.length);
    }
}