2012-03-23 59 views
9

我总是会学习何时声明一个我们应该做的集合,如果我想用例如一个LinkedList,我会做List ob = new LinkedList(),但是我不能访问LinkedList中的所有方法..是不是LinkedList ob = new LinkedList() 100%正确?在Java中声明一个LinkedList

+1

LinkedList的OB =新的LinkedList(),创建对象这种方式只是要使用LinkedList类,没有错..再次它取决于你从实现想要的东西。 – 2012-03-23 18:15:56

+1

取决于你想要达到的目标,检查了这一点:检查你的答案] [1]这里http://stackoverflow.com/questions/2451849/polymorphic-call – 2012-03-23 18:13:56

+0

好Q,马尔西奥。 刚才我碰到,我想利用'addfirst仅(E E)'和'addlast仅(E E)'的情况下,也没有找到那些'List'接口。 – Vikram 2013-11-16 22:55:40

回答

10

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

嗯,我会建议使用通用的形式,但肯定的 - 如果你想使用的功能是具体LinkedList,需要相应声明变量。

您可能想要检查Deque<E>Queue<E>接口是否具有您想要的。如果他们这样做,那么使用那些描述你需要什么的想法,而不是使用什么实现。

+3

实际上没有任何方法_specific_ to'LinkedList';一切都会覆盖一个超类方法(比如'clone()')或者实现一个接口的方法。如果你想使用'Deque'(例如,'peek()')指定的方法以及'List'指定的方法(例如'indexOf()'),但是两者都没有指定,那么没有太多选择声明变量为'LinkedList'。 – 2012-03-23 18:07:04

5

是,

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

是完全正确的,如果你知道items将取决于没有在List<T>接口捕获的LinkedList<T>方法。

1

不完全正确。

声明任何集合的首选方法是包含它所持有的数据类型。所以,举个例子,它会是LinkedList<Integer> ob = new LinkedList<Integer>();

3

规则“总是编码到接口”必须具有一定的灵活性。你提出的建议是好的,当你得出结论时,唯一的选择。作为一个附注,编码到像这样的具体类更快是大多数JVMs。决定演出是否值得打破这一规则是很难决定的。

+2

你有一些数据来支持这个说法吗?这是我第一次听说接口编码可能比具体类慢。 – 2012-03-23 18:05:45

+0

@krzyk - 你自己来测试它并不难。对list.get()这样的方法的调用,在声明列表''的时候比声明为'ArrayList '的时候明显慢一些(如果你做得足够多的话)。 (为了测试'get()',我不会使用'LinkedList')。在一个简单的测试中,我使用Java 6运行,它使用'get()'访问每个数组元素,泛型调用花费了大约10%更多用于1,000个元素,10,000个元素大约多18%。 – 2012-03-23 18:44:37

+0

http://developer.android.com/guide/practices/design/performance.html#myths。为了公平起见,这个声明涉及没有JIT的JVM。 – 2012-03-23 18:57:20

3

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

如果您发现List没有给您需要的东西,那么您可能正在对Queue接口进行编程。

2

LinkedList是一个通用的。你应该做的事:

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

(或任何其他你需要有存储,而不是字符串中)

4

你应该总是尽量保持在最高水平可能的声明,这意味着你应该停在最高级别,提供您需要的所有功能:如果List方法不够用,您完全可以使用LinkedList声明。

-2

其实它会更好,如果它参数化,因为两者都是原始类型。

1

都能跟得上。这是错误的,在后期阶段,如果他想从链表他实现更改为任何其他实施名单式的,他就一定会出问题。所以最好使用界面级别宣言。

0

我不会总是建议你使用泛型..... 堂妹有时你可能需要换不同的对象为这里....

  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; 
      . 
      . 
      . 
     } 

现在某处u需要传递的对象.... 你可以做以下....

   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...... 
0

你仍然可以访问LinkedList的方法,通过使用列表中,你所要做的就是类型转换 例如

((LinkedList)ob).add() 

使用泛型列表,而不是点LinkedList的是,因为万一你只需改变你使用列表的类型(假设双向链表)您的程序仍然可以工作泛型是简化您的代码,使其更便携,更“易变”