Java的集合、接口和类层次结构做得不好吗?
- 回答 (2)
- 关注 (0)
- 查看 (59)
我开始知道在Java中,
LinkedList
类实现了两者
Deque
和
List
接口。这对我来说有点混乱。
在计算机科学教学大纲中,我从未被教导过队列可以是一个列表,或者更确切地说,队列可以像列表一样。也就是说,列表可以做的东西,但队列不能。但是列表可以像队列一样运行。例如,
List
interface具有
以下方法
:
add(E e) add(int index, E element)
但
Queue
只有以下内容
:
add(E e)
所以很明显
Queue
不允许在特定索引处插入,这是允许的
List
。其他操作的情况也是如此,例如
Queue.remove()
vs.
List.remove(int index)
,
List.get(int index)
vs
Queue.peek()
.。换句话说,list是一种更通用的数据结构,可以模拟
Queue
。
现在能够模拟与拥有合同子集不同。也就是说,
Queue
不允许某些操作(索引)
List
并允许某些操作仅以特定方式完成(仅插入尾部并仅从头部移除)。所以
Queue
并没有真正对合同进行“补充”
List
。这正是为什么
Queue
不在
List
Java集合框架中扩展,而是扩展
Collection
接口。我认为这也是为什么任何一个类都不能实现两者的原因,因为
Queue
合同与合同冲突
List
(这就是为什么它们从
Collection
接口分开)。但是,
LinkedList
实现两个接口。
我也遇到了
这个
答案:
该
LinkedList
实施情况,以满足
Deque
合同,所以为什么不把它实现的接口?
我仍然不明白我们怎么说“
LinkedList
实施恰好满足
Deque
合同”。队列的概念不允许插入任意索引。因此,
Queue
界面没有这样的方法。
但是,我们只能通过接口强制执行合同,并且不能禁止某些方法的实现。作为列表(在其名称“列表”),我觉得这是不正确的有排队的方法
peek()
,
pop()
并
add(int index, E element)
在
LinkedList
。
我相信,相反,我们应该有一个单独的类
LinkedQueue
,它可以链接队列的实现,类似于
LinkedBlockingQueue
包含链接的实现
BlockingQueue
。
另请注意,这
LinkedList
是唯一一个继承自列表和队列系列的类,也就是说,没有其他类可以实现这两个类
List
和
Queue
(AFAIK)。这可以表明
LinkedList
做得不好吗?
我错了,不必要地思考?
写回答关注邀请回答
提问于 2018-10-22
2 个回答
热门排序
用户回答回答于 2018-10-22
完全忽略了
编程接口的重点
。
如果你需要
Queue
,你永远不会写:
LinkedList<String> queue = new LinkedList<>();
因为,你是对的,这将允许你使用非队列方法。相反,你编程到这样的界面:
Queue<String> queue = new LinkedList<>();
现在您只能访问6
Queue
种方法(以及所有
Collection
方法)。因此,即使
LinkedList
实现了更多方法,您也无法再访问它们。
因此,如果您需要队列,则选择最适合您所需的性能,存储和访问特性的接口
实现
Queue
,例如
-
LinkedList
使用更多内存,但在清空队列时收缩。 -
ArrayDeque
使用较少的内存,但它不会缩小。 -
PriorityQueue
是一个具有元素优先级的非FIFO队列。 -
ConcurrentLinkedQueue
,
ConcurrentLinkedDeque
支持多线程并发访问。 -
和更多…
我从来没有被教过队列可以是一个列表,或者更确切地说队列可以像列表一样。
请记住,
implements
定义一种
行为类似的
关系。一个
LinkedList
行为就像
一个
List
。一个
LinkedList
行为就像
一个
Deque
。一个
LinkedList
行为就像
一个
Queue
。
但仅仅因为
LinkedList
表现得像所有这些,并不意味着
List
表现得像
一个
Queue
或
Queue
表现得像
一个
List
。他们不。
该
样的行为
关系唯一无二的一种方式