爪哇国新游记之十五----泛型动态数组类

简介:
复制代码
import java.lang.reflect.Array;

/**
 * 泛型动态数组类
 *
 */
public class DynamicArray<T extends Object>{
    private T[] arr;
    private Class<T> type;    
    private int currCount;
    private static final int InitSize=2;
    
    public DynamicArray(Class<T> type){
        this.type = type;
        arr=createArray(InitSize);
    }
    
    /**
     * 在java中,不能通过直接通过T[] tarr=new T[10]的方式来创建数组,最简单的方式便是通过Array.newInstance(Class<t>type,int size)的方式来创建数组
     * 详情请参考http://developer.51cto.com/art/201202/317813.htm
     * @param size
     * @return
     */
    @SuppressWarnings("unchecked")    
    private T[] createArray(int size) {    
        return (T[]) Array.newInstance(type, size);    
    }
    
    public void add(T number){
        if(currCount>=arr.length){
            // 实际数量已经超过数组长度,需要扩容
            T[] arrNew=createArray(arr.length*2);// 扩容
            
            // 填充原值
            for(int j=0;j<arr.length;j++){
                arrNew[j]=arr[j];
            }
            
            // 原有数组空间放弃,arr指向新创建的数组空间(创建在堆中)
            arr=arrNew;
            
            arr[currCount]=number;
            currCount++;
        }else{
            // 无需扩容
            arr[currCount]=number;
            currCount++;
        }
    }
    
    public void display(){
        System.out.print("动态数组合法元素为:");
        for(int i=0;i<currCount;i++){
            System.out.print(arr[i]+",");
        }
        System.out.println();
    }
    
    public void displayAll(){
        System.out.print("动态数组所有元素为:");
        for(int i=0;i<arr.length;i++){
            System.out.print(arr[i]+",");
        }
        System.out.println();
    }
    
    public T[] getArray(){
        T[] arrOutput=createArray(currCount);
        
        for(int i=0;i<currCount;i++){
            arrOutput[i]=arr[i];
        }
        
        return arrOutput;
    }
    
    public T get(int index){
        return arr[index];
    }
    
    public static void main(String[] args){
        DynamicArray<Integer> d=new DynamicArray<Integer>(Integer.class);
        d.add(1);
        d.add(2);
        d.add(3);
        d.add(4);
        d.add(5);
        d.add(6);
        d.add(7);
        d.add(8);
        d.add(9);
        d.display();
        d.displayAll();
        
        Integer[] arrOutput=d.getArray();
        System.out.print("arrOutput:");
        for(int i=0;i<arrOutput.length;i++){
            System.out.print(arrOutput[i]+",");
        }
        System.out.println();
        
        System.out.println("第8号元素为"+d.get(8));
        
        DynamicArray<String> d2=new DynamicArray<String>(String.class);
        d2.add("红尘多可笑");
        d2.add("痴情最无聊");
        d2.add("目空一切也好");
        d2.add("此生未了");
        d2.add("心却已无所扰");
        d2.add("只想换得半世逍遥");
        d2.add("醒时对人笑");
        d2.add("梦中全忘掉");
        d2.add("叹天黑得太早");
        d2.add("来生难料");
        d2.add("爱恨一笔勾销");
        d2.add("对酒当歌 我只愿开心到老");
        d2.add("风再冷 不想逃");
        d2.add("花再美也不想要");
        d2.add("任我飘摇");
        d2.add("天越高 心越小");
        d2.add("不问因果有多少");
        d2.add("独自醉倒");
        d2.add("今天哭 明天笑");
        d2.add("不求有人能明了");
        d2.add("一身骄傲");
        d2.add("歌在唱 舞在跳");
        d2.add("长夜漫漫不觉晓");
        d2.add("将快乐寻找");
        d2.add("PS:笑红尘就是人生真谛的体现,也是应对生活应该采取的态度。学会洒脱得微笑,生活中就不会有过不去的坎坷。");
        d2.display();
        d2.displayAll();
    }
}
复制代码

输出:

复制代码
动态数组合法元素为:1,2,3,4,5,6,7,8,9,
动态数组所有元素为:1,2,3,4,5,6,7,8,9,null,null,null,null,null,null,null,
arrOutput:1,2,3,4,5,6,7,8,9,
第8号元素为9
动态数组合法元素为:红尘多可笑,痴情最无聊,目空一切也好,此生未了,心却已无所扰,只想换得半世逍遥,醒时对人笑,梦中全忘掉,叹天黑得太早,来生难料,爱恨一笔勾销,对酒当歌 我只愿开心到老,风再冷 不想逃,花再美也不想要,任我飘摇,天越高 心越小,不问因果有多少,独自醉倒,今天哭 明天笑,不求有人能明了,一身骄傲,歌在唱 舞在跳,长夜漫漫不觉晓,将快乐寻找,PS:笑红尘就是人生真谛的体现,也是应对生活应该采取的态度。学会洒脱得微笑,生活中就不会有过不去的坎坷。,
动态数组所有元素为:红尘多可笑,痴情最无聊,目空一切也好,此生未了,心却已无所扰,只想换得半世逍遥,醒时对人笑,梦中全忘掉,叹天黑得太早,来生难料,爱恨一笔勾销,对酒当歌 我只愿开心到老,风再冷 不想逃,花再美也不想要,任我飘摇,天越高 心越小,不问因果有多少,独自醉倒,今天哭 明天笑,不求有人能明了,一身骄傲,歌在唱 舞在跳,长夜漫漫不觉晓,将快乐寻找,PS:笑红尘就是人生真谛的体现,也是应对生活应该采取的态度。学会洒脱得微笑,生活中就不会有过不去的坎坷。,null,null,null,null,null,null,null,
复制代码











相关文章
|
2月前
|
C++
【C++练级之路】【Lv.8】【STL】list类的模拟实现
【C++练级之路】【Lv.8】【STL】list类的模拟实现
|
2月前
|
存储 编译器 C语言
【C++初阶】第二站:类与对象(上) -- 上部分
【C++初阶】第二站:类与对象(上) -- 上部分
|
2月前
|
存储 编译器 C语言
【C++初阶】第二站:类与对象(上) -- 下部分
【C++初阶】第二站:类与对象(上) -- 下部分
|
小程序 数据安全/隐私保护 C语言
爱上c++的第九天-聊一聊类和对象的特性
总结如下:1.基于过程的程序设计:由一个个函数组成,每个函数都是独立的,一个函数对应一个操作,适合小程序开发。讲究每一步都要详细的写出,写出来,问题也就解决了。
47 0
爱上c++的第九天-聊一聊类和对象的特性
|
算法 Java 索引
不会用的Java数组,从青铜到王者,全解析数组,建议收藏!!!
先声明后使用 数据类型 [] 数组名称 = new 数据类型[长度];String[] arr3 = new String[5]; 数据类型 数组名称[] = new 数据类型[长度];String arr[] = new String[5];
89 0
不会用的Java数组,从青铜到王者,全解析数组,建议收藏!!!