看起来他们都以同样的方式做同样的事情:以特定但不一定索引的顺序进行懒惰操作,并且不一定会回溯。
答案 0 :(得分:2)
链表是表示内存中数据元素序列的一种特定方式,其中每个元素与一个指向序列中下一个元素的指针配对。链接列表允许您对其子序列执行一系列操作:您可以剪切或插入整个元素链,或以非常低的成本从中间删除元素。
另一方面,Streams是按顺序访问数据的抽象,对它们在内存中的表示没有任何特定要求。您可以使用链接列表来实现流,但您也可以使用其他数据结构,例如普通数组或循环数组缓冲区。答案 1 :(得分:1)
我认为这有点像尝试比较苹果和橘子。
链表是一种数据结构,其中每个节点都指向另一个节点。它们是一个有用的结构,因为从链表中插入和删除项只是重新指向一个节点的问题,而不是一个你需要进行更多改组的数组。有关详细信息,请参阅http://en.wikipedia.org/wiki/Linked_list。
流是用于表示一系列字节的抽象对象。在大多数框架(Java,.NET等)中,有几种用于从相关源(内存,文件等)读取字节数组的流的具体实现(内存流,文件流等)。
答案 2 :(得分:1)
链表是一种数据结构,其中每个元素都有一个指向下一个元素的指针,并且可能在另一个方向上相同。圆形链表甚至有一个从最后一个到第一个元素的指针,反之亦然。那些指针(或没有指针的语言中的引用)是定义数据结构的东西。他们暗示某种操作方式,但他们并没有强制这样做。例如,Java中的LinkedList
类可以像数组一样使用,尽管它不会非常有效。它也可以用作(双端)队列或堆栈,具体取决于您调用的函数。
另一方面,流不是定义为数据结构,而是定义为元素的源或接收器。如果您考虑包装流的文件流,套接字流或读取器/写入器类,这些元素可以是字节或字符。流提供的元素也可能更复杂,例如解析器的标记。在这种情况下,流可能在内部使用某种类型的队列,这可以使用链表或某些数组结构来实现。
请确保理解这两个事物是在不同的抽象层上定义的。链接列表是根据内部工作方式定义的,而流则是根据外部工作方式定义的。
答案 3 :(得分:0)
只读单链表和输入流之间有一个共同的抽象,C ++正式化为InputIterator
:你可以读取一个值,然后你可以向前移动。在许多流API中,您必须同时执行这两个API,但是考虑到API,很容易看到如何使用缓存一个值的包装器将它们分离出来:C ++调用此类istream_iterator
。
但是,单链接列表具有流并不总是具有的属性,C ++正式化为ForwardIterator
:您可以复制当前位置,向前移动副本,但仍然读取原始位置的值。通用流不能这样做,因为底层I / O只有一个“当前位置”。使用链表,您可以有多个指向列表中不同节点的指针,没有任何问题。
某些流可以被标记和重置,重绕,搜索(寻找?)等,添加有点像C ++ ForwardIterator甚至RandomAccessIterator的设施。
我使用C ++作为示例并不是因为它特别重要,而是因为迭代器的C ++概念部分地设计为提供数据结构和流通用的抽象。并非所有语言都具有这样的通用抽象,但是对于Python中的另一个示例,如果for x in y:
是容器数据结构,或者y
是类文件对象,则可以编写y
,或者一般如果y
是“可迭代的”。