在Java中声明LinkedList

我总是学习当我们声明我们应该做的集合时, Interface ob = new Class() ,如果我想使用例如LinkedList我会做List ob = new LinkedList() ,但是我无法访问来自LinkedList的所有方法..是不是LinkedList ob = new LinkedList() 100%正确吗?

是不是LinkedList ob = new LinkedList()100%正确吗?

好吧,我建议使用通用表单,但可以肯定 – 如果你想使用特定LinkedList ,你需要相应地声明变量。

您可能想要检查DequeQueue接口是否具有您想要的function。 如果他们这样做,请使用那些与描述您需要的内容相符的内容,而不是您将使用的实现。

是,

 LinkedList<...> items = new LinkedList<...>(); 

如果您知道items将取决于LinkedList中未在List界面中捕获的方法,则完全正确。

您应该始终尽可能地将声明保持在最高级别,这意味着您应该停留在提供所需function的最高级别:如果List方法不够,您对LinkedList声明完全没问题。

必须灵活地采用“始终对接口进行编码”的规则。 你的建议是好的,当你得出结论时,唯一的选择。

作为旁注,对大多数JVM来说,编写像这样的具体类更快。 决定表现是否值得打破规则是很难决定的。

如果您确实需要使用List接口上没有的方法,那么使用LinkedList的API肯定没有问题。 对List接口进行编程的一般规则认识到:1)很少需要这些方法,2)在大多数人的经验中,我更有可能发现我需要对列表进行排序和/或使用大量随机访问,并决定切换到ArrayList,比我需要的只有LinkedList的方法之一。

如果您发现List没有为您提供所需内容,那么您可能也可以编程到Queue界面。

LinkedList是通用的。 你应该这样做:

 LinkedList linkedList = new LinkedList(); 

(或者你需要在那里存储的任何其他东西而不是String)

不完全是100%正确。

声明任何集合的首选方法是包含它所持有的数据类型。 因此,对于您的示例,它是LinkedList ob = new LinkedList();

没有..这是错误的,如果他想要将他的实现从链表改为列表类型的任何其他实现,他将会出错……在后期阶段是错误的……所以最好使用接口级别声明。

我不会总是建议你使用generics…..有时你可能需要包装不同的对象….

  String str="a string"; boolean status=false; LinkedList ll = new LinkedList(); ll.add(str); ll.add(status); 

在某些情况下,例如RMI,你只能发送序列化数据…..并假设你想发送一个类对象(它是非序列化的)…….你可以包装类的成员(在LinkedList中并将该对象作为一个整体传递…….不要担心大量的参数……考虑例如:

  public Class DataHouse { public int a; public String str; . . . } 

现在某处你需要传递物品….你可以做以下……

  DataHouse dh =new DataHouse(); LinkedList ll = new LinkedList(); ll.add(dh.a); ll.add(dh.str); // Now the content is serialized and can pass it as a capsuled data...... 

你仍然可以使用List访问LinkedList方法,你所要做的就是输入cast作为例子

 ((LinkedList)ob).add() 

使用通用List而不是LinkedList的重点是因为如果你只是改变你正在使用的列表类型(比如说双链表)你的程序仍然可以工作Generics是为了简化你的代码,使其更加便携,更“可变”

实际上,如果它们被参数化会更好,因为它们都是原始类型。