Java泛型数组

Posted mmい

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Java泛型数组相关的知识,希望对你有一定的参考价值。

  • 最近使用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;
    


以上是关于Java泛型数组的主要内容,如果未能解决你的问题,请参考以下文章

Java泛型详解

java创建泛型数组

Java 为什么不支持泛型数组?

java泛型的一些知识点:Java泛型--泛型应用--泛型接口泛型方法泛型数组泛型嵌套

java编程基础----泛型

Java中数组和泛型的类型规则