草庐IT

java - Java 的集合接口(interface)和类层次结构做得不好吗?

coder 2023-08-28 原文

我开始知道在 Java 中,LinkedList class implements both Deque and List接口(interface)。 这让我有些困惑。

在计算机科学教学大纲中,从未有人教过我队列可以是一个列表,或者更准确地说,队列可以表现得像一个列表。也就是说,有些事情列表可以做,但队列不能。但是列表可以像队列一样工作。例如,List 接口(interface)有 the following methods :

add(E e)
add(int index, E element)

但是队列 has only the following :

add(E e)

很明显 Queue 不允许在特定索引处插入,这在 List 中是允许的。其他操作也是如此,例如 Queue.remove()List.remove(int index)List.get(int index)Queue.peek()。 换句话说,列表是一种更通用的数据结构,可以模拟Queue

现在能够模拟不同于拥有合约子集。也就是说,Queue 不允许 List 的某些操作(索引),并且只允许以特定方式完成某些操作(仅在尾部插入,仅从头部删除)。所以 Queue 并没有真正对 List 的契约进行“添加”。这就是为什么 Queue 没有扩展 Java 集合框架中的 List,而是都扩展了 Collection 接口(interface)。我相信这也是为什么任何类同时实现两者都是不正确的,因为 Queue 的契约(Contract)与 List 的契约(Contract)冲突(这就是为什么他们从 Collection接口(interface)分开)。但是,LinkedList 实现了这两个接口(interface)。

我也遇到了this回答:

The LinkedList implementation happens to satisfy the Deque contract, so why not make it implement the interface?

我仍然不明白我们怎么能说“LinkedList 实现恰好满足 Deque 契约”。队列的概念不允许在任意索引处插入。因此,Queue 接口(interface)没有这样的方法。

然而,我们只能通过接口(interface)执行契约,不能禁止某些方法的实现。作为列表(名称中有“List”),我觉得使用队列方法 peek()pop()add(int index , E 元素)LinkedList 中。

我相信,相反,我们应该有单独的类 LinkedQueue,它可以有队列的链接实现,类似于 LinkedBlockingQueue,它包含 BlockingQueue 的链接实现>。

另请注意,LinkedList 是唯一继承自列表和队列系列的类,也就是说,没有其他类同时实现了 List队列(AFAIK)。这是否表明 LinkedList 有问题?

我是不是完全错了,是不是多虑了?

最佳答案

您完全忽略了 programming to interface 的要点.

如果你需要一个Queue,你永远不会写:

LinkedList<String> queue = new LinkedList<>();

因为,您是对的,这将允许您使用非队列方法。相反,您可以像这样对接口(interface)进行编程:

Queue<String> queue = new LinkedList<>();

现在您只能访问 6 Queue方法(以及所有 Collection 方法)。所以,即使LinkedList实现了更多方法,您将无法再访问它们。

因此,如果您需要一个队列,您可以选择最适合您所需的性能、存储和访问特性的 Queue 接口(interface)的实现,例如


I was never taught that queue can be a list, or more precisely queue can behave like a list.

请记住,implements 定义了一个behaves like 关系。 LinkedList 表现得像 ListLinkedList 表现得像 DequeLinkedList 表现得像 Queue

但是仅仅因为 LinkedList 表现得像所有这些,并不意味着 List 表现得像 Queue 或者 Queue 表现得像 List。他们没有。

表现得像关系只有一种方式。

关于java - Java 的集合接口(interface)和类层次结构做得不好吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52904106/

有关java - Java 的集合接口(interface)和类层次结构做得不好吗?的更多相关文章

  1. java - 等价于 Java 中的 Ruby Hash - 2

    我真的很习惯使用Ruby编写以下代码:my_hash={}my_hash['test']=1Java中对应的数据结构是什么? 最佳答案 HashMapmap=newHashMap();map.put("test",1);我假设? 关于java-等价于Java中的RubyHash,我们在StackOverflow上找到一个类似的问题: https://stackoverflow.com/questions/22737685/

  2. java - 从 JRuby 调用 Java 类的问题 - 2

    我正在尝试使用boilerpipe来自JRuby。我看过guide从JRuby调用Java,并成功地将它与另一个Java包一起使用,但无法弄清楚为什么同样的东西不能用于boilerpipe。我正在尝试基本上从JRuby中执行与此Java等效的操作:URLurl=newURL("http://www.example.com/some-location/index.html");Stringtext=ArticleExtractor.INSTANCE.getText(url);在JRuby中试过这个:require'java'url=java.net.URL.new("http://www

  3. ruby - 是否有用于序列化和反序列化各种格式的对象层次结构的模式? - 2

    给定一个复杂的对象层次结构,幸运的是它不包含循环引用,我如何实现支持各种格式的序列化?我不是来讨论实际实现的。相反,我正在寻找可能会派上用场的设计模式提示。更准确地说:我正在使用Ruby,我想解析XML和JSON数据以构建复杂的对象层次结构。此外,应该可以将该层次结构序列化为JSON、XML和可能的HTML。我可以为此使用Builder模式吗?在任何提到的情况下,我都有某种结构化数据-无论是在内存中还是文本中-我想用它来构建其他东西。我认为将序列化逻辑与实际业务逻辑分开会很好,这样我以后就可以轻松支持多种XML格式。 最佳答案 我最

  4. java - 我的模型类或其他类中应该有逻辑吗 - 2

    我只想对我一直在思考的这个问题有其他意见,例如我有classuser_controller和classuserclassUserattr_accessor:name,:usernameendclassUserController//dosomethingaboutanythingaboutusersend问题是我的User类中是否应该有逻辑user=User.newuser.do_something(user1)oritshouldbeuser_controller=UserController.newuser_controller.do_something(user1,user2)我

  5. java - 什么相当于 ruby​​ 的 rack 或 python 的 Java wsgi? - 2

    什么是ruby​​的rack或python的Java的wsgi?还有一个路由库。 最佳答案 来自Python标准PEP333:Bycontrast,althoughJavahasjustasmanywebapplicationframeworksavailable,Java's"servlet"APImakesitpossibleforapplicationswrittenwithanyJavawebapplicationframeworktoruninanywebserverthatsupportstheservletAPI.ht

  6. Observability:从零开始创建 Java 微服务并监控它 (二) - 2

    这篇文章是继上一篇文章“Observability:从零开始创建Java微服务并监控它(一)”的续篇。在上一篇文章中,我们讲述了如何创建一个Javaweb应用,并使用Filebeat来收集应用所生成的日志。在今天的文章中,我来详述如何收集应用的指标,使用APM来监控应用并监督web服务的在线情况。源码可以在地址 https://github.com/liu-xiao-guo/java_observability 进行下载。摄入指标指标被视为可以随时更改的时间点值。当前请求的数量可以改变任何毫秒。你可能有1000个请求的峰值,然后一切都回到一个请求。这也意味着这些指标可能不准确,你还想提取最小/

  7. 【Java 面试合集】HashMap中为什么引入红黑树,而不是AVL树呢 - 2

    HashMap中为什么引入红黑树,而不是AVL树呢1.概述开始学习这个知识点之前我们需要知道,在JDK1.8以及之前,针对HashMap有什么不同。JDK1.7的时候,HashMap的底层实现是数组+链表JDK1.8的时候,HashMap的底层实现是数组+链表+红黑树我们要思考一个问题,为什么要从链表转为红黑树呢。首先先让我们了解下链表有什么不好???2.链表上述的截图其实就是链表的结构,我们来看下链表的增删改查的时间复杂度增:因为链表不是线性结构,所以每次添加的时候,只需要移动一个节点,所以可以理解为复杂度是N(1)删:算法时间复杂度跟增保持一致查:既然是非线性结构,所以查询某一个节点的时候

  8. postman接口测试工具-基础使用教程 - 2

    1.postman介绍Postman一款非常流行的API调试工具。其实,开发人员用的更多。因为测试人员做接口测试会有更多选择,例如Jmeter、soapUI等。不过,对于开发过程中去调试接口,Postman确实足够的简单方便,而且功能强大。2.下载安装官网地址:https://www.postman.com/下载完成后双击安装吧,安装过程极其简单,无需任何操作3.使用教程这里以百度为例,工具使用简单,填写URL地址即可发送请求,在下方查看响应结果和响应状态码常用方法都有支持请求方法:getpostputdeleteGet、Post、Put与Delete的作用get:请求方法一般是用于数据查询,

  9. postman——集合——执行集合——测试脚本——pm对象简单示例02 - 2

    //1.验证返回状态码是否是200pm.test("Statuscodeis200",function(){pm.response.to.have.status(200);});//2.验证返回body内是否含有某个值pm.test("Bodymatchesstring",function(){pm.expect(pm.response.text()).to.include("string_you_want_to_search");});//3.验证某个返回值是否是100pm.test("Yourtestname",function(){varjsonData=pm.response.json

  10. 【Java入门】使用Java实现文件夹的遍历 - 2

    遍历文件夹我们通常是使用递归进行操作,这种方式比较简单,也比较容易理解。本文为大家介绍另一种不使用递归的方式,由于没有使用递归,只用到了循环和集合,所以效率更高一些!一、使用递归遍历文件夹整体思路1、使用File封装初始目录,2、打印这个目录3、获取这个目录下所有的子文件和子目录的数组。4、遍历这个数组,取出每个File对象4-1、如果File是否是一个文件,打印4-2、否则就是一个目录,递归调用代码实现publicclassSearchFile{publicstaticvoidmain(String[]args){//初始目录Filedir=newFile("d:/Dev");Datebeg

随机推荐