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泛型数组的主要内容,如果未能解决你的问题,请参考以下文章