Java泛型数组

来源:互联网 发布:linux jar打包命令 编辑:程序博客网 时间:2024/06/06 20:50
  • 最近使用Java实现队列、栈这些基本的数据结构时,我分别采用了LinkedList列表和ResizeArray可变数来实现,先看看基本的API:
/* * 栈API: 抽象出基本的栈的操作 */public interface Stack<T> {    /*     * 出栈     */    public T pop();    /*     * 进栈     */    public void push(T item);    /*     * 判断栈是否为空     */    public boolean isEmpty();}
  • 使用链表结构实现栈数据结构:
/* * 使用链表实现Stack */public class StackLinkedList<T> implements Stack<T>{    /*     * 栈顶元素     */    private Node<T> first = null; //栈顶元素初始化为null    /*     * 私有类实现节点对象     */    @SuppressWarnings("hiding")    private class Node<T>{        T item;        Node<T> next;    }    @Override    public T pop() {        T item = first.item;         first = first.next;        return item;    }    @Override    public void push(T item) {        Node<T> oldfirst = first;        first = new Node<T>();        first.item = item;        first.next = oldfirst;          }    @Override    public boolean isEmpty() {        return first==null;    }}
  • 使用可变数组时出现了一些问题,首先需要考虑的是使用数组时扩容的问题,我分别采取的是:
    • 当数组满了时,将数组容量扩大一倍;
    • 当数组元素不足数组容量的1/4时将数组容量缩小一半
  • 另一个问题是无法初始化泛型数组,采取的方式是先创建一个Object[]数组,然后将其强制类型转换为T[],但实际上这种强制类型转换是很不友好的,但我不得不这么做(⊙o⊙)…
public class StackResizeArray<T> implements Stack<T>{    /*     * 使用数组存储栈中元素     */    private T[] array;    /*     * 栈顶元素的下一个位置     */    private int n;    /*     * 构造函数初始化数组容量为1     */    @SuppressWarnings("unchecked")    public StackResizeArray(){        array = (T[])new Object[1];  //数组不能直接初始化为泛型数组,必须像这样先申明为Object再强制类型转换        n = 0;    }    /*     * 改变数组容量     */    @SuppressWarnings("unchecked")    private void resize(int capacity) {        T[] newarray = (T[])new Object[capacity];        for(int i=0; i<n; i++){            newarray[i] = array[i];        }        array = newarray;    }    /*     * 出栈: 当数组元素不足1/4时将数组大小缩小一半     */    @Override    public T pop() {        T item = array[--n];        array[n] = null;  //手动释放出栈元素,便于垃圾回收        if(n>0 && n<array.length/4){             resize(array.length/2);        }        return item;    }    /*     * 入栈: 当数组满时将数组容量扩大一倍     */    @Override    public void push(T item) {        if(n==array.length){            resize(array.length*2);        }        array[n++] = item;    }    @Override    public boolean isEmpty() {        return n==0;    }}
原创粉丝点击