泛型可以参数化变量的类型

当你需要用不同类型的基本类型变量来调用构造方法时你需要泛型

public class Test {public static void main(String[] args) {A a=new A("a");System.out.println(a.e);A a1=new A(10);System.out.println(a1.e);}
}
class A<E>{E e;public A(E e){this.e=e;}public E getE(){return e;}}

输出结果:

a
10

如果不满意 你可以使用两个泛型 你甚至可以使用一个数组或者自定义的类

/*** Created by root on 16-2-23.*/
public class Test {public static void main(String[] args) {A a=new A("a");System.out.println(a.e);a.setT(new int[]{1,2,3});//你可以在这里赋给t一个数组或者以个自定义类A a1=new A();a1.setT(new B());//赋给a2的成员t一个B类对象}
}
class A<E,T>{E e;T t;public A(){}public A(E e){this.e=e;}public E getE(){return e;}public void setT(T t){this.t=t;}public T getT(){return t;}}
class B{int b=10;
}

debug结果

有时你需要对泛型作出一些约束以免发生错误溢出

public class Test {public static void main(String[] args) {A<String,String> a=new A();//对泛型作出一些约束 让它只能接受String类型A a2=new A<String,String>();//同样的约束 但是要约束的参数要紧跟类名a.setT("a");//正确的方法//a.setT(10); 出现报错}
}
class A<E,T>{E e;T t;public A(){}public A(E e){this.e=e;}public E getE(){return e;}public void setT(T t){this.t=t;}public T getT(){return t;}}
class B{int b=10;
}

虽然java不能直接声明泛型数组 但是可以利用泛型自己写一个泛型数组类

public class ArrayType<T> {private int index;private int length;T[] data;private T el;public ArrayType(int length){//根据长度初始化数组this.length=length;data=(T[])(new Object[length]);}public void setEl(int thatIndex,Object el){//根据索引赋值 变量的类型可以使任意的if(thatIndex<length){data[thatIndex]=(T)el;}}public T getEl(int thatIndex){//根据索引获取元素的值if(thatIndex<length){return data[thatIndex];}else {return data[0];}}
}

test class

public class Test {public static void main(String[] args){ArrayType a=new ArrayType(3);a.setEl(0,23);a.setEl(1,"dd");a.setEl(2,true);}
}

debug结果:

加入一些变长的功能

public class ArrayType<T> {private int index;private int length;T[] data;private T el;public ArrayType(int length){this.length=length;data=(T[])(new Object[length]);}public void setEl(int thatIndex,Object el){if(thatIndex<length){data[thatIndex]=(T)el;}else {stretch(thatIndex+1);//如果数组越界 执行复制data[thatIndex]=(T)el;}}public T getEl(int thatIndex){if(thatIndex<length){return data[thatIndex];}else {stretch(thatIndex+1);//如果数组越界 执行赋值 并返回nullreturn data[thatIndex];}}protected void stretch(int thatLength){T[] newdata=(T[])(new Object[thatLength]);//定义一个thatLength的数组for(int i=0;i<this.length;i++){  //把data内所有元素复制到data里newdata[i]=data[i];  //}data=newdata;}
}

有了以上基础 可以实现一个简单的数组栈

public interface Stack<E> {public boolean isEmpty();public E peek();public E pop();public void push(E target);
}
import java.util.EmptyStackException;
import java.util.Objects;/*** Created by root on 16-2-24.*/
public class ArrayStack<E> implements Stack {//实现栈的interfaceprivate E[] data;  //可以获得数组长度private int size;  //用于判断栈顶的索引public ArrayStack(){data=(E[])(new Object[1]);//初始化的栈具有一个null类型 size的值为0 size-1是栈顶的索引size=0;                          }public boolean isEmpty(){return size==0;          //判断栈是否为空 }public Object pop(){if (isEmpty()){throw new EmptyStackException();//如果栈为空 那就报错}size--;            //如果栈不为空 return data[size];  //弹出栈顶}public Object peek(){if(isEmpty()){throw new EmptyStackException();//如果栈为空 报错}return data[size-1];//返回栈顶}protected boolean isFull(){//栈满了?return size ==data.length;}public void push(Object target){if (isFull()){//如果栈满了 执行扩栈stretch();}data[size]= (E) target;//如果栈没有满 把target压入栈顶size++;}protected void stretch(){//将原数组的长度扩大两倍 扩大栈的长度E[] newData=(E[])(new Object[data.length*2]);for(int i=0;i<data.length;i++){newData[i]=data[i];}data=newData;}
}

转载于:https://www.cnblogs.com/Salaku/p/5208728.html

Java数据结构-基于数组的栈和泛型相关推荐

  1. java中基于数组的栈实现

    在java中利用数组来实现栈以及相关操作. 首先我们要新建一个类,该类中new一个固定大小的数组,来充当我们的栈,来容纳入栈的数据. 在该类中我们可以对栈进行出栈入栈,扩容,和获取栈顶元素等操作.在该 ...

  2. Java数据结构与算法:栈

    原文出处:http://www.cnblogs.com/skywang12345/p/3562239.html 注意:本文所说的栈是数据结构中的栈,而不是内存模型中栈 1. 栈的介绍 栈(stack) ...

  3. java数据结构之数组

    数据结构对我们的程序员也是非常重要的,相当于一个基础学科,从今天开始,咱们再重新学习一下数据结构吧 1,首先我们要定义一下泛型,初始化成员变量,声明构造方法. private T data[];pri ...

  4. 类模板实现基于数组的栈

    一.学习要点: 1.类模板和模板类的区别,模板类这里的模板可以看成一个动词,对抽象类的一个实例化: 2.函数模板的声明和定义: 3.基于数组栈的实现,进栈和出栈的差别,进栈[++top],出栈[top ...

  5. 数据结构之数组模拟栈

    栈的特点即先进后出,采用数组模拟栈,实现栈的这一特性主要是靠定义一个指针(索引). 指针的初始位置指向的是-1 以下给出代码: package com.ebiz.stack;/*** @author ...

  6. java:数据结构(二)栈的应用(进制转换全收集)

    说到进制转换,java已经封装了基本的方法,在竞赛中使用封装的方法自然能节省大量时间 另一位仁兄介绍的封装好的方法: https://blog.csdn.net/m0_37961948/article ...

  7. java分隔符算法_《Java数据结构和算法》栈 分隔符分配

    分隔符包括"{"."["."("."] ".")"."}",每个左分隔符需要右分 ...

  8. Java练习 基于数组的敏感词过滤/用户注册合法性判定

    用户注册 在注册时通常要验证用户名和密码是否合法,运用学习过的知识完成如下操作: 用户名长度大于等于6位 密码长度大于等于8位,必须包含英文字母以及数字 以上两个条件同时成立注册才能成功. packa ...

  9. JAVA数据结构-稀疏数组

    稀疏数组 什么是稀疏数组? 假设有这样的一个二维数组 shape是11x11,但是很多数据都是0,比较浪费空间,我们可以通过一些方法来压缩这个数组,稀疏数组就是一种压缩数组的方法,通过稀疏数组变换后, ...

最新文章

  1. 继往开来!目标检测二十年技术综述
  2. egg 自学入门demo分享
  3. 5加载stm32 keil_快速入门STM32单片机-软件篇
  4. Java8新特性之函数式接口
  5. Kali-linux安装之后的简单设置
  6. 如何为ASP.NET Core设置客户端IP白名单验证
  7. 增加数据_咱晋城人口又增加了?最新数据来了
  8. spoj839 Optimal Marks(最小割,dinic)
  9. Jest 只MOCK模块中的某个功能实现
  10. nslookup 使用说明
  11. 让人头皮发麻的KMP的next函数 困扰我三四天后终于解决了
  12. LayUI清空下拉框的值
  13. 怎么选择boost升压电路的电感?只要三个公式
  14. element-ui 导航栏三级
  15. SpringBoot调优
  16. 站长咪咪网整理的Linux命令大全
  17. 论文阅读笔记:An End-to-End Trainable Neural Network Model with Belief Tracking for Task-Oriented Dialog
  18. PC机上常用 EDA 软件
  19. 声纹技术(七):声纹技术的未来
  20. SUT计算机测试,调试功能测试(徽标) | Microsoft Docs

热门文章

  1. 在CentOS Linux上安装oracle11g之二 安装oracle11g
  2. BMI指数与体重的关系
  3. flink写入iceberg(没有搞完)
  4. 集群状态正常时需要的jps进程+是否需要部署到各个节点(持续更新中)
  5. django-oscar的默认地点打开后总是united kingdom
  6. 医学图像-颅内出血(转载+整理)
  7. 3.2 参数估计:极大似然估计方法 ML
  8. oracle xml文件是什么文件,介绍关于Oracle下存取XML格式数据的方式
  9. C/C++编程心得(二)
  10. mysql导出数据到本地_mysql怎么导出数据到本地文件