Java 通用堆栈(破解代码访问)
在“破解编码”访谈中,我在理解堆栈类的实现时遇到了一些问题(对于那些有这本书的人来说,这是第3章“堆栈和队列”的第一页) 代码如下所示:Java 通用堆栈(破解代码访问),java,class,stack,generic-programming,Java,Class,Stack,Generic Programming,在“破解编码”访谈中,我在理解堆栈类的实现时遇到了一些问题(对于那些有这本书的人来说,这是第3章“堆栈和队列”的第一页) 代码如下所示: public class MyStack<T>{ private static class StackNode<T>{ private T data; private StackNode<T> next; public StackNode(T data){ thid.data = da
public class MyStack<T>{
private static class StackNode<T>{
private T data;
private StackNode<T> next;
public StackNode(T data){
thid.data = data;
}
}
private StackNode<T> top;
// and so on
}
对我来说,MyStack
意味着我正在创建一个由另一个对象T
构成的对象MyStack
,这没有任何意义。如果堆栈由节点组成,那么我的类型T
应该是StackNode
(?)类型。但是,当我定义Stacknode
时,它就像说Stacknode
。我想我对泛型类型造成了很大的混淆,但重点是我不明白为什么像我在代码中那样做是不够的:不管它是什么类型的堆栈,它都是由节点组成的,当然可以有泛型数据,所以我刚才说我节点的数据是Object
类型的,有人能解释一下主要的区别吗,或者至少解释一下为什么“破解编码面试”是这样做的?有什么好处?我理解错了什么?
提前谢谢你 此处的
的目的是指定要存储在堆栈中的元素的类型。这里T
是一种模板,在声明时可以用任何类型替换
例如,如果希望创建字符串堆栈,可以将其声明为
Stack<String> myStack;
Stack myStack;
这将确保内部类
节点
也将字符串
用作数据
的数据类型。您只需在声明堆栈期间指定类型,就可以了。这样,当您需要一个Integer
s的堆栈时,您就不必再编写Stack
类了。如果您使用对象而不是泛型,那么您就没有类型安全性,因为您总是必须强制转换取出的对象。在泛型示例中,t
是数据的类型,不是节点本身。反问:那么什么时候使用泛型参数?正如@csmckelvey指出的:泛型参数在编译时为您提供(某种)类型安全性。这意味着使用并不意味着我的堆栈是由T(对象T)组成的?例如,当我们初始化向量时,我们使用向量向量,其中字符串是向量中包含的类型,所以我的向量将由字符串组成。在本例中,MyStack由节点组成,但节点包含T。那么,我们什么时候思考一种方式,什么时候思考另一种方式?@GruppoAsek当你看一看,你会发现他们使用了相同的概念。对于ArrayList
,您已经拥有了数组形式的底层数据结构。但是,对于链接列表
,仍然需要数据结构,即链接节点。这就是为什么您使用内部类节点
,它包装每个值。当您声明堆栈myStack
时,它将自动确保节点
s将包含字符串
s。要获得它,请替换类堆栈中的所有T
s,并移除
s,然后查看它是如何运行的。向量
不是“由字符串组成的”。它是一个包含字符串的结构。而堆栈
将是包含字符串的堆栈。@GruppoAsek在这个实现中,堆栈
是节点的链接列表。每个节点都包含一个T
类型的元素。是的,你可以这样想:这就像指定元素的数据类型作为参数,这样我们就可以使用相同的代码来创建任何类型的元素堆栈。
Stack<String> myStack;